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