@@ -67,32 +67,36 @@ func TestCheckoutBranch_Checkout(t *testing.T) {
67
67
}
68
68
69
69
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
76
77
}{
77
78
{
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 ,
82
84
},
83
85
{
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 ,
89
92
},
90
93
{
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 ,
96
100
},
97
101
{
98
102
name : "Non existing branch" ,
@@ -120,58 +124,64 @@ func TestCheckoutBranch_Checkout(t *testing.T) {
120
124
}
121
125
g .Expect (err ).ToNot (HaveOccurred ())
122
126
g .Expect (cc .String ()).To (Equal (tt .branch + "/" + tt .expectedCommit ))
127
+ g .Expect (git .IsConcreteCommit (* cc )).To (Equal (tt .expectedConcreteCommit ))
123
128
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
+ }
127
134
}
128
135
})
129
136
}
130
137
}
131
138
132
139
func TestCheckoutTag_Checkout (t * testing.T ) {
140
+ type testTag struct {
141
+ name string
142
+ annotated bool
143
+ }
144
+
133
145
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
142
152
}{
143
153
{
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 ,
148
158
},
149
159
{
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 ,
155
164
},
156
165
{
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 \" " ,
162
171
},
163
172
{
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 ,
169
178
},
170
179
{
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 ,
175
185
},
176
186
}
177
187
for _ , tt := range tests {
@@ -183,43 +193,55 @@ func TestCheckoutTag_Checkout(t *testing.T) {
183
193
t .Fatal (err )
184
194
}
185
195
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 ()
196
212
}
197
213
}
198
214
199
- tag := CheckoutTag {
215
+ checkoutTag := CheckoutTag {
200
216
Tag : tt .checkoutTag ,
201
217
}
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 )
204
222
}
205
223
206
- if tt .lastRev != "" {
207
- tag .LastRevision = tt .lastRev
208
- }
209
224
tmpDir := t .TempDir ()
210
225
211
- cc , err := tag .Checkout (context .TODO (), tmpDir , path , nil )
226
+ cc , err := checkoutTag .Checkout (context .TODO (), tmpDir , path , nil )
212
227
if tt .expectErr != "" {
213
228
g .Expect (err ).ToNot (BeNil ())
214
229
g .Expect (err .Error ()).To (ContainSubstring (tt .expectErr ))
215
230
g .Expect (cc ).To (BeNil ())
216
231
return
217
232
}
218
233
234
+ // Check successful checkout results.
235
+ g .Expect (git .IsConcreteCommit (* cc )).To (Equal (tt .expectConcreteCommit ))
236
+ targetTagHash := tagCommits [tt .checkoutTag ]
219
237
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
+ }
223
245
})
224
246
}
225
247
}
0 commit comments