@@ -67,32 +67,36 @@ func TestCheckoutBranch_Checkout(t *testing.T) {
6767 }
6868
6969 tests := []struct {
70- name string
71- branch string
72- filesCreated map [string ]string
73- expectedCommit string
74- expectedErr string
75- lastRevision string
70+ name string
71+ branch string
72+ filesCreated map [string ]string
73+ lastRevision string
74+ expectedCommit string
75+ expectedConcreteCommit bool
76+ expectedErr string
7677 }{
7778 {
78- name : "Default branch" ,
79- branch : "master" ,
80- filesCreated : map [string ]string {"branch" : "init" },
81- expectedCommit : firstCommit .String (),
79+ name : "Default branch" ,
80+ branch : "master" ,
81+ filesCreated : map [string ]string {"branch" : "init" },
82+ expectedCommit : firstCommit .String (),
83+ expectedConcreteCommit : true ,
8284 },
8385 {
84- name : "skip clone if LastRevision hasn't changed" ,
85- branch : "master" ,
86- filesCreated : map [string ]string {"branch" : "init" },
87- expectedErr : fmt .Sprintf ("no changes since last reconcilation: observed revision 'master/%s'" , firstCommit .String ()),
88- lastRevision : fmt .Sprintf ("master/%s" , firstCommit .String ()),
86+ name : "skip clone if LastRevision hasn't changed" ,
87+ branch : "master" ,
88+ filesCreated : map [string ]string {"branch" : "init" },
89+ lastRevision : fmt .Sprintf ("master/%s" , firstCommit .String ()),
90+ expectedCommit : firstCommit .String (),
91+ expectedConcreteCommit : false ,
8992 },
9093 {
91- name : "Other branch - revision has changed" ,
92- branch : "test" ,
93- filesCreated : map [string ]string {"branch" : "second" },
94- expectedCommit : secondCommit .String (),
95- lastRevision : fmt .Sprintf ("master/%s" , firstCommit .String ()),
94+ name : "Other branch - revision has changed" ,
95+ branch : "test" ,
96+ filesCreated : map [string ]string {"branch" : "second" },
97+ lastRevision : fmt .Sprintf ("master/%s" , firstCommit .String ()),
98+ expectedCommit : secondCommit .String (),
99+ expectedConcreteCommit : true ,
96100 },
97101 {
98102 name : "Non existing branch" ,
@@ -120,58 +124,64 @@ func TestCheckoutBranch_Checkout(t *testing.T) {
120124 }
121125 g .Expect (err ).ToNot (HaveOccurred ())
122126 g .Expect (cc .String ()).To (Equal (tt .branch + "/" + tt .expectedCommit ))
127+ g .Expect (git .IsConcreteCommit (* cc )).To (Equal (tt .expectedConcreteCommit ))
123128
124- for k , v := range tt .filesCreated {
125- g .Expect (filepath .Join (tmpDir , k )).To (BeARegularFile ())
126- g .Expect (os .ReadFile (filepath .Join (tmpDir , k ))).To (BeEquivalentTo (v ))
129+ if tt .expectedConcreteCommit {
130+ for k , v := range tt .filesCreated {
131+ g .Expect (filepath .Join (tmpDir , k )).To (BeARegularFile ())
132+ g .Expect (os .ReadFile (filepath .Join (tmpDir , k ))).To (BeEquivalentTo (v ))
133+ }
127134 }
128135 })
129136 }
130137}
131138
132139func TestCheckoutTag_Checkout (t * testing.T ) {
140+ type testTag struct {
141+ name string
142+ annotated bool
143+ }
144+
133145 tests := []struct {
134- name string
135- tag string
136- annotated bool
137- checkoutTag string
138- expectTag string
139- expectErr string
140- lastRev string
141- setLastRev bool
146+ name string
147+ tagsInRepo []testTag
148+ checkoutTag string
149+ lastRevTag string
150+ expectConcreteCommit bool
151+ expectErr string
142152 }{
143153 {
144- name : "Tag" ,
145- tag : "tag-1" ,
146- checkoutTag : "tag-1" ,
147- expectTag : "tag-1" ,
154+ name : "Tag" ,
155+ tagsInRepo : [] testTag {{ "tag-1" , false }} ,
156+ checkoutTag : "tag-1" ,
157+ expectConcreteCommit : true ,
148158 },
149159 {
150- name : "Skip Tag if last revision hasn't changed" ,
151- tag : "tag-2" ,
152- checkoutTag : "tag-2" ,
153- setLastRev : true ,
154- expectErr : "no changes since last reconcilation" ,
160+ name : "Annotated" ,
161+ tagsInRepo : []testTag {{"annotated" , true }},
162+ checkoutTag : "annotated" ,
163+ expectConcreteCommit : true ,
155164 },
156165 {
157- name : "Last revision changed " ,
158- tag : "tag-3" ,
159- checkoutTag : "tag-3" ,
160- expectTag : "tag-3 " ,
161- lastRev : "tag-3/<fake-hash> " ,
166+ name : "Non existing tag " ,
167+ // Without this go-git returns error "remote repository is empty".
168+ tagsInRepo : [] testTag {{ "tag-1" , false }} ,
169+ checkoutTag : "invalid " ,
170+ expectErr : "couldn't find remote ref \" refs/tags/invalid \" " ,
162171 },
163172 {
164- name : "Annotated " ,
165- tag : "annotated" ,
166- annotated : true ,
167- checkoutTag : "annotated " ,
168- expectTag : "annotated" ,
173+ name : "Skip clone - last revision unchanged " ,
174+ tagsInRepo : [] testTag {{ "tag-1" , false }} ,
175+ checkoutTag : "tag-1" ,
176+ lastRevTag : "tag-1 " ,
177+ expectConcreteCommit : false ,
169178 },
170179 {
171- name : "Non existing tag" ,
172- tag : "tag-1" ,
173- checkoutTag : "invalid" ,
174- expectErr : "couldn't find remote ref \" refs/tags/invalid\" " ,
180+ name : "Last revision changed" ,
181+ tagsInRepo : []testTag {{"tag-1" , false }, {"tag-2" , false }},
182+ checkoutTag : "tag-2" ,
183+ lastRevTag : "tag-1" ,
184+ expectConcreteCommit : true ,
175185 },
176186 }
177187 for _ , tt := range tests {
@@ -183,43 +193,55 @@ func TestCheckoutTag_Checkout(t *testing.T) {
183193 t .Fatal (err )
184194 }
185195
186- var h plumbing.Hash
187- var tagHash * plumbing.Reference
188- if tt .tag != "" {
189- h , err = commitFile (repo , "tag" , tt .tag , time .Now ())
190- if err != nil {
191- t .Fatal (err )
192- }
193- tagHash , err = tag (repo , h , ! tt .annotated , tt .tag , time .Now ())
194- if err != nil {
195- t .Fatal (err )
196+ // Collect tags and their associated commit hash for later
197+ // reference.
198+ tagCommits := map [string ]string {}
199+
200+ // Populate the repo with commits and tags.
201+ if tt .tagsInRepo != nil {
202+ for _ , tr := range tt .tagsInRepo {
203+ h , err := commitFile (repo , "tag" , tr .name , time .Now ())
204+ if err != nil {
205+ t .Fatal (err )
206+ }
207+ _ , err = tag (repo , h , tr .annotated , tr .name , time .Now ())
208+ if err != nil {
209+ t .Fatal (err )
210+ }
211+ tagCommits [tr .name ] = h .String ()
196212 }
197213 }
198214
199- tag := CheckoutTag {
215+ checkoutTag := CheckoutTag {
200216 Tag : tt .checkoutTag ,
201217 }
202- if tt .setLastRev {
203- tag .LastRevision = fmt .Sprintf ("%s/%s" , tt .tag , tagHash .Hash ().String ())
218+ // If last revision is provided, configure it.
219+ if tt .lastRevTag != "" {
220+ lc := tagCommits [tt .lastRevTag ]
221+ checkoutTag .LastRevision = fmt .Sprintf ("%s/%s" , tt .lastRevTag , lc )
204222 }
205223
206- if tt .lastRev != "" {
207- tag .LastRevision = tt .lastRev
208- }
209224 tmpDir := t .TempDir ()
210225
211- cc , err := tag .Checkout (context .TODO (), tmpDir , path , nil )
226+ cc , err := checkoutTag .Checkout (context .TODO (), tmpDir , path , nil )
212227 if tt .expectErr != "" {
213228 g .Expect (err ).ToNot (BeNil ())
214229 g .Expect (err .Error ()).To (ContainSubstring (tt .expectErr ))
215230 g .Expect (cc ).To (BeNil ())
216231 return
217232 }
218233
234+ // Check successful checkout results.
235+ g .Expect (git .IsConcreteCommit (* cc )).To (Equal (tt .expectConcreteCommit ))
236+ targetTagHash := tagCommits [tt .checkoutTag ]
219237 g .Expect (err ).ToNot (HaveOccurred ())
220- g .Expect (cc .String ()).To (Equal (tt .expectTag + "/" + h .String ()))
221- g .Expect (filepath .Join (tmpDir , "tag" )).To (BeARegularFile ())
222- g .Expect (os .ReadFile (filepath .Join (tmpDir , "tag" ))).To (BeEquivalentTo (tt .tag ))
238+ g .Expect (cc .String ()).To (Equal (tt .checkoutTag + "/" + targetTagHash ))
239+
240+ // Check file content only when there's an actual checkout.
241+ if tt .lastRevTag != tt .checkoutTag {
242+ g .Expect (filepath .Join (tmpDir , "tag" )).To (BeARegularFile ())
243+ g .Expect (os .ReadFile (filepath .Join (tmpDir , "tag" ))).To (BeEquivalentTo (tt .checkoutTag ))
244+ }
223245 })
224246 }
225247}
0 commit comments