]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: add support for go get -u tool
authorConrad Irwin <conrad.irwin@gmail.com>
Sun, 11 Feb 2024 04:51:12 +0000 (21:51 -0700)
committerMichael Matloob <matloob@golang.org>
Wed, 25 Sep 2024 16:24:10 +0000 (16:24 +0000)
Change-Id: I14d20c6c77d0d0a83cb547d954ba7f244166bc43
Reviewed-on: https://go-review.googlesource.com/c/go/+/563176
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Sam Thanawalla <samthanawalla@google.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
src/cmd/go/internal/modget/get.go
src/cmd/go/internal/modget/query.go
src/cmd/go/testdata/mod/example.com_tools_v1.1.0.txt [new file with mode: 0644]
src/cmd/go/testdata/script/mod_get_tool.txt

index 5119bcb3e584af752ed54772ec178de4dc44446a..bb29651810d9206c113a2c460d5030b69583d11e 100644 (file)
@@ -342,6 +342,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) {
        r := newResolver(ctx, queries)
        r.performLocalQueries(ctx)
        r.performPathQueries(ctx)
+       r.performToolQueries(ctx)
 
        for {
                r.performWildcardQueries(ctx)
@@ -515,6 +516,7 @@ type resolver struct {
        pathQueries       []*query // package path literal queries in original order
        wildcardQueries   []*query // path wildcard queries in original order
        patternAllQueries []*query // queries with the pattern "all"
+       toolQueries       []*query // queries with the pattern "tool"
 
        // Indexed "none" queries. These are also included in the slices above;
        // they are indexed here to speed up noneForPath.
@@ -574,6 +576,8 @@ func newResolver(ctx context.Context, queries []*query) *resolver {
        for _, q := range queries {
                if q.pattern == "all" {
                        r.patternAllQueries = append(r.patternAllQueries, q)
+               } else if q.pattern == "tool" {
+                       r.toolQueries = append(r.toolQueries, q)
                } else if q.patternIsLocal {
                        r.localQueries = append(r.localQueries, q)
                } else if q.isWildcard() {
@@ -1050,6 +1054,19 @@ func (r *resolver) queryPath(ctx context.Context, q *query) {
        })
 }
 
+// performToolQueries populates the candidates for each query whose
+// pattern is "tool".
+func (r *resolver) performToolQueries(ctx context.Context) {
+       for _, q := range r.toolQueries {
+               for tool := range modload.MainModules.Tools() {
+                       q.pathOnce(tool, func() pathSet {
+                               pkgMods, err := r.queryPackages(ctx, tool, q.version, r.initialSelected)
+                               return pathSet{pkgMods: pkgMods, err: err}
+                       })
+               }
+       }
+}
+
 // performPatternAllQueries populates the candidates for each query whose
 // pattern is "all".
 //
index 498ba6c2ff862b50710662cf7f10a72a4a83cafe..f95b503d8f60346c3ef5e7e45f42f699710744b1 100644 (file)
@@ -199,6 +199,9 @@ func (q *query) validate() error {
 
        if search.IsMetaPackage(q.pattern) && q.pattern != "all" {
                if q.pattern != q.raw {
+                       if q.pattern == "tool" {
+                               return fmt.Errorf("can't request explicit version of \"tool\" pattern")
+                       }
                        return fmt.Errorf("can't request explicit version of standard-library pattern %q", q.pattern)
                }
        }
diff --git a/src/cmd/go/testdata/mod/example.com_tools_v1.1.0.txt b/src/cmd/go/testdata/mod/example.com_tools_v1.1.0.txt
new file mode 100644 (file)
index 0000000..9181934
--- /dev/null
@@ -0,0 +1,12 @@
+-- .info --
+{"Version": "v1.1.0"}
+-- .mod --
+module example.com/tools
+-- cmd/hello/hello.go --
+package main
+
+import "fmt"
+
+func main() {
+       fmt.Println("hello v1.1")
+}
index f0e4371ee661cd48f659fb8169c2a657e9df8c3f..15f4db90968e1c1577dd99fd1f8c71330847f09d 100644 (file)
@@ -1,7 +1,10 @@
 # test go get -tool
-go get -tool example.com/tools/cmd/hello
+go get -tool example.com/tools/cmd/hello@v1.0.0
 cmp go.mod go.mod.want
 
+go get -u tool
+cmp go.mod go.mod.upgraded
+
 # test -tool with @none
 go get -tool example.com/tools/cmd/hello@none
 cmp go.mod go.mod.gone
@@ -19,6 +22,10 @@ stderr 'can''t request explicit version "none" of path "./cmd/..." in main modul
 ! go get -tool all
 stderr 'go get -tool does not work with "all"'
 
+# test tool@none
+! go get tool@none
+stderr 'can''t request explicit version of "tool" pattern'
+
 -- main.go --
 package main
 
@@ -36,12 +43,20 @@ go 1.24
 tool example.com/tools/cmd/hello
 
 require example.com/tools v1.0.0 // indirect
+-- go.mod.upgraded --
+module example.com/foo
+
+go 1.24
+
+tool example.com/tools/cmd/hello
+
+require example.com/tools v1.1.0 // indirect
 -- go.mod.gone --
 module example.com/foo
 
 go 1.24
 
-require example.com/tools v1.0.0 // indirect
+require example.com/tools v1.1.0 // indirect
 -- go.mod.empty --
 module example.com/foo