]> Cypherpunks repositories - gostls13.git/commit
cmd/go/internal/modfetch: move to new pseudo-version design
authorRuss Cox <rsc@golang.org>
Tue, 17 Jul 2018 14:16:38 +0000 (10:16 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 19 Jul 2018 18:15:26 +0000 (18:15 +0000)
commit9430c1a669b6d4a832f740ba0c9f67c4267d9170
tree1f3f19226edcab56850d6442d926879505b23196
parent472e92609a7fa6a1983052d1d8e07bc9e4dcb396
cmd/go/internal/modfetch: move to new pseudo-version design

The original pseudo-version design used versions of the form

v0.0.0-yyyymmddhhmmss-abcdef123456

These were intentionally chosen to be valid semantic versions
that sort below any explicitly-chosen semantic version (even v0.0.0),
so that they could be used before anything was tagged but after
that would essentially only be useful in replace statements
(because the max operation during MVS would always prefer
a tagged version).

Then we changed the go command to accept hashes on the
command line, so that you can say

go get github.com/my/proj@abcdef

and it will download and use v0.0.0-yyyymmddhhmmss-abcdef123456.

If you were using v1.10.1 before and this commit is just little bit
newer than that commit, calling it v0.0.0-xxx is confusing but
also harmful: the go command sees the change from v1.10.1 to
the v0.0.0 pseudoversion as a downgrade, and it downgrades other
modules in the build. In particular if some other module has
a requirement of github.com/my/proj v1.9.0 (or later), the
pseudo-version appears to be before that, so go get would
downgrade that module too. It might even remove it entirely,
if every available version needs a post-v0.0.0 version of my/proj.

This CL introduces new pseudo-version forms that can be used
to slot in after the most recent explicit tag before the commit.
If the most recent tagged commit before abcdef is v1.10.1,
then now we will use

v1.10.2-0.yyyymmddhhmmss-abcdef123456

This has the right properties for downgrades and the like,
since it is after v1.10.1 but before almost any possible
successor, such as v1.10.2, v1.10.2-1, or v1.10.2-pre.

This CL also uses those pseudo-version forms as appropriate
when mapping a hash to a pseudo-version. This fixes the
downgrade problem.

Overall, this CL reflects our growing recognition of pseudo-versions
as being like "untagged prereleases".

Issue #26150 was about documenting best practices for how
to work around this kind of accidental downgrade problem
with additional steps. Now there are no additional steps:
the problem is avoided by default.

Fixes #26150.

Change-Id: I402feeccb93e8e937bafcaa26402d88572e9b14c
Reviewed-on: https://go-review.googlesource.com/124515
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/modfetch/codehost/codehost.go
src/cmd/go/internal/modfetch/codehost/git.go
src/cmd/go/internal/modfetch/codehost/vcs.go
src/cmd/go/internal/modfetch/coderepo.go
src/cmd/go/internal/modfetch/coderepo_test.go
src/cmd/go/internal/modfetch/pseudo.go [new file with mode: 0644]
src/cmd/go/internal/modfetch/pseudo_test.go [new file with mode: 0644]
src/cmd/go/internal/modload/help.go
src/cmd/go/internal/modload/query_test.go
src/cmd/go/testdata/script/mod_get_pseudo.txt [new file with mode: 0644]