Skip to content

Commit 79c5e53

Browse files
authored
Merge pull request #6170 from tonistiigi/git-submodule-filter
git: fix subdir filter on submodule dir
2 parents 070d993 + cf599d4 commit 79c5e53

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)