code.gitea.io/gitea@v1.22.3/modules/git/repo_tag_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package git 5 6 import ( 7 "path/filepath" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestRepository_GetTags(t *testing.T) { 15 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") 16 bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path) 17 if err != nil { 18 assert.NoError(t, err) 19 return 20 } 21 defer bareRepo1.Close() 22 23 tags, total, err := bareRepo1.GetTagInfos(0, 0) 24 if err != nil { 25 assert.NoError(t, err) 26 return 27 } 28 assert.Len(t, tags, 2) 29 assert.Len(t, tags, total) 30 assert.EqualValues(t, "signed-tag", tags[0].Name) 31 assert.EqualValues(t, "36f97d9a96457e2bab511db30fe2db03893ebc64", tags[0].ID.String()) 32 assert.EqualValues(t, "tag", tags[0].Type) 33 assert.EqualValues(t, "test", tags[1].Name) 34 assert.EqualValues(t, "3ad28a9149a2864384548f3d17ed7f38014c9e8a", tags[1].ID.String()) 35 assert.EqualValues(t, "tag", tags[1].Type) 36 } 37 38 func TestRepository_GetTag(t *testing.T) { 39 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") 40 41 clonedPath, err := cloneRepo(t, bareRepo1Path) 42 if err != nil { 43 assert.NoError(t, err) 44 return 45 } 46 47 bareRepo1, err := openRepositoryWithDefaultContext(clonedPath) 48 if err != nil { 49 assert.NoError(t, err) 50 return 51 } 52 defer bareRepo1.Close() 53 54 // LIGHTWEIGHT TAGS 55 lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1" 56 lTagName := "lightweightTag" 57 58 // Create the lightweight tag 59 err = bareRepo1.CreateTag(lTagName, lTagCommitID) 60 if err != nil { 61 assert.NoError(t, err, "Unable to create the lightweight tag: %s for ID: %s. Error: %v", lTagName, lTagCommitID, err) 62 return 63 } 64 65 // and try to get the Tag for lightweight tag 66 lTag, err := bareRepo1.GetTag(lTagName) 67 if err != nil { 68 assert.NoError(t, err) 69 return 70 } 71 if lTag == nil { 72 assert.NotNil(t, lTag) 73 assert.FailNow(t, "nil lTag: %s", lTagName) 74 } 75 assert.EqualValues(t, lTagName, lTag.Name) 76 assert.EqualValues(t, lTagCommitID, lTag.ID.String()) 77 assert.EqualValues(t, lTagCommitID, lTag.Object.String()) 78 assert.EqualValues(t, "commit", lTag.Type) 79 80 // ANNOTATED TAGS 81 aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" 82 aTagName := "annotatedTag" 83 aTagMessage := "my annotated message \n - test two line" 84 85 // Create the annotated tag 86 err = bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID) 87 if err != nil { 88 assert.NoError(t, err, "Unable to create the annotated tag: %s for ID: %s. Error: %v", aTagName, aTagCommitID, err) 89 return 90 } 91 92 // Now try to get the tag for the annotated Tag 93 aTagID, err := bareRepo1.GetTagID(aTagName) 94 if err != nil { 95 assert.NoError(t, err) 96 return 97 } 98 99 aTag, err := bareRepo1.GetTag(aTagName) 100 if err != nil { 101 assert.NoError(t, err) 102 return 103 } 104 if aTag == nil { 105 assert.NotNil(t, aTag) 106 assert.FailNow(t, "nil aTag: %s", aTagName) 107 } 108 assert.EqualValues(t, aTagName, aTag.Name) 109 assert.EqualValues(t, aTagID, aTag.ID.String()) 110 assert.NotEqual(t, aTagID, aTag.Object.String()) 111 assert.EqualValues(t, aTagCommitID, aTag.Object.String()) 112 assert.EqualValues(t, "tag", aTag.Type) 113 114 // RELEASE TAGS 115 116 rTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" 117 rTagName := "release/" + lTagName 118 119 err = bareRepo1.CreateTag(rTagName, rTagCommitID) 120 if err != nil { 121 assert.NoError(t, err, "Unable to create the tag: %s for ID: %s. Error: %v", rTagName, rTagCommitID, err) 122 return 123 } 124 125 rTagID, err := bareRepo1.GetTagID(rTagName) 126 if err != nil { 127 assert.NoError(t, err) 128 return 129 } 130 assert.EqualValues(t, rTagCommitID, rTagID) 131 132 oTagID, err := bareRepo1.GetTagID(lTagName) 133 if err != nil { 134 assert.NoError(t, err) 135 return 136 } 137 assert.EqualValues(t, lTagCommitID, oTagID) 138 } 139 140 func TestRepository_GetAnnotatedTag(t *testing.T) { 141 bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") 142 143 clonedPath, err := cloneRepo(t, bareRepo1Path) 144 if err != nil { 145 assert.NoError(t, err) 146 return 147 } 148 149 bareRepo1, err := openRepositoryWithDefaultContext(clonedPath) 150 if err != nil { 151 assert.NoError(t, err) 152 return 153 } 154 defer bareRepo1.Close() 155 156 lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1" 157 lTagName := "lightweightTag" 158 bareRepo1.CreateTag(lTagName, lTagCommitID) 159 160 aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" 161 aTagName := "annotatedTag" 162 aTagMessage := "my annotated message" 163 bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID) 164 aTagID, _ := bareRepo1.GetTagID(aTagName) 165 166 // Try an annotated tag 167 tag, err := bareRepo1.GetAnnotatedTag(aTagID) 168 if err != nil { 169 assert.NoError(t, err) 170 return 171 } 172 assert.NotNil(t, tag) 173 assert.EqualValues(t, aTagName, tag.Name) 174 assert.EqualValues(t, aTagID, tag.ID.String()) 175 assert.EqualValues(t, "tag", tag.Type) 176 177 // Annotated tag's Commit ID should fail 178 tag2, err := bareRepo1.GetAnnotatedTag(aTagCommitID) 179 assert.Error(t, err) 180 assert.True(t, IsErrNotExist(err)) 181 assert.Nil(t, tag2) 182 183 // Annotated tag's name should fail 184 tag3, err := bareRepo1.GetAnnotatedTag(aTagName) 185 assert.Error(t, err) 186 assert.Errorf(t, err, "Length must be 40: %d", len(aTagName)) 187 assert.Nil(t, tag3) 188 189 // Lightweight Tag should fail 190 tag4, err := bareRepo1.GetAnnotatedTag(lTagCommitID) 191 assert.Error(t, err) 192 assert.True(t, IsErrNotExist(err)) 193 assert.Nil(t, tag4) 194 } 195 196 func TestRepository_parseTagRef(t *testing.T) { 197 tests := []struct { 198 name string 199 200 givenRef map[string]string 201 202 want *Tag 203 wantErr bool 204 expectedErr error 205 }{ 206 { 207 name: "lightweight tag", 208 209 givenRef: map[string]string{ 210 "objecttype": "commit", 211 "refname:lstrip=2": "v1.9.1", 212 // object will be empty for lightweight tags 213 "object": "", 214 "objectname": "ab23e4b7f4cd0caafe0174c0e7ef6d651ba72889", 215 "creator": "Foo Bar <foo@bar.com> 1565789218 +0300", 216 "contents": `Add changelog of v1.9.1 (#7859) 217 218 * add changelog of v1.9.1 219 * Update CHANGELOG.md 220 `, 221 "contents:signature": "", 222 }, 223 224 want: &Tag{ 225 Name: "v1.9.1", 226 ID: MustIDFromString("ab23e4b7f4cd0caafe0174c0e7ef6d651ba72889"), 227 Object: MustIDFromString("ab23e4b7f4cd0caafe0174c0e7ef6d651ba72889"), 228 Type: "commit", 229 Tagger: parseSignatureFromCommitLine("Foo Bar <foo@bar.com> 1565789218 +0300"), 230 Message: "Add changelog of v1.9.1 (#7859)\n\n* add changelog of v1.9.1\n* Update CHANGELOG.md\n", 231 Signature: nil, 232 }, 233 }, 234 235 { 236 name: "annotated tag", 237 238 givenRef: map[string]string{ 239 "objecttype": "tag", 240 "refname:lstrip=2": "v0.0.1", 241 // object will refer to commit hash for annotated tag 242 "object": "3325fd8a973321fd59455492976c042dde3fd1ca", 243 "objectname": "8c68a1f06fc59c655b7e3905b159d761e91c53c9", 244 "creator": "Foo Bar <foo@bar.com> 1565789218 +0300", 245 "contents": `Add changelog of v1.9.1 (#7859) 246 247 * add changelog of v1.9.1 248 * Update CHANGELOG.md 249 `, 250 "contents:signature": "", 251 }, 252 253 want: &Tag{ 254 Name: "v0.0.1", 255 ID: MustIDFromString("8c68a1f06fc59c655b7e3905b159d761e91c53c9"), 256 Object: MustIDFromString("3325fd8a973321fd59455492976c042dde3fd1ca"), 257 Type: "tag", 258 Tagger: parseSignatureFromCommitLine("Foo Bar <foo@bar.com> 1565789218 +0300"), 259 Message: "Add changelog of v1.9.1 (#7859)\n\n* add changelog of v1.9.1\n* Update CHANGELOG.md\n", 260 Signature: nil, 261 }, 262 }, 263 264 { 265 name: "annotated tag with signature", 266 267 givenRef: map[string]string{ 268 "objecttype": "tag", 269 "refname:lstrip=2": "v0.0.1", 270 "object": "3325fd8a973321fd59455492976c042dde3fd1ca", 271 "objectname": "8c68a1f06fc59c655b7e3905b159d761e91c53c9", 272 "creator": "Foo Bar <foo@bar.com> 1565789218 +0300", 273 "contents": `Add changelog of v1.9.1 (#7859) 274 275 * add changelog of v1.9.1 276 * Update CHANGELOG.md 277 -----BEGIN PGP SIGNATURE----- 278 279 aBCGzBAABCgAdFiEEyWRwv/q1Q6IjSv+D4IPOwzt33PoFAmI8jbIACgkQ4IPOwzt3 280 3PoRuAv9FVSbPBXvzECubls9KQd7urwEvcfG20Uf79iBwifQJUv+egNQojrs6APT 281 T4CdIXeGRpwJZaGTUX9RWnoDO1SLXAWnc82CypWraNwrHq8Go2YeoVu0Iy3vb0EU 282 REdob/tXYZecMuP8AjhUR0XfdYaERYAvJ2dYsH/UkFrqDjM3V4kPXWG+R5DCaZiE 283 slB5U01i4Dwb/zm/ckzhUGEcOgcnpOKX8SnY5kYRVDY47dl/yJZ1u2XWir3mu60G 284 1geIitH7StBddHi/8rz+sJwTfcVaLjn2p59p/Dr9aGbk17GIaKq1j0pZA2lKT0Xt 285 f9jDqU+9vCxnKgjSDhrwN69LF2jT47ZFjEMGV/wFPOa1EBxVWpgQ/CfEolBlbUqx 286 yVpbxi/6AOK2lmG130e9jEZJcu+WeZUeq851WgKSEkf2d5f/JpwtSTEOlOedu6V6 287 kl845zu5oE2nKM4zMQ7XrYQn538I31ps+VGQ0H8R07WrZP8WKUWugL2cU8KmXFwg 288 qbHDASXl 289 =2yGi 290 -----END PGP SIGNATURE----- 291 292 `, 293 "contents:signature": `-----BEGIN PGP SIGNATURE----- 294 295 aBCGzBAABCgAdFiEEyWRwv/q1Q6IjSv+D4IPOwzt33PoFAmI8jbIACgkQ4IPOwzt3 296 3PoRuAv9FVSbPBXvzECubls9KQd7urwEvcfG20Uf79iBwifQJUv+egNQojrs6APT 297 T4CdIXeGRpwJZaGTUX9RWnoDO1SLXAWnc82CypWraNwrHq8Go2YeoVu0Iy3vb0EU 298 REdob/tXYZecMuP8AjhUR0XfdYaERYAvJ2dYsH/UkFrqDjM3V4kPXWG+R5DCaZiE 299 slB5U01i4Dwb/zm/ckzhUGEcOgcnpOKX8SnY5kYRVDY47dl/yJZ1u2XWir3mu60G 300 1geIitH7StBddHi/8rz+sJwTfcVaLjn2p59p/Dr9aGbk17GIaKq1j0pZA2lKT0Xt 301 f9jDqU+9vCxnKgjSDhrwN69LF2jT47ZFjEMGV/wFPOa1EBxVWpgQ/CfEolBlbUqx 302 yVpbxi/6AOK2lmG130e9jEZJcu+WeZUeq851WgKSEkf2d5f/JpwtSTEOlOedu6V6 303 kl845zu5oE2nKM4zMQ7XrYQn538I31ps+VGQ0H8R07WrZP8WKUWugL2cU8KmXFwg 304 qbHDASXl 305 =2yGi 306 -----END PGP SIGNATURE----- 307 308 `, 309 }, 310 311 want: &Tag{ 312 Name: "v0.0.1", 313 ID: MustIDFromString("8c68a1f06fc59c655b7e3905b159d761e91c53c9"), 314 Object: MustIDFromString("3325fd8a973321fd59455492976c042dde3fd1ca"), 315 Type: "tag", 316 Tagger: parseSignatureFromCommitLine("Foo Bar <foo@bar.com> 1565789218 +0300"), 317 Message: "Add changelog of v1.9.1 (#7859)\n\n* add changelog of v1.9.1\n* Update CHANGELOG.md", 318 Signature: &CommitSignature{ 319 Signature: `-----BEGIN PGP SIGNATURE----- 320 321 aBCGzBAABCgAdFiEEyWRwv/q1Q6IjSv+D4IPOwzt33PoFAmI8jbIACgkQ4IPOwzt3 322 3PoRuAv9FVSbPBXvzECubls9KQd7urwEvcfG20Uf79iBwifQJUv+egNQojrs6APT 323 T4CdIXeGRpwJZaGTUX9RWnoDO1SLXAWnc82CypWraNwrHq8Go2YeoVu0Iy3vb0EU 324 REdob/tXYZecMuP8AjhUR0XfdYaERYAvJ2dYsH/UkFrqDjM3V4kPXWG+R5DCaZiE 325 slB5U01i4Dwb/zm/ckzhUGEcOgcnpOKX8SnY5kYRVDY47dl/yJZ1u2XWir3mu60G 326 1geIitH7StBddHi/8rz+sJwTfcVaLjn2p59p/Dr9aGbk17GIaKq1j0pZA2lKT0Xt 327 f9jDqU+9vCxnKgjSDhrwN69LF2jT47ZFjEMGV/wFPOa1EBxVWpgQ/CfEolBlbUqx 328 yVpbxi/6AOK2lmG130e9jEZJcu+WeZUeq851WgKSEkf2d5f/JpwtSTEOlOedu6V6 329 kl845zu5oE2nKM4zMQ7XrYQn538I31ps+VGQ0H8R07WrZP8WKUWugL2cU8KmXFwg 330 qbHDASXl 331 =2yGi 332 -----END PGP SIGNATURE----- 333 334 `, 335 Payload: `object 3325fd8a973321fd59455492976c042dde3fd1ca 336 type commit 337 tag v0.0.1 338 tagger Foo Bar <foo@bar.com> 1565789218 +0300 339 340 Add changelog of v1.9.1 (#7859) 341 342 * add changelog of v1.9.1 343 * Update CHANGELOG.md 344 `, 345 }, 346 }, 347 }, 348 } 349 350 for _, test := range tests { 351 tc := test // don't close over loop variable 352 t.Run(tc.name, func(t *testing.T) { 353 got, err := parseTagRef(tc.givenRef) 354 355 if tc.wantErr { 356 require.Error(t, err) 357 require.ErrorIs(t, err, tc.expectedErr) 358 } else { 359 require.NoError(t, err) 360 require.Equal(t, tc.want, got) 361 } 362 }) 363 } 364 }