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