aboutsummaryrefslogtreecommitdiff
path: root/internal/stdlib/stdlib.go
diff options
context:
space:
mode:
authorJonathan Amsterdam <jba@google.com>2021-09-02 16:50:31 -0400
committerJonathan Amsterdam <jba@google.com>2021-09-03 11:34:11 +0000
commit1e6b66fc801d502741e1b46fd0ce4525071dd2ae (patch)
tree674d5cbc0748ded47d07b248cf0877b85dd9fd35 /internal/stdlib/stdlib.go
parentd30812f77f37da9f96dffe5b3af834ab4f86031e (diff)
downloadgo-x-pkgsite-1e6b66fc801d502741e1b46fd0ce4525071dd2ae.tar.xz
internal/stdlib: support opening local repo
By calling stdlib.SetGoRepoPath, users can point to a local clone of the Go repo for stdlib to use. This can save download time. The intent is to use it for cmd/pkgsite. Change-Id: I20d89f283b7b0b4f333599846eee1038d09cb50e Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/347404 Trust: Jonathan Amsterdam <jba@google.com> Run-TryBot: Jonathan Amsterdam <jba@google.com> Reviewed-by: Jamal Carvalho <jamal@golang.org>
Diffstat (limited to 'internal/stdlib/stdlib.go')
-rw-r--r--internal/stdlib/stdlib.go64
1 files changed, 54 insertions, 10 deletions
diff --git a/internal/stdlib/stdlib.go b/internal/stdlib/stdlib.go
index 2c57d767..3b05de47 100644
--- a/internal/stdlib/stdlib.go
+++ b/internal/stdlib/stdlib.go
@@ -19,6 +19,7 @@ import (
"path/filepath"
"regexp"
"strings"
+ "sync"
"time"
"golang.org/x/mod/semver"
@@ -199,12 +200,35 @@ var (
TestDevFuzzVersion = "v0.0.0-20190904010203-12de34vf56uz"
)
+var (
+ goRepoPathMu sync.Mutex
+ goRepoPath string
+)
+
+// SetGoRepoPath tells this package to obtain the Go repo from the
+// local filesystem at path, instead of cloning it.
+func SetGoRepoPath(path string) {
+ goRepoPathMu.Lock()
+ defer goRepoPathMu.Unlock()
+ goRepoPath = path
+
+}
+
+func getGoRepoPath() string {
+ goRepoPathMu.Lock()
+ defer goRepoPathMu.Unlock()
+ return goRepoPath
+}
+
// getGoRepo returns a repo object for the Go repo at version.
func getGoRepo(version string) (_ *git.Repository, _ plumbing.ReferenceName, err error) {
defer derrors.Wrap(&err, "getGoRepo(%q)", version)
if UseTestData {
return getTestGoRepo(version)
}
+ if path := getGoRepoPath(); path != "" {
+ return openGoRepo(path, version)
+ }
return cloneGoRepo(version)
}
@@ -213,16 +237,9 @@ func getGoRepo(version string) (_ *git.Repository, _ plumbing.ReferenceName, err
func cloneGoRepo(v string) (_ *git.Repository, ref plumbing.ReferenceName, err error) {
defer derrors.Wrap(&err, "cloneGoRepo(%q)", v)
- if v == version.Master {
- ref = plumbing.HEAD
- } else if SupportedBranches[v] {
- ref = plumbing.NewBranchReferenceName(v)
- } else {
- tag, err := TagForVersion(v)
- if err != nil {
- return nil, "", err
- }
- ref = plumbing.NewTagReferenceName(tag)
+ ref, err = refNameForVersion(v)
+ if err != nil {
+ return nil, "", err
}
repo, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: GoRepoURL,
@@ -237,6 +254,33 @@ func cloneGoRepo(v string) (_ *git.Repository, ref plumbing.ReferenceName, err e
return repo, ref, nil
}
+func openGoRepo(path, v string) (_ *git.Repository, _ plumbing.ReferenceName, err error) {
+ defer derrors.Wrap(&err, "openGoRepo(%q)", v)
+ repo, err := git.PlainOpen(path)
+ if err != nil {
+ return nil, "", err
+ }
+ ref, err := refNameForVersion(v)
+ if err != nil {
+ return nil, "", err
+ }
+ return repo, ref, nil
+}
+
+func refNameForVersion(v string) (plumbing.ReferenceName, error) {
+ if v == version.Master {
+ return plumbing.HEAD, nil
+ }
+ if SupportedBranches[v] {
+ return plumbing.NewBranchReferenceName(v), nil
+ }
+ tag, err := TagForVersion(v)
+ if err != nil {
+ return "", err
+ }
+ return plumbing.NewTagReferenceName(tag), nil
+}
+
// getTestGoRepo gets a Go repo for testing.
func getTestGoRepo(v string) (_ *git.Repository, _ plumbing.ReferenceName, err error) {
defer derrors.Wrap(&err, "getTestGoRepo(%q)", v)