Skip to content

Commit cf599d4

Browse files
committed
git: fix subdir filter on submodule dir
Because subdir filter happened before the submodule update it resulted in empty directory being filtered and submodule update being skipped because .gitmodules was already missing. Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 070d993 commit cf599d4

File tree

2 files changed

+81
-29
lines changed

2 files changed

+81
-29
lines changed

source/git/source.go

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,7 @@ func (gs *gitSourceHandler) Snapshot(ctx context.Context, g session.Group) (out
567567
}
568568
}
569569

570+
cd := checkoutDir
570571
if gs.src.KeepGitDir && subdir == "." {
571572
checkoutDirGit := filepath.Join(checkoutDir, ".git")
572573
if err := os.MkdirAll(checkoutDir, 0711); err != nil {
@@ -624,7 +625,6 @@ func (gs *gitSourceHandler) Snapshot(ctx context.Context, g session.Group) (out
624625
}
625626
gitDir = checkoutDirGit
626627
} else {
627-
cd := checkoutDir
628628
if subdir != "." {
629629
cd, err = os.MkdirTemp(cd, "checkout")
630630
if err != nil {
@@ -636,41 +636,42 @@ func (gs *gitSourceHandler) Snapshot(ctx context.Context, g session.Group) (out
636636
if err != nil {
637637
return nil, errors.Wrapf(err, "failed to checkout remote %s", urlutil.RedactCredentials(gs.src.Remote))
638638
}
639-
if subdir != "." {
640-
d, err := os.Open(filepath.Join(cd, subdir))
641-
if err != nil {
642-
return nil, errors.Wrapf(err, "failed to open subdir %v", subdir)
643-
}
644-
defer func() {
645-
if d != nil {
646-
d.Close()
647-
}
648-
}()
649-
names, err := d.Readdirnames(0)
650-
if err != nil {
651-
return nil, err
652-
}
653-
for _, n := range names {
654-
if err := os.Rename(filepath.Join(cd, subdir, n), filepath.Join(checkoutDir, n)); err != nil {
655-
return nil, err
656-
}
657-
}
658-
if err := d.Close(); err != nil {
659-
return nil, err
660-
}
661-
d = nil // reset defer
662-
if err := os.RemoveAll(cd); err != nil {
663-
return nil, err
664-
}
665-
}
666639
}
667640

668-
git = git.New(gitutil.WithWorkTree(checkoutDir), gitutil.WithGitDir(gitDir))
641+
git = git.New(gitutil.WithWorkTree(cd), gitutil.WithGitDir(gitDir))
669642
_, err = git.Run(ctx, "submodule", "update", "--init", "--recursive", "--depth=1")
670643
if err != nil {
671644
return nil, errors.Wrapf(err, "failed to update submodules for %s", urlutil.RedactCredentials(gs.src.Remote))
672645
}
673646

647+
if subdir != "." {
648+
d, err := os.Open(filepath.Join(cd, subdir))
649+
if err != nil {
650+
return nil, errors.Wrapf(err, "failed to open subdir %v", subdir)
651+
}
652+
defer func() {
653+
if d != nil {
654+
d.Close()
655+
}
656+
}()
657+
names, err := d.Readdirnames(0)
658+
if err != nil {
659+
return nil, err
660+
}
661+
for _, n := range names {
662+
if err := os.Rename(filepath.Join(cd, subdir, n), filepath.Join(checkoutDir, n)); err != nil {
663+
return nil, err
664+
}
665+
}
666+
if err := d.Close(); err != nil {
667+
return nil, err
668+
}
669+
d = nil // reset defer
670+
if err := os.RemoveAll(cd); err != nil {
671+
return nil, err
672+
}
673+
}
674+
674675
if idmap := mount.IdentityMapping(); idmap != nil {
675676
uid, gid := idmap.RootPair()
676677
err := filepath.WalkDir(gitDir, func(p string, _ os.DirEntry, _ error) error {

source/git/source_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,57 @@ func TestCredentialRedaction(t *testing.T) {
733733
require.NotContains(t, err.Error(), "keepthissecret")
734734
}
735735

736+
func TestSubmoduleSubdir(t *testing.T) {
737+
testSubmoduleSubdir(t, false)
738+
}
739+
740+
func TestSubmoduleSubdirKeepGitDir(t *testing.T) {
741+
testSubmoduleSubdir(t, true)
742+
}
743+
744+
func testSubmoduleSubdir(t *testing.T, keepGitDir bool) {
745+
if runtime.GOOS == "windows" {
746+
t.Skip("Depends on unimplemented containerd bind-mount support on Windows")
747+
}
748+
t.Parallel()
749+
ctx := namespaces.WithNamespace(context.Background(), "buildkit-test")
750+
ctx = logProgressStreams(ctx, t)
751+
752+
gs := setupGitSource(t, t.TempDir())
753+
754+
repo := setupGitRepo(t)
755+
756+
id := &GitIdentifier{Remote: repo.mainURL, KeepGitDir: keepGitDir, Ref: "feature", Subdir: "sub"}
757+
758+
g, err := gs.Resolve(ctx, id, nil, nil)
759+
require.NoError(t, err)
760+
761+
key1, pin1, _, done, err := g.CacheKey(ctx, nil, 0)
762+
require.NoError(t, err)
763+
require.True(t, done)
764+
765+
expLen := 44
766+
require.GreaterOrEqual(t, len(key1), expLen)
767+
require.Equal(t, 40, len(pin1))
768+
769+
ref1, err := g.Snapshot(ctx, nil)
770+
require.NoError(t, err)
771+
defer ref1.Release(context.TODO())
772+
773+
mount, err := ref1.Mount(ctx, true, nil)
774+
require.NoError(t, err)
775+
776+
lm := snapshot.LocalMounter(mount)
777+
dir, err := lm.Mount()
778+
require.NoError(t, err)
779+
defer lm.Unmount()
780+
781+
dt, err := os.ReadFile(filepath.Join(dir, "subfile"))
782+
require.NoError(t, err)
783+
784+
require.Equal(t, "subcontents\n", string(dt))
785+
}
786+
736787
func TestSubdir(t *testing.T) {
737788
testSubdir(t, false)
738789
}

0 commit comments

Comments
 (0)