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