@@ -58,7 +58,13 @@ func testAddGit(t *testing.T, sb integration.Sandbox) {
58
58
revParseCmd .Dir = gitDir
59
59
commitHashB , err := revParseCmd .Output ()
60
60
require .NoError (t , err )
61
- commitHash := strings .TrimSpace (string (commitHashB ))
61
+ commitHashV2 := strings .TrimSpace (string (commitHashB ))
62
+
63
+ revParseCmd = exec .Command ("git" , "rev-parse" , "v0.0.3" )
64
+ revParseCmd .Dir = gitDir
65
+ commitHashB , err = revParseCmd .Output ()
66
+ require .NoError (t , err )
67
+ commitHashV3 := strings .TrimSpace (string (commitHashB ))
62
68
63
69
server := httptest .NewServer (http .FileServer (http .Dir (filepath .Clean (gitDir ))))
64
70
defer server .Close ()
@@ -86,10 +92,9 @@ RUN cd /buildkit-chowned && \
86
92
[ -z "$(git status -s)" ]
87
93
` , map [string ]string {
88
94
"ServerURL" : serverURL ,
89
- "Checksum" : commitHash ,
95
+ "Checksum" : commitHashV2 ,
90
96
})
91
97
require .NoError (t , err )
92
- t .Logf ("dockerfile=%s" , dockerfile )
93
98
94
99
dir := integration .Tmpdir (t ,
95
100
fstest .CreateFile ("Dockerfile" , []byte (dockerfile ), 0600 ),
@@ -106,6 +111,137 @@ RUN cd /buildkit-chowned && \
106
111
},
107
112
}, nil )
108
113
require .NoError (t , err )
114
+
115
+ // Additional test: ADD from Git URL with checksum but without keep-git-dir flag
116
+ dockerfile2 , err := applyTemplate (`
117
+ FROM alpine
118
+ ARG REPO="{{.ServerURL}}/.git"
119
+ ARG TAG="v0.0.3"
120
+ ADD --checksum={{.Checksum}} ${REPO}#${TAG} /nogitdir
121
+ RUN [ -f /nogitdir/foo ]
122
+ RUN [ "$(cat /nogitdir/foo)" = "foo of v0.0.3" ]
123
+ RUN [ ! -d /nogitdir/.git ]
124
+ ` , map [string ]string {
125
+ "ServerURL" : serverURL ,
126
+ "Checksum" : commitHashV3 ,
127
+ })
128
+ require .NoError (t , err )
129
+
130
+ dir2 := integration .Tmpdir (t ,
131
+ fstest .CreateFile ("Dockerfile" , []byte (dockerfile2 ), 0600 ),
132
+ )
133
+
134
+ _ , err = f .Solve (sb .Context (), c , client.SolveOpt {
135
+ LocalMounts : map [string ]fsutil.FS {
136
+ dockerui .DefaultLocalNameDockerfile : dir2 ,
137
+ dockerui .DefaultLocalNameContext : dir2 ,
138
+ },
139
+ }, nil )
140
+ require .NoError (t , err )
141
+
142
+ // access initial ref again that was already pulled
143
+ dockerfile3 , err := applyTemplate (`
144
+ FROM alpine
145
+ ARG REPO="{{.ServerURL}}/.git"
146
+ ARG TAG="v0.0.2"
147
+ ADD --keep-git-dir --checksum={{.Checksum}} ${REPO}#${TAG} /nogitdir
148
+ RUN [ -f /nogitdir/foo ]
149
+ RUN [ "$(cat /nogitdir/foo)" = "foo of v0.0.2" ]
150
+ RUN [ -d /nogitdir/.git ]
151
+ ` , map [string ]string {
152
+ "ServerURL" : serverURL ,
153
+ "Checksum" : commitHashV2 ,
154
+ })
155
+ require .NoError (t , err )
156
+
157
+ dir3 := integration .Tmpdir (t ,
158
+ fstest .CreateFile ("Dockerfile" , []byte (dockerfile3 ), 0600 ),
159
+ )
160
+
161
+ _ , err = f .Solve (sb .Context (), c , client.SolveOpt {
162
+ LocalMounts : map [string ]fsutil.FS {
163
+ dockerui .DefaultLocalNameDockerfile : dir3 ,
164
+ dockerui .DefaultLocalNameContext : dir3 ,
165
+ },
166
+ }, nil )
167
+ require .NoError (t , err )
168
+
169
+ // Additional test: ADD from Git URL using commitHashV3 for both checksum and ref
170
+ dockerfile4 , err := applyTemplate (`
171
+ FROM alpine
172
+ ARG REPO="{{.ServerURL}}/.git"
173
+ ARG COMMIT="{{.Checksum}}"
174
+ ADD --keep-git-dir=true --checksum={{.Checksum}} ${REPO}#${COMMIT} /commitdir
175
+ RUN [ -f /commitdir/foo ]
176
+ RUN [ "$(cat /commitdir/foo)" = "foo of v0.0.3" ]
177
+ RUN [ -d /commitdir/.git ]
178
+ ` , map [string ]string {
179
+ "ServerURL" : serverURL ,
180
+ "Checksum" : commitHashV3 ,
181
+ })
182
+ require .NoError (t , err )
183
+
184
+ dir4 := integration .Tmpdir (t ,
185
+ fstest .CreateFile ("Dockerfile" , []byte (dockerfile4 ), 0600 ),
186
+ )
187
+
188
+ _ , err = f .Solve (sb .Context (), c , client.SolveOpt {
189
+ LocalMounts : map [string ]fsutil.FS {
190
+ dockerui .DefaultLocalNameDockerfile : dir4 ,
191
+ dockerui .DefaultLocalNameContext : dir4 ,
192
+ },
193
+ }, nil )
194
+ require .NoError (t , err )
195
+
196
+ // checksum does not match
197
+ dockerfile5 , err := applyTemplate (`
198
+ FROM alpine
199
+ ARG REPO="{{.ServerURL}}/.git"
200
+ ARG TAG="v0.0.3"
201
+ ADD --checksum={{.WrongChecksum}} ${REPO}#${TAG} /faildir
202
+ ` , map [string ]string {
203
+ "ServerURL" : serverURL ,
204
+ "WrongChecksum" : commitHashV2 , // v0.0.2 hash, but ref is v0.0.3
205
+ })
206
+ require .NoError (t , err )
207
+
208
+ dir5 := integration .Tmpdir (t ,
209
+ fstest .CreateFile ("Dockerfile" , []byte (dockerfile5 ), 0600 ),
210
+ )
211
+
212
+ _ , err = f .Solve (sb .Context (), c , client.SolveOpt {
213
+ LocalMounts : map [string ]fsutil.FS {
214
+ dockerui .DefaultLocalNameDockerfile : dir5 ,
215
+ dockerui .DefaultLocalNameContext : dir5 ,
216
+ },
217
+ }, nil )
218
+ require .Error (t , err )
219
+ require .Contains (t , err .Error (), "expected checksum to match" )
220
+
221
+ // checksum is garbage
222
+ dockerfile6 , err := applyTemplate (`
223
+ FROM alpine
224
+ ARG REPO="{{.ServerURL}}/.git"
225
+ ARG TAG="v0.0.3"
226
+ ADD --checksum=foobar ${REPO}#${TAG} /faildir
227
+ ` , map [string ]string {
228
+ "ServerURL" : serverURL ,
229
+ })
230
+ require .NoError (t , err )
231
+
232
+ dir6 := integration .Tmpdir (t ,
233
+ fstest .CreateFile ("Dockerfile" , []byte (dockerfile6 ), 0600 ),
234
+ )
235
+
236
+ _ , err = f .Solve (sb .Context (), c , client.SolveOpt {
237
+ LocalMounts : map [string ]fsutil.FS {
238
+ dockerui .DefaultLocalNameDockerfile : dir6 ,
239
+ dockerui .DefaultLocalNameContext : dir6 ,
240
+ },
241
+ }, nil )
242
+ require .Error (t , err )
243
+ require .Contains (t , err .Error (), "invalid checksum" )
244
+ require .Contains (t , err .Error (), "expected hex commit hash" )
109
245
}
110
246
111
247
func applyTemplate (tmpl string , x any ) (string , error ) {
0 commit comments