From 205e46a813aaa5b8fb8b684c9f3e85a43f6fc322 Mon Sep 17 00:00:00 2001 From: Brad Cowie Date: Thu, 18 Dec 2025 17:32:43 +1300 Subject: [PATCH 1/4] feat: get pseudo-version from Go Proxy if no tagged version exists --- pkg/versiongetter/goproxy/client.go | 39 +++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/pkg/versiongetter/goproxy/client.go b/pkg/versiongetter/goproxy/client.go index 8f5e11110..d0ea1ccee 100644 --- a/pkg/versiongetter/goproxy/client.go +++ b/pkg/versiongetter/goproxy/client.go @@ -2,12 +2,19 @@ package goproxy import ( "context" + "encoding/json" "fmt" "io" "net/http" "strings" + "time" ) +type InfoPayload struct { + Version string + Time time.Time +} + type Client struct { client *http.Client } @@ -18,8 +25,8 @@ func New(client *http.Client) *Client { } } -func (c *Client) List(ctx context.Context, path string) ([]string, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://proxy.golang.org/%s/@v/list", path), nil) +func (c *Client) doHTTPRequest(ctx context.Context, uri string) ([]byte, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) if err != nil { return nil, fmt.Errorf("create a http request: %w", err) } @@ -35,9 +42,31 @@ func (c *Client) List(ctx context.Context, path string) ([]string, error) { if err != nil { return nil, fmt.Errorf("read a response body: %w", err) } + return b, nil +} + +func (c *Client) List(ctx context.Context, path string) ([]string, error) { + b, err := c.doHTTPRequest(ctx, fmt.Sprintf("https://proxy.golang.org/%s/@v/list", path)) + if err != nil { + return nil, err + } s := strings.TrimSpace(string(b)) - if s == "" { - return nil, nil + if s != "" { + return strings.Split(s, "\n"), nil + } + + // Find the latest version (including pseudo-versions) if $module/@v/list is empty + b, err = c.doHTTPRequest(ctx, fmt.Sprintf("https://proxy.golang.org/%s/@latest", path)) + if err != nil { + return nil, err + } + if len(b) > 0 { + payload := &InfoPayload{} + if err := json.Unmarshal(b, &payload); err != nil { + return nil, fmt.Errorf("decode the response body as JSON: %w", err) + } + return []string{payload.Version}, nil } - return strings.Split(s, "\n"), nil + + return nil, nil } From 531b89d5d83fa46981a91c9358669efe5f023a30 Mon Sep 17 00:00:00 2001 From: Shunsuke Suzuki Date: Tue, 23 Dec 2025 18:03:11 +0900 Subject: [PATCH 2/4] fix: call latest API after list API fails --- pkg/controller/wire_gen.go | 4 +++ pkg/versiongetter/go.go | 6 ++-- pkg/versiongetter/goproxy/client.go | 46 +++++++++++++++++------------ 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/pkg/controller/wire_gen.go b/pkg/controller/wire_gen.go index cbbac6377..26293b620 100644 --- a/pkg/controller/wire_gen.go +++ b/pkg/controller/wire_gen.go @@ -15,13 +15,16 @@ import ( "github.com/aquaproj/aqua/v2/pkg/checksum" "github.com/aquaproj/aqua/v2/pkg/config" "github.com/aquaproj/aqua/v2/pkg/config-finder" + finder "github.com/aquaproj/aqua/v2/pkg/config-finder" "github.com/aquaproj/aqua/v2/pkg/config-reader" + reader "github.com/aquaproj/aqua/v2/pkg/config-reader" "github.com/aquaproj/aqua/v2/pkg/controller/allowpolicy" "github.com/aquaproj/aqua/v2/pkg/controller/cp" "github.com/aquaproj/aqua/v2/pkg/controller/denypolicy" "github.com/aquaproj/aqua/v2/pkg/controller/exec" "github.com/aquaproj/aqua/v2/pkg/controller/generate" "github.com/aquaproj/aqua/v2/pkg/controller/generate-registry" + genrgst "github.com/aquaproj/aqua/v2/pkg/controller/generate-registry" "github.com/aquaproj/aqua/v2/pkg/controller/generate/output" "github.com/aquaproj/aqua/v2/pkg/controller/info" "github.com/aquaproj/aqua/v2/pkg/controller/initcmd" @@ -41,6 +44,7 @@ import ( "github.com/aquaproj/aqua/v2/pkg/ghattestation" "github.com/aquaproj/aqua/v2/pkg/github" "github.com/aquaproj/aqua/v2/pkg/install-registry" + registry "github.com/aquaproj/aqua/v2/pkg/install-registry" "github.com/aquaproj/aqua/v2/pkg/installpackage" "github.com/aquaproj/aqua/v2/pkg/link" "github.com/aquaproj/aqua/v2/pkg/minisign" diff --git a/pkg/versiongetter/go.go b/pkg/versiongetter/go.go index 1ffbfa93a..09e1387a3 100644 --- a/pkg/versiongetter/go.go +++ b/pkg/versiongetter/go.go @@ -22,11 +22,11 @@ func NewGoGetter(gc GoProxyClient) *GoGetter { } type GoProxyClient interface { - List(ctx context.Context, path string) ([]string, error) + List(ctx context.Context, logE *logrus.Entry, path string) ([]string, error) } func (g *GoGetter) Get(ctx context.Context, logE *logrus.Entry, pkg *registry.PackageInfo, _ []*Filter) (string, error) { //nolint:cyclop - versions, err := g.gc.List(ctx, pkg.GoVersionPath) + versions, err := g.gc.List(ctx, logE, pkg.GoVersionPath) if err != nil { return "", fmt.Errorf("list versions: %w", err) } @@ -57,7 +57,7 @@ func (g *GoGetter) Get(ctx context.Context, logE *logrus.Entry, pkg *registry.Pa } func (g *GoGetter) List(ctx context.Context, logE *logrus.Entry, pkg *registry.PackageInfo, _ []*Filter, _ int) ([]*fuzzyfinder.Item, error) { - vs, err := g.gc.List(ctx, pkg.GoVersionPath) + vs, err := g.gc.List(ctx, logE, pkg.GoVersionPath) if err != nil { return nil, fmt.Errorf("list versions: %w", err) } diff --git a/pkg/versiongetter/goproxy/client.go b/pkg/versiongetter/goproxy/client.go index d0ea1ccee..6b4785e95 100644 --- a/pkg/versiongetter/goproxy/client.go +++ b/pkg/versiongetter/goproxy/client.go @@ -7,12 +7,13 @@ import ( "io" "net/http" "strings" - "time" + + "github.com/sirupsen/logrus" + "github.com/suzuki-shunsuke/logrus-error/logerr" ) type InfoPayload struct { Version string - Time time.Time } type Client struct { @@ -45,28 +46,35 @@ func (c *Client) doHTTPRequest(ctx context.Context, uri string) ([]byte, error) return b, nil } -func (c *Client) List(ctx context.Context, path string) ([]string, error) { - b, err := c.doHTTPRequest(ctx, fmt.Sprintf("https://proxy.golang.org/%s/@v/list", path)) +func (c *Client) List(ctx context.Context, logE *logrus.Entry, path string) ([]string, error) { + listEndpoint := fmt.Sprintf("https://proxy.golang.org/%s/@v/list", path) + b, err := c.doHTTPRequest(ctx, listEndpoint) if err != nil { - return nil, err - } - s := strings.TrimSpace(string(b)) - if s != "" { - return strings.Split(s, "\n"), nil + logerr.WithError(logE, err).WithField("api_endpoint", listEndpoint).Debug("retrieve package versions") + } else { + s := strings.TrimSpace(string(b)) + if s != "" { + return strings.Split(s, "\n"), nil + } } // Find the latest version (including pseudo-versions) if $module/@v/list is empty - b, err = c.doHTTPRequest(ctx, fmt.Sprintf("https://proxy.golang.org/%s/@latest", path)) + latestEndpoint := fmt.Sprintf("https://proxy.golang.org/%s/@latest", path) + fields := logrus.Fields{ + "api_endpoint": latestEndpoint, + } + logE = logE.WithFields(fields) + b, err = c.doHTTPRequest(ctx, latestEndpoint) if err != nil { - return nil, err + return nil, fmt.Errorf("retrieve the latest version: %w", logerr.WithFields(err, fields)) } - if len(b) > 0 { - payload := &InfoPayload{} - if err := json.Unmarshal(b, &payload); err != nil { - return nil, fmt.Errorf("decode the response body as JSON: %w", err) - } - return []string{payload.Version}, nil + if len(b) == 0 { + logE.Debug("the response body from go proxy is empty") + return nil, nil } - - return nil, nil + payload := &InfoPayload{} + if err := json.Unmarshal(b, &payload); err != nil { + return nil, fmt.Errorf("decode the response body as JSON: %w", logerr.WithFields(err, fields)) + } + return []string{payload.Version}, nil } From c3473bb524882f62a090ec9662296634f0cb8059 Mon Sep 17 00:00:00 2001 From: Shunsuke Suzuki Date: Tue, 23 Dec 2025 18:58:17 +0900 Subject: [PATCH 3/4] fix: return error if list api returns 404 --- pkg/controller/wire_gen.go | 4 ---- pkg/versiongetter/goproxy/client.go | 12 ++++++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/pkg/controller/wire_gen.go b/pkg/controller/wire_gen.go index 26293b620..cbbac6377 100644 --- a/pkg/controller/wire_gen.go +++ b/pkg/controller/wire_gen.go @@ -15,16 +15,13 @@ import ( "github.com/aquaproj/aqua/v2/pkg/checksum" "github.com/aquaproj/aqua/v2/pkg/config" "github.com/aquaproj/aqua/v2/pkg/config-finder" - finder "github.com/aquaproj/aqua/v2/pkg/config-finder" "github.com/aquaproj/aqua/v2/pkg/config-reader" - reader "github.com/aquaproj/aqua/v2/pkg/config-reader" "github.com/aquaproj/aqua/v2/pkg/controller/allowpolicy" "github.com/aquaproj/aqua/v2/pkg/controller/cp" "github.com/aquaproj/aqua/v2/pkg/controller/denypolicy" "github.com/aquaproj/aqua/v2/pkg/controller/exec" "github.com/aquaproj/aqua/v2/pkg/controller/generate" "github.com/aquaproj/aqua/v2/pkg/controller/generate-registry" - genrgst "github.com/aquaproj/aqua/v2/pkg/controller/generate-registry" "github.com/aquaproj/aqua/v2/pkg/controller/generate/output" "github.com/aquaproj/aqua/v2/pkg/controller/info" "github.com/aquaproj/aqua/v2/pkg/controller/initcmd" @@ -44,7 +41,6 @@ import ( "github.com/aquaproj/aqua/v2/pkg/ghattestation" "github.com/aquaproj/aqua/v2/pkg/github" "github.com/aquaproj/aqua/v2/pkg/install-registry" - registry "github.com/aquaproj/aqua/v2/pkg/install-registry" "github.com/aquaproj/aqua/v2/pkg/installpackage" "github.com/aquaproj/aqua/v2/pkg/link" "github.com/aquaproj/aqua/v2/pkg/minisign" diff --git a/pkg/versiongetter/goproxy/client.go b/pkg/versiongetter/goproxy/client.go index 6b4785e95..946914496 100644 --- a/pkg/versiongetter/goproxy/client.go +++ b/pkg/versiongetter/goproxy/client.go @@ -50,12 +50,12 @@ func (c *Client) List(ctx context.Context, logE *logrus.Entry, path string) ([]s listEndpoint := fmt.Sprintf("https://proxy.golang.org/%s/@v/list", path) b, err := c.doHTTPRequest(ctx, listEndpoint) if err != nil { - logerr.WithError(logE, err).WithField("api_endpoint", listEndpoint).Debug("retrieve package versions") - } else { - s := strings.TrimSpace(string(b)) - if s != "" { - return strings.Split(s, "\n"), nil - } + return nil, fmt.Errorf("retrieve package versions: %w", logerr.WithFields(err, logrus.Fields{ + "api_endpoint": listEndpoint, + })) + } + if s := strings.TrimSpace(string(b)); s != "" { + return strings.Split(s, "\n"), nil } // Find the latest version (including pseudo-versions) if $module/@v/list is empty From 98dc2d9dc6ca7627a041d994f076b018eb6a7133 Mon Sep 17 00:00:00 2001 From: Shunsuke Suzuki Date: Tue, 23 Dec 2025 19:08:35 +0900 Subject: [PATCH 4/4] refactor: fix a lint error --- pkg/versiongetter/goproxy/client.go | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/pkg/versiongetter/goproxy/client.go b/pkg/versiongetter/goproxy/client.go index 946914496..16147af4a 100644 --- a/pkg/versiongetter/goproxy/client.go +++ b/pkg/versiongetter/goproxy/client.go @@ -26,26 +26,6 @@ func New(client *http.Client) *Client { } } -func (c *Client) doHTTPRequest(ctx context.Context, uri string) ([]byte, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) - if err != nil { - return nil, fmt.Errorf("create a http request: %w", err) - } - resp, err := c.client.Do(req) - if err != nil { - return nil, fmt.Errorf("send a http request: %w", err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) - } - b, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("read a response body: %w", err) - } - return b, nil -} - func (c *Client) List(ctx context.Context, logE *logrus.Entry, path string) ([]string, error) { listEndpoint := fmt.Sprintf("https://proxy.golang.org/%s/@v/list", path) b, err := c.doHTTPRequest(ctx, listEndpoint) @@ -78,3 +58,23 @@ func (c *Client) List(ctx context.Context, logE *logrus.Entry, path string) ([]s } return []string{payload.Version}, nil } + +func (c *Client) doHTTPRequest(ctx context.Context, uri string) ([]byte, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) + if err != nil { + return nil, fmt.Errorf("create a http request: %w", err) + } + resp, err := c.client.Do(req) + if err != nil { + return nil, fmt.Errorf("send a http request: %w", err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("read a response body: %w", err) + } + return b, nil +}