1package transactional
2
3import (
4	"github.com/go-git/go-git/v5/plumbing"
5	"github.com/go-git/go-git/v5/storage/memory"
6
7	. "gopkg.in/check.v1"
8)
9
10var _ = Suite(&ReferenceSuite{})
11
12type ReferenceSuite struct{}
13
14func (s *ReferenceSuite) TestReference(c *C) {
15	base := memory.NewStorage()
16	temporal := memory.NewStorage()
17
18	rs := NewReferenceStorage(base, temporal)
19
20	refA := plumbing.NewReferenceFromStrings("refs/a", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
21	refB := plumbing.NewReferenceFromStrings("refs/b", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
22
23	err := base.SetReference(refA)
24	c.Assert(err, IsNil)
25
26	err = rs.SetReference(refB)
27	c.Assert(err, IsNil)
28
29	_, err = rs.Reference("refs/a")
30	c.Assert(err, IsNil)
31
32	_, err = rs.Reference("refs/b")
33	c.Assert(err, IsNil)
34
35	_, err = base.Reference("refs/b")
36	c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
37}
38
39func (s *ReferenceSuite) TestRemoveReferenceTemporal(c *C) {
40	base := memory.NewStorage()
41	temporal := memory.NewStorage()
42
43	ref := plumbing.NewReferenceFromStrings("refs/a", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
44
45	rs := NewReferenceStorage(base, temporal)
46	err := rs.SetReference(ref)
47	c.Assert(err, IsNil)
48
49	err = rs.RemoveReference("refs/a")
50	c.Assert(err, IsNil)
51
52	_, err = rs.Reference("refs/a")
53	c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
54}
55
56func (s *ReferenceSuite) TestRemoveReferenceBase(c *C) {
57	base := memory.NewStorage()
58	temporal := memory.NewStorage()
59
60	ref := plumbing.NewReferenceFromStrings("refs/a", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
61
62	rs := NewReferenceStorage(base, temporal)
63	err := base.SetReference(ref)
64	c.Assert(err, IsNil)
65
66	err = rs.RemoveReference("refs/a")
67	c.Assert(err, IsNil)
68
69	_, err = rs.Reference("refs/a")
70	c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
71}
72
73func (s *ReferenceSuite) TestCheckAndSetReferenceInBase(c *C) {
74	base := memory.NewStorage()
75	temporal := memory.NewStorage()
76	rs := NewReferenceStorage(base, temporal)
77
78	err := base.SetReference(
79		plumbing.NewReferenceFromStrings("foo", "482e0eada5de4039e6f216b45b3c9b683b83bfa"),
80	)
81	c.Assert(err, IsNil)
82
83	err = rs.CheckAndSetReference(
84		plumbing.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"),
85		plumbing.NewReferenceFromStrings("foo", "482e0eada5de4039e6f216b45b3c9b683b83bfa"),
86	)
87	c.Assert(err, IsNil)
88
89	e, err := rs.Reference(plumbing.ReferenceName("foo"))
90	c.Assert(err, IsNil)
91	c.Assert(e.Hash().String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
92}
93
94func (s *ReferenceSuite) TestCommit(c *C) {
95	base := memory.NewStorage()
96	temporal := memory.NewStorage()
97
98	refA := plumbing.NewReferenceFromStrings("refs/a", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
99	refB := plumbing.NewReferenceFromStrings("refs/b", "b66c08ba28aa1f81eb06a1127aa3936ff77e5e2c")
100	refC := plumbing.NewReferenceFromStrings("refs/c", "c3f4688a08fd86f1bf8e055724c84b7a40a09733")
101
102	rs := NewReferenceStorage(base, temporal)
103	c.Assert(rs.SetReference(refA), IsNil)
104	c.Assert(rs.SetReference(refB), IsNil)
105	c.Assert(rs.SetReference(refC), IsNil)
106
107	err := rs.Commit()
108	c.Assert(err, IsNil)
109
110	iter, err := base.IterReferences()
111	c.Assert(err, IsNil)
112
113	var count int
114	iter.ForEach(func(ref *plumbing.Reference) error {
115		count++
116		return nil
117	})
118
119	c.Assert(count, Equals, 3)
120}
121
122func (s *ReferenceSuite) TestCommitDelete(c *C) {
123	base := memory.NewStorage()
124	temporal := memory.NewStorage()
125
126	refA := plumbing.NewReferenceFromStrings("refs/a", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
127	refB := plumbing.NewReferenceFromStrings("refs/b", "b66c08ba28aa1f81eb06a1127aa3936ff77e5e2c")
128	refC := plumbing.NewReferenceFromStrings("refs/c", "c3f4688a08fd86f1bf8e055724c84b7a40a09733")
129
130	rs := NewReferenceStorage(base, temporal)
131	c.Assert(base.SetReference(refA), IsNil)
132	c.Assert(base.SetReference(refB), IsNil)
133	c.Assert(base.SetReference(refC), IsNil)
134
135	c.Assert(rs.RemoveReference(refA.Name()), IsNil)
136	c.Assert(rs.RemoveReference(refB.Name()), IsNil)
137	c.Assert(rs.RemoveReference(refC.Name()), IsNil)
138	c.Assert(rs.SetReference(refC), IsNil)
139
140	err := rs.Commit()
141	c.Assert(err, IsNil)
142
143	iter, err := base.IterReferences()
144	c.Assert(err, IsNil)
145
146	var count int
147	iter.ForEach(func(ref *plumbing.Reference) error {
148		count++
149		return nil
150	})
151
152	c.Assert(count, Equals, 1)
153
154	ref, err := rs.Reference(refC.Name())
155	c.Assert(err, IsNil)
156	c.Assert(ref.Hash().String(), Equals, "c3f4688a08fd86f1bf8e055724c84b7a40a09733")
157
158}
159