@@ -3,6 +3,7 @@ package git
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "fmt"
6
7
"io"
7
8
"net/http"
8
9
"net/http/cgi"
@@ -69,9 +70,10 @@ func testRepeatedFetch(t *testing.T, keepGitDir bool) {
69
70
expLen := 40
70
71
if keepGitDir {
71
72
expLen += 4
73
+ require .GreaterOrEqual (t , len (key1 ), expLen )
74
+ } else {
75
+ require .Equal (t , expLen , len (key1 ))
72
76
}
73
-
74
- require .Equal (t , expLen , len (key1 ))
75
77
require .Equal (t , 40 , len (pin1 ))
76
78
77
79
ref1 , err := g .Snapshot (ctx , nil )
@@ -189,9 +191,10 @@ func testFetchBySHA(t *testing.T, keepGitDir bool) {
189
191
expLen := 40
190
192
if keepGitDir {
191
193
expLen += 4
194
+ require .GreaterOrEqual (t , len (key1 ), expLen )
195
+ } else {
196
+ require .Equal (t , expLen , len (key1 ))
192
197
}
193
-
194
- require .Equal (t , expLen , len (key1 ))
195
198
require .Equal (t , 40 , len (pin1 ))
196
199
197
200
ref1 , err := g .Snapshot (ctx , nil )
@@ -276,9 +279,10 @@ func testFetchUnreferencedRefSha(t *testing.T, ref string, keepGitDir bool) {
276
279
expLen := 40
277
280
if keepGitDir {
278
281
expLen += 4
282
+ require .GreaterOrEqual (t , len (key1 ), expLen )
283
+ } else {
284
+ require .Equal (t , expLen , len (key1 ))
279
285
}
280
-
281
- require .Equal (t , expLen , len (key1 ))
282
286
require .Equal (t , 40 , len (pin1 ))
283
287
284
288
ref1 , err := g .Snapshot (ctx , nil )
@@ -372,9 +376,10 @@ func testFetchByTag(t *testing.T, tag, expectedCommitSubject string, isAnnotated
372
376
expLen := 40
373
377
if keepGitDir {
374
378
expLen += 4
379
+ require .GreaterOrEqual (t , len (key1 ), expLen )
380
+ } else {
381
+ require .Equal (t , expLen , len (key1 ))
375
382
}
376
-
377
- require .Equal (t , expLen , len (key1 ))
378
383
require .Equal (t , 40 , len (pin1 ))
379
384
380
385
ref1 , err := g .Snapshot (ctx , nil )
@@ -447,6 +452,105 @@ func testFetchByTag(t *testing.T, tag, expectedCommitSubject string, isAnnotated
447
452
}
448
453
}
449
454
455
+ func TestMultipleTagAccessKeepGitDir (t * testing.T ) {
456
+ testMultipleTagAccess (t , true )
457
+ }
458
+
459
+ func TestMultipleTagAccess (t * testing.T ) {
460
+ testMultipleTagAccess (t , false )
461
+ }
462
+
463
+ func testMultipleTagAccess (t * testing.T , keepGitDir bool ) {
464
+ if runtime .GOOS == "windows" {
465
+ t .Skip ("Depends on unimplemented containerd bind-mount support on Windows" )
466
+ }
467
+
468
+ t .Parallel ()
469
+ ctx := namespaces .WithNamespace (context .Background (), "buildkit-test" )
470
+ ctx = logProgressStreams (ctx , t )
471
+
472
+ gs := setupGitSource (t , t .TempDir ())
473
+
474
+ repo := setupGitRepo (t )
475
+
476
+ id := & GitIdentifier {Remote : repo .mainURL , KeepGitDir : keepGitDir , Ref : "a/v1.2.3" }
477
+
478
+ g , err := gs .Resolve (ctx , id , nil , nil )
479
+ require .NoError (t , err )
480
+
481
+ expLen := 40
482
+ if keepGitDir {
483
+ expLen += 4
484
+ }
485
+
486
+ key1 , pin1 , _ , _ , err := g .CacheKey (ctx , nil , 0 )
487
+ require .NoError (t , err )
488
+ if keepGitDir {
489
+ require .GreaterOrEqual (t , len (key1 ), expLen )
490
+ } else {
491
+ require .Equal (t , expLen , len (key1 ))
492
+ }
493
+ require .Equal (t , 40 , len (pin1 ))
494
+
495
+ ref1 , err := g .Snapshot (ctx , nil )
496
+ require .NoError (t , err )
497
+ defer ref1 .Release (context .TODO ())
498
+
499
+ id2 := & GitIdentifier {Remote : repo .mainURL , KeepGitDir : keepGitDir , Ref : "a/v1.2.3-same" }
500
+ g2 , err := gs .Resolve (ctx , id2 , nil , nil )
501
+ require .NoError (t , err )
502
+
503
+ key2 , pin2 , _ , _ , err := g2 .CacheKey (ctx , nil , 0 )
504
+ require .NoError (t , err )
505
+ if keepGitDir {
506
+ require .GreaterOrEqual (t , len (key1 ), expLen )
507
+ } else {
508
+ require .Equal (t , expLen , len (key1 ))
509
+ }
510
+ require .Equal (t , 40 , len (pin2 ))
511
+
512
+ require .Equal (t , pin1 , pin2 )
513
+ if ! keepGitDir {
514
+ require .Equal (t , key1 , key2 )
515
+ return
516
+ }
517
+ // key should be different because of the ref
518
+ require .NotEqual (t , key1 , key2 )
519
+
520
+ ref2 , err := g2 .Snapshot (ctx , nil )
521
+ require .NoError (t , err )
522
+ defer ref1 .Release (context .TODO ())
523
+
524
+ mount1 , err := ref2 .Mount (ctx , true , nil )
525
+ require .NoError (t , err )
526
+
527
+ lm1 := snapshot .LocalMounter (mount1 )
528
+ dir1 , err := lm1 .Mount ()
529
+ require .NoError (t , err )
530
+ defer lm1 .Unmount ()
531
+
532
+ workDir := t .TempDir ()
533
+
534
+ runShell (t , dir1 , fmt .Sprintf (`git rev-parse a/v1.2.3 > %s/ref1` , workDir ))
535
+
536
+ dt1 , err := os .ReadFile (filepath .Join (workDir , "ref1" ))
537
+ require .NoError (t , err )
538
+
539
+ mount2 , err := ref2 .Mount (ctx , true , nil )
540
+ require .NoError (t , err )
541
+
542
+ lm2 := snapshot .LocalMounter (mount2 )
543
+ dir2 , err := lm2 .Mount ()
544
+ require .NoError (t , err )
545
+ defer lm2 .Unmount ()
546
+
547
+ runShell (t , dir2 , fmt .Sprintf (`git rev-parse a/v1.2.3-same > %s/ref2` , workDir ))
548
+
549
+ dt2 , err := os .ReadFile (filepath .Join (workDir , "ref2" ))
550
+ require .NoError (t , err )
551
+ require .Equal (t , string (dt1 ), string (dt2 ))
552
+ }
553
+
450
554
func TestMultipleRepos (t * testing.T ) {
451
555
testMultipleRepos (t , false )
452
556
}
@@ -496,12 +600,20 @@ func testMultipleRepos(t *testing.T, keepGitDir bool) {
496
600
497
601
key1 , pin1 , _ , _ , err := g .CacheKey (ctx , nil , 0 )
498
602
require .NoError (t , err )
499
- require .Equal (t , expLen , len (key1 ))
603
+ if keepGitDir {
604
+ require .GreaterOrEqual (t , len (key1 ), expLen )
605
+ } else {
606
+ require .Equal (t , expLen , len (key1 ))
607
+ }
500
608
require .Equal (t , 40 , len (pin1 ))
501
609
502
610
key2 , pin2 , _ , _ , err := g2 .CacheKey (ctx , nil , 0 )
503
611
require .NoError (t , err )
504
- require .Equal (t , expLen , len (key2 ))
612
+ if keepGitDir {
613
+ require .GreaterOrEqual (t , len (key2 ), expLen )
614
+ } else {
615
+ require .Equal (t , expLen , len (key2 ))
616
+ }
505
617
require .Equal (t , 40 , len (pin2 ))
506
618
507
619
require .NotEqual (t , key1 , key2 )
@@ -608,9 +720,10 @@ func testSubdir(t *testing.T, keepGitDir bool) {
608
720
expLen := 44
609
721
if keepGitDir {
610
722
expLen += 4
723
+ require .GreaterOrEqual (t , len (key1 ), expLen )
724
+ } else {
725
+ require .Equal (t , expLen , len (key1 ))
611
726
}
612
-
613
- require .Equal (t , expLen , len (key1 ))
614
727
require .Equal (t , 40 , len (pin1 ))
615
728
616
729
ref1 , err := g .Snapshot (ctx , nil )
@@ -712,7 +825,7 @@ func setupGitRepo(t *testing.T) gitRepoFixture {
712
825
// | * (tag: refs/tags/v1.2.3-special) tagonly-leaf
713
826
// |/
714
827
// * (tag: refs/tags/v1.2.3) second
715
- // * (tag: refs/tags/a/v1.2.3) initial
828
+ // * (tag: refs/tags/a/v1.2.3, refs/tags/a/v1.2.3-same ) initial
716
829
runShell (t , fixture .mainPath ,
717
830
"git -c init.defaultBranch=master init" ,
718
831
"git config --local user.email test" ,
@@ -722,7 +835,7 @@ func setupGitRepo(t *testing.T) gitRepoFixture {
722
835
"git add abc" ,
723
836
"git commit -m initial" ,
724
837
"git tag --no-sign a/v1.2.3" ,
725
-
838
+ "git tag --no-sign a/v1.2.3-same" ,
726
839
"echo bar > def" ,
727
840
"mkdir subdir" ,
728
841
"echo subcontents > subdir/subfile" ,
0 commit comments