1
0
mirror of https://github.com/golang/go synced 2024-11-23 00:40:08 -07:00
go/doc
Bryan C. Mills 1803ab1e44 cmd/go: validate pseudo-versions against module paths and revision metadata
Previously, most operations involving pseudo-versions allowed any
arbitrary combination of version string and date, and would resolve to
the underlying revision (typically a Git commit hash) as long as that
revision existed.

There are a number of problems with that approach:

• The pseudo-version participates in minimal version selection. If its
  version prefix is inaccurate, the pseudo-version may appear to have
  higher precedence that the releases that follow it, effectively
  “pinning” the module to that commit. For release tags, module
  authors are the ones who make the decision about release tagging;
  they should also have control over the pseudo-version precedence
  within their module.

• The commit date within the pseudo-version provides a total order
  among pseudo-versions. If it is not accurate, the pseudo-version
  will sort into the wrong place relative to other commits with the
  same version prefix.

To address those problems, this change restricts the pseudo-versions
that the 'go' command accepts, rendering some previously
accepted-but-not-canonical versions invalid. A pseudo-version is now
valid only if all of:

1. The tag from which the pseudo-version derives points to the named
   revision or one of its ancestors as reported by the underlying VCS
   tool, or the pseudo-version is not derived from any tag (that is,
   has a "vX.0.0-" prefix before the date string and uses the lowest
   major version appropriate to the module path).

2. The date string within the pseudo-version matches the UTC timestamp
   of the revision as reported by the underlying VCS tool.

3. The short name of the revision within the pseudo-version (such as a
   Git hash prefix) is the same as the short name reported by the
   underlying cmd/go/internal/modfetch/codehost.Repo. Specifically, if
   the short name is a SHA-1 prefix, it must use the same number of
   hex digits (12) as codehost.ShortenSHA1.

4. The pseudo-version includes a '+incompatible' suffix only if it is
   needed for the corresponding major version, and only if the
   underlying module does not have a go.mod file.

We believe that all releases of the 'go' tool have generated
pseudo-versions that meet these constraints. However, a few
pseudo-versions edited by hand or generated by third-party tools do
not. If we discover invalid-but-benign pseudo-versions in widely-used
existing dependencies, we may choose to add a whitelist for those
specific path/version combinations.

―

To work around invalid dependencies in leaf modules, users may add a
'replace' directive from the invalid version to its valid equivalent.
Note that the go command's go.mod parser automatically resolves commit
hashes found in 'replace' directives to the appropriate
pseudo-versions, so in most cases one can write something like:

	replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker e7b5f7dbe98c

and then run any 'go' command (such as 'go list' or 'go mod tidy') to
resolve it to an appropriate pseudo-version. Note that the invalid
version will still be used in minimal version selection, so this use
of 'replace' directives is an incomplete workaround.

―

One of the common use cases for higher-than-tagged pseudo-versions is
for projects that do parallel development on release branches. For
example, if a project cuts a 'v1.2' release branch at v1.2.0, they may
want future commits on the main branch to show up as pre-releases for
v1.3.0 rather than for v1.2.1 — especially if v1.2.1 is already tagged
on the release branch. (On the other hand, a backport of a patch to
the v1.2 branch should not show up as a pre-release for v1.3.0.)

To address this use-case, module authors can make use of our existing
support for pseudo-versions derived from pre-release tags: if the
author adds an explicit pre-release tag (such as 'v1.3.0-devel') to
the first commit after the branch, then the pseudo-versions for that
commit and its descendents will be derived from that tag and will sort
appropriately in version selection.

―

Updates #27171
Fixes #29262
Fixes #27173
Fixes #32662
Fixes #32695

Change-Id: I0d50a538b6fdb0d3080aca9c9c3df1040da1b329
Reviewed-on: https://go-review.googlesource.com/c/go/+/181881
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Jay Conrod <jayconrod@google.com>
2019-06-21 21:02:09 +00:00
..
articles
codewalk doc: fix a typo 2019-02-05 18:11:45 +00:00
devel doc: document Go 1.12.6 2019-06-10 23:23:39 +00:00
gopher doc/gopher: add model sheet 2018-07-18 04:00:10 +00:00
play
progs doc: improve the interface example in Effective Go 2018-11-26 05:08:25 +00:00
asm.html doc: update /doc/asm compiler output example 2019-05-08 15:21:11 +00:00
cmd.html doc: don't use "go tool vet" as an example 2019-02-13 05:35:45 +00:00
code.html doc: use consistent path in example code 2019-05-13 16:34:24 +00:00
conduct.html
contrib.html doc: add 1.12 to the project history 2019-02-26 17:31:55 +00:00
contribute.html doc: fix missing anchor links in contribute.html 2019-06-04 15:30:33 +00:00
debugging_with_gdb.html runtime: support all as parameter in gdb goroutine commands. 2019-04-29 18:11:11 +00:00
diagnostics.html doc: document GODEBUG options to disable use of instruction set extensions 2018-12-18 14:59:36 +00:00
docs.html doc: update docs.html with new tour import path 2018-10-20 14:19:29 +00:00
editors.html doc: fix spelling of comp[]hensive to comp[r]ehensive 2018-10-12 22:59:05 +00:00
effective_go.html doc: add missing paragraph break in Effective Go 2019-03-07 04:46:03 +00:00
gccgo_contribute.html doc: use HTTPS for links 2018-06-13 13:45:01 +00:00
gccgo_install.html doc: use HTTPS for links 2018-06-13 13:45:01 +00:00
go1.1.html
go1.2.html doc: use HTTPS for links 2018-06-13 13:45:01 +00:00
go1.3.html doc: fix typos 2019-02-09 17:34:48 +00:00
go1.4.html doc: use HTTPS for links 2018-06-13 13:45:01 +00:00
go1.5.html
go1.6.html
go1.7.html
go1.8.html
go1.9.html
go1.10.html
go1.11.html doc/go1.11: add note about go run supporting for go run pkg or go run . 2018-12-05 22:10:41 +00:00
go1.12.html doc: fix typo in go1.12 release notes 2019-04-16 14:47:58 +00:00
go1.13.html cmd/go: validate pseudo-versions against module paths and revision metadata 2019-06-21 21:02:09 +00:00
go1.html
go1compat.html
go_faq.html doc/go_faq: fix grammar 2019-04-12 15:22:53 +00:00
go_mem.html doc: go_mem: clarify Once docs 2018-12-21 21:46:38 +00:00
go_spec.html spec: clarify that slice a expression shares underlying array with operand 2019-05-14 22:30:48 +00:00
go-logo-black.png
go-logo-blue.png
go-logo-white.png
help.html doc: remove a Google+ link since it doesn't exist anymore 2019-06-18 03:41:59 +00:00
ie.css
install-source.html cmd/go: document GOBIN and 'go install' locations 2019-06-17 17:28:00 +00:00
install.html doc: clarify to use MinGW-W64 for amd64 systems 2019-04-26 15:09:02 +00:00
root.html doc: update "Mac OS X", "OS X" to macOS; bump up to 10.10 2018-06-19 21:36:56 +00:00
security.html doc: use https scheme in oss-distros link 2018-12-11 00:39:03 +00:00
share.png
tos.html