return err
}
summary, err := rawGoModSummary(rm)
- if err != nil {
+ if err != nil && !errors.Is(err, gover.ErrTooNew) {
return err
}
return "", err
}
summary, err := rawGoModSummary(latest)
- if err != nil {
+ if err != nil && !errors.Is(err, gover.ErrTooNew) {
return "", err
}
return summary.deprecated, nil
// its dependencies.
//
// rawGoModSummary cannot be used on the main module outside of workspace mode.
+// The modFileSummary can still be used for retractions and deprecations
+// even if a TooNewError is returned.
func rawGoModSummary(m module.Version) (*modFileSummary, error) {
if gover.IsToolchain(m.Path) {
if m.Path == "go" && gover.Compare(m.Version, gover.GoStrictVersion) >= 0 {
summary.require = append(summary.require, req.Mod)
}
}
- if summary.goVersion != "" && gover.Compare(summary.goVersion, gover.GoStrictVersion) >= 0 {
- if gover.Compare(summary.goVersion, gover.Local()) > 0 {
- return nil, &gover.TooNewError{What: "module " + m.String(), GoVersion: summary.goVersion}
- }
- summary.require = append(summary.require, module.Version{Path: "go", Version: summary.goVersion})
- }
+
if len(f.Retract) > 0 {
summary.retract = make([]retraction, 0, len(f.Retract))
for _, ret := range f.Retract {
}
}
+ // This block must be kept at the end of the function because the summary may
+ // be used for reading retractions or deprecations even if a TooNewError is
+ // returned.
+ if summary.goVersion != "" && gover.Compare(summary.goVersion, gover.GoStrictVersion) >= 0 {
+ summary.require = append(summary.require, module.Version{Path: "go", Version: summary.goVersion})
+ if gover.Compare(summary.goVersion, gover.Local()) > 0 {
+ return summary, &gover.TooNewError{What: "module " + m.String(), GoVersion: summary.goVersion}
+ }
+ }
+
return summary, nil
})
}
--- /dev/null
+# For issue #66403, go list -u -m all should not fail if a module
+# with retractions has a newer version.
+
+env TESTGO_VERSION=go1.21
+env TESTGO_VERSION_SWITCH=switch
+go list -u -m example.com/retract/newergoversion
+stdout 'example.com/retract/newergoversion v1.0.0'
+! stdout 'v1.2.0'
+
+-- go.mod --
+module example.com/m
+
+go 1.22
+
+require example.com/retract/newergoversion v1.0.0
+
+-- main.go --
+package main
+
+import _ "example.com/retract/newergoversion"
\ No newline at end of file