@@ -10,7 +10,9 @@ import (
10
10
"os"
11
11
"path/filepath"
12
12
"regexp"
13
+ "strings"
13
14
"testing"
15
+ "time"
14
16
15
17
"github.com/coder/envbuilder/git"
16
18
"github.com/coder/envbuilder/options"
@@ -234,6 +236,59 @@ func TestShallowCloneRepo(t *testing.T) {
234
236
})
235
237
}
236
238
239
+ func TestFetchAfterClone (t * testing.T ) {
240
+ t .Parallel ()
241
+ ctx , cancel := context .WithTimeout (context .Background (), time .Minute )
242
+ defer cancel ()
243
+ // setup a git repo
244
+ srvDir := t .TempDir ()
245
+ srvFS := osfs .New (srvDir , osfs .WithChrootOS ())
246
+ repo := gittest .NewRepo (t , srvFS )
247
+ repo .Commit (gittest .Commit (t , "README.md" , "Hello, worldd!" , "initial commit" ))
248
+ headBefore , err := repo .Repo .Head ()
249
+ require .NoError (t , err )
250
+ srv := httptest .NewServer (gittest .NewServer (srvFS ))
251
+
252
+ // clone to a tempdir
253
+ clientDir := t .TempDir ()
254
+ clientFS := osfs .New (clientDir , osfs .WithChrootOS ())
255
+ cloned , err := git .CloneRepo (ctx , git.CloneRepoOptions {
256
+ Path : "/repo" ,
257
+ RepoURL : srv .URL ,
258
+ Storage : clientFS ,
259
+ })
260
+
261
+ require .NoError (t , err )
262
+ require .True (t , cloned )
263
+
264
+ // add some commits on the server
265
+ repo .Commit (gittest .Commit (t , "README.md" , "Hello, world!" , "fix typo" ))
266
+ // ensure state
267
+ bs , err := os .ReadFile (filepath .Join (srvDir , "README.md" ))
268
+ require .NoError (t , err )
269
+ require .Equal (t , "Hello, world!" , strings .TrimSpace (string (bs )))
270
+ headAfter , err := repo .Repo .Head ()
271
+ require .NoError (t , err )
272
+ require .NotEqual (t , headBefore .Hash (), headAfter .Hash ())
273
+
274
+ // run CloneRepo again
275
+ clonedAgain , err := git .CloneRepo (ctx , git.CloneRepoOptions {
276
+ Path : "/repo" ,
277
+ RepoURL : srv .URL ,
278
+ Storage : clientFS ,
279
+ })
280
+ require .NoError (t , err )
281
+ require .True (t , clonedAgain )
282
+
283
+ // Inspect the cloned repo and check last commit
284
+ headFile , err := clientFS .Open (filepath .Join (".git/refs/heads/main" ))
285
+ require .NoError (t , err )
286
+ var sb strings.Builder
287
+ _ , err = io .Copy (& sb , headFile )
288
+ require .NoError (t , err )
289
+ require .Equal (t , headAfter , sb .String ())
290
+ }
291
+
237
292
func TestCloneRepoSSH (t * testing.T ) {
238
293
t .Parallel ()
239
294
0 commit comments