1package object 2 3import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "strings" 8 "time" 9 10 fixtures "github.com/go-git/go-git-fixtures/v4" 11 "github.com/go-git/go-git/v5/plumbing" 12 "github.com/go-git/go-git/v5/plumbing/cache" 13 "github.com/go-git/go-git/v5/storage/filesystem" 14 "github.com/go-git/go-git/v5/storage/memory" 15 16 . "gopkg.in/check.v1" 17) 18 19type TagSuite struct { 20 BaseObjectsSuite 21} 22 23var _ = Suite(&TagSuite{}) 24 25func (s *TagSuite) SetUpSuite(c *C) { 26 s.BaseObjectsSuite.SetUpSuite(c) 27 storer := filesystem.NewStorage(fixtures.ByURL("https://github.com/git-fixtures/tags.git").One().DotGit(), cache.NewObjectLRUDefault()) 28 s.Storer = storer 29} 30 31func (s *TagSuite) TestNameIDAndType(c *C) { 32 h := plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69") 33 tag := s.tag(c, h) 34 c.Assert(tag.Name, Equals, "annotated-tag") 35 c.Assert(h, Equals, tag.ID()) 36 c.Assert(plumbing.TagObject, Equals, tag.Type()) 37} 38 39func (s *TagSuite) TestTagger(c *C) { 40 tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69")) 41 c.Assert(tag.Tagger.String(), Equals, "Máximo Cuadros <mcuadros@gmail.com>") 42} 43 44func (s *TagSuite) TestAnnotated(c *C) { 45 tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69")) 46 c.Assert(tag.Message, Equals, "example annotated tag\n") 47 48 commit, err := tag.Commit() 49 c.Assert(err, IsNil) 50 c.Assert(commit.Type(), Equals, plumbing.CommitObject) 51 c.Assert(commit.ID().String(), Equals, "f7b877701fbf855b44c0a9e86f3fdce2c298b07f") 52} 53 54func (s *TagSuite) TestCommitError(c *C) { 55 tag := s.tag(c, plumbing.NewHash("fe6cb94756faa81e5ed9240f9191b833db5f40ae")) 56 57 commit, err := tag.Commit() 58 c.Assert(commit, IsNil) 59 c.Assert(err, NotNil) 60 c.Assert(err, Equals, ErrUnsupportedObject) 61} 62 63func (s *TagSuite) TestCommit(c *C) { 64 tag := s.tag(c, plumbing.NewHash("ad7897c0fb8e7d9a9ba41fa66072cf06095a6cfc")) 65 c.Assert(tag.Message, Equals, "a tagged commit\n") 66 67 commit, err := tag.Commit() 68 c.Assert(err, IsNil) 69 c.Assert(commit.Type(), Equals, plumbing.CommitObject) 70 c.Assert(commit.ID().String(), Equals, "f7b877701fbf855b44c0a9e86f3fdce2c298b07f") 71} 72 73func (s *TagSuite) TestBlobError(c *C) { 74 tag := s.tag(c, plumbing.NewHash("ad7897c0fb8e7d9a9ba41fa66072cf06095a6cfc")) 75 76 commit, err := tag.Blob() 77 c.Assert(commit, IsNil) 78 c.Assert(err, NotNil) 79 c.Assert(err, Equals, ErrUnsupportedObject) 80} 81 82func (s *TagSuite) TestBlob(c *C) { 83 tag := s.tag(c, plumbing.NewHash("fe6cb94756faa81e5ed9240f9191b833db5f40ae")) 84 c.Assert(tag.Message, Equals, "a tagged blob\n") 85 86 blob, err := tag.Blob() 87 c.Assert(err, IsNil) 88 c.Assert(blob.Type(), Equals, plumbing.BlobObject) 89 c.Assert(blob.ID().String(), Equals, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391") 90} 91 92func (s *TagSuite) TestTreeError(c *C) { 93 tag := s.tag(c, plumbing.NewHash("fe6cb94756faa81e5ed9240f9191b833db5f40ae")) 94 95 tree, err := tag.Tree() 96 c.Assert(tree, IsNil) 97 c.Assert(err, NotNil) 98 c.Assert(err, Equals, ErrUnsupportedObject) 99} 100 101func (s *TagSuite) TestTree(c *C) { 102 tag := s.tag(c, plumbing.NewHash("152175bf7e5580299fa1f0ba41ef6474cc043b70")) 103 c.Assert(tag.Message, Equals, "a tagged tree\n") 104 105 tree, err := tag.Tree() 106 c.Assert(err, IsNil) 107 c.Assert(tree.Type(), Equals, plumbing.TreeObject) 108 c.Assert(tree.ID().String(), Equals, "70846e9a10ef7b41064b40f07713d5b8b9a8fc73") 109} 110 111func (s *TagSuite) TestTreeFromCommit(c *C) { 112 tag := s.tag(c, plumbing.NewHash("ad7897c0fb8e7d9a9ba41fa66072cf06095a6cfc")) 113 c.Assert(tag.Message, Equals, "a tagged commit\n") 114 115 tree, err := tag.Tree() 116 c.Assert(err, IsNil) 117 c.Assert(tree.Type(), Equals, plumbing.TreeObject) 118 c.Assert(tree.ID().String(), Equals, "70846e9a10ef7b41064b40f07713d5b8b9a8fc73") 119} 120 121func (s *TagSuite) TestObject(c *C) { 122 tag := s.tag(c, plumbing.NewHash("ad7897c0fb8e7d9a9ba41fa66072cf06095a6cfc")) 123 124 obj, err := tag.Object() 125 c.Assert(err, IsNil) 126 c.Assert(obj.Type(), Equals, plumbing.CommitObject) 127 c.Assert(obj.ID().String(), Equals, "f7b877701fbf855b44c0a9e86f3fdce2c298b07f") 128} 129 130func (s *TagSuite) TestTagItter(c *C) { 131 iter, err := s.Storer.IterEncodedObjects(plumbing.TagObject) 132 c.Assert(err, IsNil) 133 134 var count int 135 i := NewTagIter(s.Storer, iter) 136 tag, err := i.Next() 137 c.Assert(err, IsNil) 138 c.Assert(tag, NotNil) 139 c.Assert(tag.Type(), Equals, plumbing.TagObject) 140 141 err = i.ForEach(func(t *Tag) error { 142 c.Assert(t, NotNil) 143 c.Assert(t.Type(), Equals, plumbing.TagObject) 144 count++ 145 146 return nil 147 }) 148 149 c.Assert(err, IsNil) 150 c.Assert(count, Equals, 3) 151 152 tag, err = i.Next() 153 c.Assert(err, Equals, io.EOF) 154 c.Assert(tag, IsNil) 155} 156 157func (s *TagSuite) TestTagIterError(c *C) { 158 iter, err := s.Storer.IterEncodedObjects(plumbing.TagObject) 159 c.Assert(err, IsNil) 160 161 randomErr := fmt.Errorf("a random error") 162 i := NewTagIter(s.Storer, iter) 163 err = i.ForEach(func(t *Tag) error { 164 return randomErr 165 }) 166 167 c.Assert(err, NotNil) 168 c.Assert(err, Equals, randomErr) 169} 170 171func (s *TagSuite) TestTagDecodeWrongType(c *C) { 172 newTag := &Tag{} 173 obj := &plumbing.MemoryObject{} 174 obj.SetType(plumbing.BlobObject) 175 err := newTag.Decode(obj) 176 c.Assert(err, Equals, ErrUnsupportedObject) 177} 178 179func (s *TagSuite) TestTagEncodeDecodeIdempotent(c *C) { 180 ts, err := time.Parse(time.RFC3339, "2006-01-02T15:04:05-07:00") 181 c.Assert(err, IsNil) 182 tags := []*Tag{ 183 { 184 Name: "foo", 185 Tagger: Signature{Name: "Foo", Email: "foo@example.local", When: ts}, 186 Message: "Message\n\nFoo\nBar\nBaz\n\n", 187 TargetType: plumbing.BlobObject, 188 Target: plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d"), 189 }, 190 { 191 Name: "foo", 192 Tagger: Signature{Name: "Foo", Email: "foo@example.local", When: ts}, 193 TargetType: plumbing.BlobObject, 194 Target: plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d"), 195 }, 196 } 197 for _, tag := range tags { 198 obj := &plumbing.MemoryObject{} 199 err = tag.Encode(obj) 200 c.Assert(err, IsNil) 201 newTag := &Tag{} 202 err = newTag.Decode(obj) 203 c.Assert(err, IsNil) 204 tag.Hash = obj.Hash() 205 c.Assert(newTag, DeepEquals, tag) 206 } 207} 208 209func (s *TagSuite) TestString(c *C) { 210 tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69")) 211 c.Assert(tag.String(), Equals, ""+ 212 "tag annotated-tag\n"+ 213 "Tagger: Máximo Cuadros <mcuadros@gmail.com>\n"+ 214 "Date: Wed Sep 21 21:13:35 2016 +0200\n"+ 215 "\n"+ 216 "example annotated tag\n"+ 217 "\n"+ 218 "commit f7b877701fbf855b44c0a9e86f3fdce2c298b07f\n"+ 219 "Author: Máximo Cuadros <mcuadros@gmail.com>\n"+ 220 "Date: Wed Sep 21 21:10:52 2016 +0200\n"+ 221 "\n"+ 222 " initial\n"+ 223 "\n", 224 ) 225 226 tag = s.tag(c, plumbing.NewHash("152175bf7e5580299fa1f0ba41ef6474cc043b70")) 227 c.Assert(tag.String(), Equals, ""+ 228 "tag tree-tag\n"+ 229 "Tagger: Máximo Cuadros <mcuadros@gmail.com>\n"+ 230 "Date: Wed Sep 21 21:17:56 2016 +0200\n"+ 231 "\n"+ 232 "a tagged tree\n"+ 233 "\n", 234 ) 235} 236 237func (s *TagSuite) TestStringNonCommit(c *C) { 238 store := memory.NewStorage() 239 240 target := &Tag{ 241 Target: plumbing.NewHash("TAGONE"), 242 Name: "TAG ONE", 243 Message: "tag one", 244 TargetType: plumbing.TagObject, 245 } 246 247 targetObj := &plumbing.MemoryObject{} 248 target.Encode(targetObj) 249 store.SetEncodedObject(targetObj) 250 251 tag := &Tag{ 252 Target: targetObj.Hash(), 253 Name: "TAG TWO", 254 Message: "tag two", 255 TargetType: plumbing.TagObject, 256 } 257 258 tagObj := &plumbing.MemoryObject{} 259 tag.Encode(tagObj) 260 store.SetEncodedObject(tagObj) 261 262 tag, err := GetTag(store, tagObj.Hash()) 263 c.Assert(err, IsNil) 264 265 c.Assert(tag.String(), Equals, 266 "tag TAG TWO\n"+ 267 "Tagger: <>\n"+ 268 "Date: Thu Jan 01 00:00:00 1970 +0000\n"+ 269 "\n"+ 270 "tag two\n") 271} 272 273func (s *TagSuite) TestLongTagNameSerialization(c *C) { 274 encoded := &plumbing.MemoryObject{} 275 decoded := &Tag{} 276 tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69")) 277 278 longName := "my tag: name " + strings.Repeat("test", 4096) + " OK" 279 tag.Name = longName 280 281 err := tag.Encode(encoded) 282 c.Assert(err, IsNil) 283 284 err = decoded.Decode(encoded) 285 c.Assert(err, IsNil) 286 c.Assert(decoded.Name, Equals, longName) 287} 288 289func (s *TagSuite) TestPGPSignatureSerialization(c *C) { 290 encoded := &plumbing.MemoryObject{} 291 decoded := &Tag{} 292 tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69")) 293 294 pgpsignature := `-----BEGIN PGP SIGNATURE----- 295 296iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut 297LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b 298hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm 299ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp 3008S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi 301RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk= 302=EFTF 303-----END PGP SIGNATURE----- 304` 305 tag.PGPSignature = pgpsignature 306 307 err := tag.Encode(encoded) 308 c.Assert(err, IsNil) 309 310 err = decoded.Decode(encoded) 311 c.Assert(err, IsNil) 312 c.Assert(decoded.PGPSignature, Equals, pgpsignature) 313} 314 315func (s *TagSuite) TestVerify(c *C) { 316 ts := time.Unix(1617403017, 0) 317 loc, _ := time.LoadLocation("UTC") 318 tag := &Tag{ 319 Name: "v0.2", 320 Tagger: Signature{Name: "go-git", Email: "go-git@example.com", When: ts.In(loc)}, 321 Message: `This is a signed tag 322`, 323 TargetType: plumbing.CommitObject, 324 Target: plumbing.NewHash("1eca38290a3131d0c90709496a9b2207a872631e"), 325 PGPSignature: ` 326-----BEGIN PGP SIGNATURE----- 327 328iHUEABYKAB0WIQTMqU0ycQ3f6g3PMoWMmmmF4LuV8QUCYGeciQAKCRCMmmmF4LuV 3298ZoDAP4j9msumYymfHgS3y7jpxPcSyiOMlXjipr2upspvXJ6ewD+K+OPC4pGW7Aq 3308UDK8r6qhaloxATcV/LUrvAW2yz4PwM= 331=PD+s 332-----END PGP SIGNATURE----- 333`, 334 } 335 336 armoredKeyRing := ` 337-----BEGIN PGP PUBLIC KEY BLOCK----- 338 339mDMEYGeSihYJKwYBBAHaRw8BAQdAIs9A3YD/EghhAOkHDkxlUkpqYrXUXebLfmmX 340+pdEK6C0D2dvLWdpdCB0ZXN0IGtleYiPBBMWCgA3FiEEzKlNMnEN3+oNzzKFjJpp 341heC7lfEFAmBnkooCGyMECwkIBwUVCgkICwUWAwIBAAIeAQIXgAAKCRCMmmmF4LuV 3428a3jAQCi4hSqjj6J3ch290FvQaYPGwR+EMQTMBG54t+NN6sDfgD/aZy41+0dnFKl 343qM/wLW5Wr9XvwH+1zXXbuSvfxasHowq4OARgZ5KKEgorBgEEAZdVAQUBAQdAXoQz 344VTYug16SisAoSrxFnOmxmFu6efYgCAwXu0ZuvzsDAQgHiHgEGBYKACAWIQTMqU0y 345cQ3f6g3PMoWMmmmF4LuV8QUCYGeSigIbDAAKCRCMmmmF4LuV8Q4QAQCKW5FnEdWW 346lHYKeByw3JugnlZ0U3V/R20bCwDglst5UQEAtkN2iZkHtkPly9xapsfNqnrt2gTt 347YIefGtzXfldDxg4= 348=Psht 349-----END PGP PUBLIC KEY BLOCK----- 350` 351 352 e, err := tag.Verify(armoredKeyRing) 353 c.Assert(err, IsNil) 354 355 _, ok := e.Identities["go-git test key"] 356 c.Assert(ok, Equals, true) 357} 358 359func (s *TagSuite) TestDecodeAndVerify(c *C) { 360 objectText := `object f6685df0aac4b5adf9eeb760e6d447145c5d0b56 361type commit 362tag v1.5 363tagger Máximo Cuadros <mcuadros@gmail.com> 1618566233 +0200 364 365signed tag 366-----BEGIN PGP SIGNATURE----- 367 368iQGzBAABCAAdFiEE/h5sbbqJFh9j1AdUSqtFFGopTmwFAmB5XFkACgkQSqtFFGop 369TmxvgAv+IPjX5WCLFUIMx8hquMZp1VkhQrseE7rljUYaYpga8gZ9s4kseTGhy7Un 37061U3Ro6cTPEiQF/FkAGzSdPuGqv0ARBqHDX2tUI9+Zs/K8aG8tN+JTaof0gBcTyI 371BLbZVYDTxbS9whxSDewQd0OvBG1m9ISLUhjXo6mbaVvrKXNXTHg40MPZ8ZxjR/vN 372hxXXoUVnFyEDo+v6nK56mYtapThDaQQHHzD6D3VaCq3Msog7qAh9/ZNBmgb88aQ3 373FoK8PHMyr5elsV3mE9bciZBUc+dtzjOvp94uQ5ZKUXaPusXaYXnKpVnzhyer6RBI 374gJLWtPwAinqmN41rGJ8jDAGrpPNjaRrMhGtbyVUPUf19OxuUIroe77sIIKTP0X2o 375Wgp56dYpTst0JcGv/FYCeau/4pTRDfwHAOcDiBQ/0ag9IrZp9P8P9zlKmzNPEraV 376pAe1/EFuhv2UDLucAiWM8iDZIcw8iN0OYMOGUmnk0WuGIo7dzLeqMGY+ND5n5Z8J 377sZC//k6m 378=VhHy 379-----END PGP SIGNATURE----- 380` 381 382 armoredKeyRing := ` 383-----BEGIN PGP PUBLIC KEY BLOCK----- 384 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 422=oYTT 423-----END PGP PUBLIC KEY BLOCK----- 424` 425 426 tagEncodedObject := &plumbing.MemoryObject{} 427 428 _, err := tagEncodedObject.Write([]byte(objectText)) 429 tagEncodedObject.SetType(plumbing.TagObject) 430 c.Assert(err, IsNil) 431 432 tag := &Tag{} 433 err = tag.Decode(tagEncodedObject) 434 c.Assert(err, IsNil) 435 436 _, err = tag.Verify(armoredKeyRing) 437 c.Assert(err, IsNil) 438} 439 440func (s *TagSuite) TestEncodeWithoutSignature(c *C) { 441 //Similar to TestString since no signature 442 encoded := &plumbing.MemoryObject{} 443 tag := s.tag(c, plumbing.NewHash("b742a2a9fa0afcfa9a6fad080980fbc26b007c69")) 444 err := tag.EncodeWithoutSignature(encoded) 445 c.Assert(err, IsNil) 446 er, err := encoded.Reader() 447 c.Assert(err, IsNil) 448 payload, err := ioutil.ReadAll(er) 449 c.Assert(err, IsNil) 450 451 c.Assert(string(payload), Equals, ""+ 452 "object f7b877701fbf855b44c0a9e86f3fdce2c298b07f\n"+ 453 "type commit\n"+ 454 "tag annotated-tag\n"+ 455 "tagger Máximo Cuadros <mcuadros@gmail.com> 1474485215 +0200\n"+ 456 "\n"+ 457 "example annotated tag\n", 458 ) 459} 460