Use git --single-branch and --depth whenever possible - closes #13
diff --git a/alldocs.go b/alldocs.go index fe7563c..1461e7d 100644 --- a/alldocs.go +++ b/alldocs.go
@@ -21,7 +21,7 @@ Fetch a remote dependency Usage: - gvt fetch [-branch branch | -revision rev | -tag tag] [-precaire] [-no-recurse] importpath + gvt fetch [-branch branch] [-revision rev | -tag tag] [-precaire] [-no-recurse] importpath fetch vendors an upstream import path. @@ -30,23 +30,22 @@ Flags: -branch branch - fetch from the name branch. If not supplied the default upstream - branch will be used. + fetch from the named branch. Will also be used by gvt update. + If not supplied the default upstream branch will be used. -no-recurse do not fetch recursively. -tag tag - fetch the specified tag. If not supplied the default upstream - branch will be used. + fetch the specified tag. -revision rev - fetch the specific revision from the branch (if supplied). If no - revision supplied, the latest available will be supplied. + fetch the specific revision from the branch or repository. + If no revision supplied, the latest available will be fetched. -precaire allow the use of insecure protocols. Restore dependencies from manifest Usage: - gvt restore + gvt restore [-precaire] [-connections N] restore fetches the dependencies listed in the manifest.
diff --git a/fetch.go b/fetch.go index ef16489..34aedbb 100644 --- a/fetch.go +++ b/fetch.go
@@ -34,7 +34,7 @@ var cmdFetch = &Command{ Name: "fetch", - UsageLine: "fetch [-branch branch | -revision rev | -tag tag] [-precaire] [-no-recurse] importpath", + UsageLine: "fetch [-branch branch] [-revision rev | -tag tag] [-precaire] [-no-recurse] importpath", Short: "fetch a remote dependency", Long: `fetch vendors an upstream import path. @@ -43,16 +43,15 @@ Flags: -branch branch - fetch from the name branch. If not supplied the default upstream - branch will be used. + fetch from the named branch. Will also be used by gvt update. + If not supplied the default upstream branch will be used. -no-recurse do not fetch recursively. -tag tag - fetch the specified tag. If not supplied the default upstream - branch will be used. + fetch the specified tag. -revision rev - fetch the specific revision from the branch (if supplied). If no - revision supplied, the latest available will be supplied. + fetch the specific revision from the branch or repository. + If no revision supplied, the latest available will be fetched. -precaire allow the use of insecure protocols.
diff --git a/gbvendor/repo.go b/gbvendor/repo.go index 5a52c2b..54b9b40 100644 --- a/gbvendor/repo.go +++ b/gbvendor/repo.go
@@ -274,16 +274,18 @@ return g.url } -// Checkout fetchs the remote branch, tag, or revision. If more than one is -// supplied, an error is returned. If the branch is blank, -// then the default remote branch will be used. If the branch is "HEAD", an -// error will be returned. +// Checkout fetchs the remote branch, tag, or revision. If the branch is blank, +// then the default remote branch will be used. If the branch is "HEAD" and +// revision is empty, an impossible update is assumed. func (g *gitrepo) Checkout(branch, tag, revision string) (WorkingCopy, error) { - if branch == "HEAD" { + if branch == "HEAD" && revision == "" { return nil, fmt.Errorf("cannot update %q as it has been previously fetched with -tag or -revision. Please use gvt delete then fetch again.", g.url) } - if !atMostOne(branch, tag, revision) { - return nil, fmt.Errorf("only one of branch, tag or revision may be supplied") + if !atMostOne(tag, revision) { + return nil, fmt.Errorf("only one of tag or revision may be supplied") + } + if !atMostOne(branch, tag) { + return nil, fmt.Errorf("only one of branch or tag may be supplied") } dir, err := mktmp() if err != nil { @@ -293,23 +295,37 @@ path: dir, } + quiet := false args := []string{ "clone", "-q", // silence progress report to stderr g.url, dir, } - if branch != "" { - args = append(args, "--branch", branch) + if branch != "" && branch != "HEAD" { + args = append(args, "--branch", branch, "--single-branch") + } + if tag != "" { + quiet = true // git REALLY wants to tell you how awesome 'detached HEAD' is... + args = append(args, "--branch", tag, "--single-branch") + args = append(args, "--depth", "1") + } + if revision == "" { + args = append(args, "--depth", "1") } - if _, err := run("git", args...); err != nil { + if quiet { + err = runQuiet("git", args...) + } else { + _, err = run("git", args...) + } + if err != nil { wc.Destroy() return nil, err } - if revision != "" || tag != "" { - if err := runOutPath(os.Stderr, dir, "git", "checkout", "-q", oneOf(revision, tag)); err != nil { + if revision != "" { + if err := runOutPath(os.Stderr, dir, "git", "checkout", "-q", revision); err != nil { wc.Destroy() return nil, err } @@ -509,6 +525,14 @@ return cmd.Run() } +func runQuiet(c string, args ...string) error { + cmd := exec.Command(c, args...) + cmd.Stdin = nil + cmd.Stdout = nil + cmd.Stderr = nil + return cmd.Run() +} + func runPath(path string, c string, args ...string) ([]byte, error) { var buf bytes.Buffer err := runOutPath(&buf, path, c, args...)
diff --git a/restore.go b/restore.go index eedeaf5..a19959d 100644 --- a/restore.go +++ b/restore.go
@@ -96,6 +96,8 @@ if err != nil { return fmt.Errorf("dependency could not be processed: %s", err) } + // We can't pass the branch here, and benefit from narrow clones, as the + // revision might not be in the branch tree anymore. Thanks rebase. wc, err := repo.Checkout("", "", dep.Revision) if err != nil { return fmt.Errorf("dependency could not be fetched: %s", err)