From 671f860a1912ba45fa489354f84ec82a6f11ae96 Mon Sep 17 00:00:00 2001 From: Benoit Gagnon Date: Wed, 24 Jul 2019 22:52:06 -0400 Subject: [PATCH] Shallow fetch for Git packages If the server supports it, fetch a specific revision with --depth 1. Otherwise, fall back to the normal fetch. This replaces the previous "clone" operation. The bandwidth and time savings can be significant depending on the history of the repository (number of commits). --- pkg/git.go | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/pkg/git.go b/pkg/git.go index d199ff9..2f53860 100644 --- a/pkg/git.go +++ b/pkg/git.go @@ -37,15 +37,47 @@ func NewGitPackage(source *spec.GitSource) Interface { } func (p *GitPackage) Install(ctx context.Context, dir, version string) (lockVersion string, err error) { - cmd := exec.CommandContext(ctx, "git", "clone", "-n", p.Source.Remote, dir) + cmd := exec.CommandContext(ctx, "git", "init") cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr + cmd.Dir = dir err = cmd.Run() if err != nil { return "", err } + cmd = exec.CommandContext(ctx, "git", "remote", "add", "origin", p.Source.Remote) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Dir = dir + err = cmd.Run() + if err != nil { + return "", err + } + + // Attempt shallow fetch at specific revision + cmd = exec.CommandContext(ctx, "git", "fetch", "--depth", "1", "origin", version) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Dir = dir + err = cmd.Run() + if err != nil { + // Fall back to normal fetch (all revisions) + cmd = exec.CommandContext(ctx, "git", "fetch", "origin") + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Dir = dir + err = cmd.Run() + if err != nil { + return "", err + } + } + + // If a Subdir is specificied, a sparsecheckout is sufficient if p.Source.Subdir != "" { cmd = exec.CommandContext(ctx, "git", "config", "core.sparsecheckout", "true") cmd.Stdin = os.Stdin @@ -55,9 +87,9 @@ func (p *GitPackage) Install(ctx context.Context, dir, version string) (lockVers err = cmd.Run() if err != nil { return "", err - } + } glob := []byte(p.Source.Subdir + "/*\n") - ioutil.WriteFile(dir + "/.git/info/sparse-checkout", glob, 0644) + ioutil.WriteFile(dir+"/.git/info/sparse-checkout", glob, 0644) } cmd = exec.CommandContext(ctx, "git", "-c", "advice.detachedHead=false", "checkout", version)