@@ -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,65 @@ 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+ // Check checked out content for actual checkouts only.
130+ if tt .expectedConcreteCommit {
131+ for k , v := range tt .filesCreated {
132+ g .Expect (filepath .Join (tmpDir , k )).To (BeARegularFile ())
133+ g .Expect (os .ReadFile (filepath .Join (tmpDir , k ))).To (BeEquivalentTo (v ))
134+ }
127135 }
128136 })
129137 }
130138}
131139
132140func TestCheckoutTag_Checkout (t * testing.T ) {
141+ type testTag struct {
142+ name string
143+ annotated bool
144+ }
145+
133146 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
147+ name string
148+ tagsInRepo []testTag
149+ checkoutTag string
150+ lastRevTag string
151+ expectConcreteCommit bool
152+ expectErr string
142153 }{
143154 {
144- name : "Tag" ,
145- tag : "tag-1" ,
146- checkoutTag : "tag-1" ,
147- expectTag : "tag-1" ,
155+ name : "Tag" ,
156+ tagsInRepo : [] testTag {{ "tag-1" , false }} ,
157+ checkoutTag : "tag-1" ,
158+ expectConcreteCommit : true ,
148159 },
149160 {
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" ,
161+ name : "Annotated" ,
162+ tagsInRepo : []testTag {{"annotated" , true }},
163+ checkoutTag : "annotated" ,
164+ expectConcreteCommit : true ,
155165 },
156166 {
157- name : "Last revision changed " ,
158- tag : "tag-3" ,
159- checkoutTag : "tag-3" ,
160- expectTag : "tag-3 " ,
161- lastRev : "tag-3/<fake-hash> " ,
167+ name : "Non existing tag " ,
168+ // Without this go-git returns error "remote repository is empty".
169+ tagsInRepo : [] testTag {{ "tag-1" , false }} ,
170+ checkoutTag : "invalid " ,
171+ expectErr : "couldn't find remote ref \" refs/tags/invalid \" " ,
162172 },
163173 {
164- name : "Annotated " ,
165- tag : "annotated" ,
166- annotated : true ,
167- checkoutTag : "annotated " ,
168- expectTag : "annotated" ,
174+ name : "Skip clone - last revision unchanged " ,
175+ tagsInRepo : [] testTag {{ "tag-1" , false }} ,
176+ checkoutTag : "tag-1" ,
177+ lastRevTag : "tag-1 " ,
178+ expectConcreteCommit : false ,
169179 },
170180 {
171- name : "Non existing tag" ,
172- tag : "tag-1" ,
173- checkoutTag : "invalid" ,
174- expectErr : "couldn't find remote ref \" refs/tags/invalid\" " ,
181+ name : "Last revision changed" ,
182+ tagsInRepo : []testTag {{"tag-1" , false }, {"tag-2" , false }},
183+ checkoutTag : "tag-2" ,
184+ lastRevTag : "tag-1" ,
185+ expectConcreteCommit : true ,
175186 },
176187 }
177188 for _ , tt := range tests {
@@ -183,43 +194,55 @@ func TestCheckoutTag_Checkout(t *testing.T) {
183194 t .Fatal (err )
184195 }
185196
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 )
197+ // Collect tags and their associated commit hash for later
198+ // reference.
199+ tagCommits := map [string ]string {}
200+
201+ // Populate the repo with commits and tags.
202+ if tt .tagsInRepo != nil {
203+ for _ , tr := range tt .tagsInRepo {
204+ h , err := commitFile (repo , "tag" , tr .name , time .Now ())
205+ if err != nil {
206+ t .Fatal (err )
207+ }
208+ _ , err = tag (repo , h , tr .annotated , tr .name , time .Now ())
209+ if err != nil {
210+ t .Fatal (err )
211+ }
212+ tagCommits [tr .name ] = h .String ()
196213 }
197214 }
198215
199- tag := CheckoutTag {
216+ checkoutTag := CheckoutTag {
200217 Tag : tt .checkoutTag ,
201218 }
202- if tt .setLastRev {
203- tag .LastRevision = fmt .Sprintf ("%s/%s" , tt .tag , tagHash .Hash ().String ())
219+ // If last revision is provided, configure it.
220+ if tt .lastRevTag != "" {
221+ lc := tagCommits [tt .lastRevTag ]
222+ checkoutTag .LastRevision = fmt .Sprintf ("%s/%s" , tt .lastRevTag , lc )
204223 }
205224
206- if tt .lastRev != "" {
207- tag .LastRevision = tt .lastRev
208- }
209225 tmpDir := t .TempDir ()
210226
211- cc , err := tag .Checkout (context .TODO (), tmpDir , path , nil )
227+ cc , err := checkoutTag .Checkout (context .TODO (), tmpDir , path , nil )
212228 if tt .expectErr != "" {
213229 g .Expect (err ).ToNot (BeNil ())
214230 g .Expect (err .Error ()).To (ContainSubstring (tt .expectErr ))
215231 g .Expect (cc ).To (BeNil ())
216232 return
217233 }
218234
235+ // Check successful checkout results.
236+ g .Expect (git .IsConcreteCommit (* cc )).To (Equal (tt .expectConcreteCommit ))
237+ targetTagHash := tagCommits [tt .checkoutTag ]
219238 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 ))
239+ g .Expect (cc .String ()).To (Equal (tt .checkoutTag + "/" + targetTagHash ))
240+
241+ // Check file content only when there's an actual checkout.
242+ if tt .lastRevTag != tt .checkoutTag {
243+ g .Expect (filepath .Join (tmpDir , "tag" )).To (BeARegularFile ())
244+ g .Expect (os .ReadFile (filepath .Join (tmpDir , "tag" ))).To (BeEquivalentTo (tt .checkoutTag ))
245+ }
223246 })
224247 }
225248}
0 commit comments