Skip to content

Commit f15a2b1

Browse files
committed
internal/stdlib: fix Zip for master version
An error is fixed when creating the zipfile for std@master, which prevented the module from being fetched. A test is also added. For golang/go#44390 Change-Id: I279146aef10311822f47f16259a2223c879140c2 Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/294831 Trust: Julie Qiu <[email protected]> Run-TryBot: Julie Qiu <[email protected]> Reviewed-by: Jonathan Amsterdam <[email protected]>
1 parent 60f6a33 commit f15a2b1

File tree

5 files changed

+98
-15
lines changed

5 files changed

+98
-15
lines changed

internal/fetch/fetch_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ func TestFetchModule(t *testing.T) {
8484
// Proxy only as stdlib is not accounted for in local mode
8585
{name: "stdlib module", mod: moduleStd, proxyOnly: true},
8686
// Proxy only as version is pre specified in local mode
87+
{name: "master version of stdlib module", mod: moduleStdMaster, fetchVersion: "master", proxyOnly: true},
88+
// Proxy only as version is pre specified in local mode
8789
{name: "master version of module", mod: moduleMaster, fetchVersion: "master", proxyOnly: true},
8890
// Proxy only as version is pre specified in local mode
8991
{name: "latest version of module", mod: moduleLatest, fetchVersion: "latest", proxyOnly: true},

internal/fetch/fetchdata_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,73 @@ var moduleAlternative = &testModule{
642642
},
643643
}
644644

645+
var moduleStdMaster = &testModule{
646+
mod: &proxy.Module{
647+
ModulePath: stdlib.ModulePath,
648+
Version: "master",
649+
// No files necessary because the internal/stdlib package will read from
650+
// internal/stdlib/testdata.
651+
},
652+
fr: &FetchResult{
653+
RequestedVersion: "master",
654+
ResolvedVersion: stdlib.TestVersion,
655+
Module: &internal.Module{
656+
ModuleInfo: internal.ModuleInfo{
657+
ModulePath: stdlib.ModulePath,
658+
Version: stdlib.TestVersion,
659+
CommitTime: stdlib.TestCommitTime,
660+
HasGoMod: true,
661+
SourceInfo: source.NewStdlibInfo("master"),
662+
},
663+
Units: []*internal.Unit{
664+
{
665+
UnitMeta: internal.UnitMeta{
666+
Path: "errors",
667+
Name: "errors",
668+
IsRedistributable: true,
669+
Version: stdlib.TestVersion,
670+
ModulePath: stdlib.ModulePath,
671+
},
672+
Documentation: []*internal.Documentation{
673+
{
674+
GOOS: internal.All,
675+
GOARCH: internal.All,
676+
Synopsis: "Package errors implements functions to manipulate errors.",
677+
API: []*internal.Symbol{
678+
{
679+
Name: "New",
680+
Synopsis: "func New(text string) error",
681+
Section: "Functions",
682+
Kind: "Function",
683+
GOOS: internal.All,
684+
GOARCH: internal.All,
685+
},
686+
},
687+
},
688+
},
689+
},
690+
{
691+
UnitMeta: internal.UnitMeta{
692+
Path: "std",
693+
IsRedistributable: true,
694+
Version: stdlib.TestVersion,
695+
ModulePath: "std",
696+
},
697+
Readme: &internal.Readme{Filepath: "README.md", Contents: "# The Go Programming Language\n"},
698+
},
699+
},
700+
},
701+
PackageVersionStates: []*internal.PackageVersionState{
702+
{
703+
PackagePath: "errors",
704+
ModulePath: "std",
705+
Version: stdlib.TestVersion,
706+
Status: 200,
707+
},
708+
},
709+
},
710+
}
711+
645712
var moduleStd = &testModule{
646713
mod: &proxy.Module{
647714
ModulePath: stdlib.ModulePath,

internal/proxy/server.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,12 @@ func (s *Server) AddModule(m *Module) {
115115
s.handleLatest(m.ModulePath, fmt.Sprintf("/%s/@latest", m.ModulePath))
116116
// TODO(https://golang.org/issue/39985): Add endpoint for handling
117117
// master and main versions.
118-
s.handleLatest(m.ModulePath, fmt.Sprintf("/%s/@v/master.info", m.ModulePath))
119-
s.handleLatest(m.ModulePath, fmt.Sprintf("/%s/@v/main.info", m.ModulePath))
118+
if m.Version != "master" {
119+
s.handleLatest(m.ModulePath, fmt.Sprintf("/%s/@v/master.info", m.ModulePath))
120+
}
121+
if m.Version != "main" {
122+
s.handleLatest(m.ModulePath, fmt.Sprintf("/%s/@v/main.info", m.ModulePath))
123+
}
120124
}
121125
s.handleInfo(m.ModulePath, m.Version, m.NotCached)
122126
s.handleMod(m)

internal/stdlib/stdlib.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,9 @@ func TagForVersion(version string) (_ string, err error) {
9292
defer derrors.Wrap(&err, "TagForVersion(%q)", version)
9393

9494
// Special case: master => master
95-
if version == "master" {
96-
return version, nil
95+
if version == "master" || strings.HasPrefix(version, "v0.0.0") {
96+
return "master", nil
9797
}
98-
9998
// Special case: v1.0.0 => go1.
10099
if version == "v1.0.0" {
101100
return "go1", nil
@@ -110,7 +109,6 @@ func TagForVersion(version string) (_ string, err error) {
110109
if patch == "0" {
111110
versionWithoutPrerelease = strings.TrimSuffix(versionWithoutPrerelease, ".0")
112111
}
113-
114112
goVersion = fmt.Sprintf("go%s", strings.TrimPrefix(versionWithoutPrerelease, "v"))
115113
if prerelease != "" {
116114
// Go prereleases look like "beta1" instead of "beta.1".
@@ -174,7 +172,10 @@ const (
174172
var UseTestData = false
175173

176174
// TestCommitTime is the time used for all commits when UseTestData is true.
177-
var TestCommitTime = time.Date(2019, 9, 4, 1, 2, 3, 0, time.UTC)
175+
var (
176+
TestCommitTime = time.Date(2019, 9, 4, 1, 2, 3, 0, time.UTC)
177+
TestVersion = "v0.0.0-20190904010203-89fb59e2e920"
178+
)
178179

179180
// getGoRepo returns a repo object for the Go repo at version.
180181
func getGoRepo(version string) (_ *git.Repository, err error) {
@@ -202,6 +203,9 @@ func getGoRepo(version string) (_ *git.Repository, err error) {
202203
// getTestGoRepo gets a Go repo for testing.
203204
func getTestGoRepo(version string) (_ *git.Repository, err error) {
204205
defer derrors.Wrap(&err, "getTestGoRepo(%q)", version)
206+
if strings.HasPrefix(version, "v0.0.0") {
207+
version = "master"
208+
}
205209

206210
fs := osfs.New(filepath.Join(testhelper.TestDataPath("testdata"), version))
207211
repo, err := git.Init(memory.NewStorage(), fs)
@@ -262,7 +266,8 @@ func Versions() (_ []string, err error) {
262266

263267
// Directory returns the directory of the standard library relative to the repo root.
264268
func Directory(version string) string {
265-
if semver.Compare(version, "v1.4.0-beta.1") >= 0 || version == "master" {
269+
if semver.Compare(version, "v1.4.0-beta.1") >= 0 ||
270+
version == "master" || strings.HasPrefix(version, "v0.0.0") {
266271
return "src"
267272
}
268273
// For versions older than v1.4.0-beta.1, the stdlib is in src/pkg.
@@ -322,6 +327,9 @@ func Zip(resolvedVersion string) (_ *zip.Reader, resolvedVersion2 string, commit
322327
if err != nil {
323328
return nil, "", time.Time{}, err
324329
}
330+
if resolvedVersion == "master" {
331+
resolvedVersion = newPseudoVersion("v0.0.0", commit.Committer.When, commit.Hash)
332+
}
325333
root, err := repo.TreeObject(commit.TreeHash)
326334
if err != nil {
327335
return nil, "", time.Time{}, err
@@ -350,9 +358,6 @@ func Zip(resolvedVersion string) (_ *zip.Reader, resolvedVersion2 string, commit
350358
if err != nil {
351359
return nil, "", time.Time{}, err
352360
}
353-
if resolvedVersion == "master" {
354-
resolvedVersion = newPseudoVersion("v0.0.0", commit.Committer.When, commit.Hash)
355-
}
356361
return zr, resolvedVersion, commit.Committer.When, nil
357362
}
358363

@@ -368,7 +373,7 @@ func semanticVersion(requestedVersion string) (_ string, err error) {
368373
defer derrors.Wrap(&err, "semanticVersion(%q)", requestedVersion)
369374

370375
if requestedVersion == "master" {
371-
return requestedVersion, nil
376+
return "master", nil
372377
}
373378

374379
knownVersions, err := Versions()

internal/stdlib/stdlib_test.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ func TestTagForVersion(t *testing.T) {
6161
version: "master",
6262
want: "master",
6363
},
64+
{
65+
name: "master version",
66+
version: TestVersion,
67+
want: "master",
68+
},
6469
{
6570
name: "bad std semver",
6671
version: "v1.x",
@@ -120,7 +125,7 @@ func TestMajorVersionForVersion(t *testing.T) {
120125
func TestZip(t *testing.T) {
121126
UseTestData = true
122127
defer func() { UseTestData = false }()
123-
for _, resolvedVersion := range []string{"v1.14.6", "v1.12.5", "v1.3.2", "master"} {
128+
for _, resolvedVersion := range []string{"v1.14.6", "v1.12.5", "v1.3.2", TestVersion} {
124129
t.Run(resolvedVersion, func(t *testing.T) {
125130
zr, gotResolvedVersion, gotTime, err := Zip(resolvedVersion)
126131
if err != nil {
@@ -141,12 +146,12 @@ func TestZip(t *testing.T) {
141146
"errors/errors.go": true,
142147
"errors/errors_test.go": true,
143148
}
144-
if semver.Compare(resolvedVersion, "v1.4.0") > 0 || resolvedVersion == "master" {
149+
if semver.Compare(resolvedVersion, "v1.4.0") > 0 || resolvedVersion == TestVersion {
145150
wantFiles["README.md"] = true
146151
} else {
147152
wantFiles["README"] = true
148153
}
149-
if semver.Compare(resolvedVersion, "v1.13.0") > 0 || resolvedVersion == "master" {
154+
if semver.Compare(resolvedVersion, "v1.13.0") > 0 || resolvedVersion == TestVersion {
150155
wantFiles["cmd/README.vendor"] = true
151156
}
152157

0 commit comments

Comments
 (0)