diff options
| author | Jonathan Amsterdam <jba@google.com> | 2021-09-02 16:50:31 -0400 |
|---|---|---|
| committer | Jonathan Amsterdam <jba@google.com> | 2021-09-03 11:34:11 +0000 |
| commit | 1e6b66fc801d502741e1b46fd0ce4525071dd2ae (patch) | |
| tree | 674d5cbc0748ded47d07b248cf0877b85dd9fd35 /internal/stdlib/stdlib.go | |
| parent | d30812f77f37da9f96dffe5b3af834ab4f86031e (diff) | |
| download | go-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.go | 64 |
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) |
