@@ -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,65 @@ 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
+ // 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
+ }
127
135
}
128
136
})
129
137
}
130
138
}
131
139
132
140
func TestCheckoutTag_Checkout (t * testing.T ) {
141
+ type testTag struct {
142
+ name string
143
+ annotated bool
144
+ }
145
+
133
146
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
142
153
}{
143
154
{
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 ,
148
159
},
149
160
{
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 ,
155
165
},
156
166
{
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 \" " ,
162
172
},
163
173
{
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 ,
169
179
},
170
180
{
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 ,
175
186
},
176
187
}
177
188
for _ , tt := range tests {
@@ -183,43 +194,55 @@ func TestCheckoutTag_Checkout(t *testing.T) {
183
194
t .Fatal (err )
184
195
}
185
196
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 ()
196
213
}
197
214
}
198
215
199
- tag := CheckoutTag {
216
+ checkoutTag := CheckoutTag {
200
217
Tag : tt .checkoutTag ,
201
218
}
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 )
204
223
}
205
224
206
- if tt .lastRev != "" {
207
- tag .LastRevision = tt .lastRev
208
- }
209
225
tmpDir := t .TempDir ()
210
226
211
- cc , err := tag .Checkout (context .TODO (), tmpDir , path , nil )
227
+ cc , err := checkoutTag .Checkout (context .TODO (), tmpDir , path , nil )
212
228
if tt .expectErr != "" {
213
229
g .Expect (err ).ToNot (BeNil ())
214
230
g .Expect (err .Error ()).To (ContainSubstring (tt .expectErr ))
215
231
g .Expect (cc ).To (BeNil ())
216
232
return
217
233
}
218
234
235
+ // Check successful checkout results.
236
+ g .Expect (git .IsConcreteCommit (* cc )).To (Equal (tt .expectConcreteCommit ))
237
+ targetTagHash := tagCommits [tt .checkoutTag ]
219
238
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
+ }
223
246
})
224
247
}
225
248
}
0 commit comments