diff --git a/cmd/dbc/add.go b/cmd/dbc/add.go index f580e1cf..1892e182 100644 --- a/cmd/dbc/add.go +++ b/cmd/dbc/add.go @@ -149,7 +149,14 @@ func (m addModel) Init() tea.Cmd { } } else { if !m.Pre && !drv.HasNonPrerelease() { - err := fmt.Errorf("driver `%s` not found in driver registry index", spec.Name) + var err error + if len(drv.PkgInfo) > 0 { + // Has packages, but they're all prereleases + err = fmt.Errorf("driver `%s` not found in driver registry index (but prerelease versions filtered out); try: dbc add --pre %s", spec.Name, spec.Name) + } else { + // No packages. Very unlikely edge case. + err = fmt.Errorf("driver `%s` not found in driver registry index", spec.Name) + } // If we have registry errors, enhance the error message if registryErrors != nil { return fmt.Errorf("%w\n\nNote: Some driver registries were unavailable:\n%s", err, registryErrors.Error()) diff --git a/cmd/dbc/add_test.go b/cmd/dbc/add_test.go index cad5564a..9364c983 100644 --- a/cmd/dbc/add_test.go +++ b/cmd/dbc/add_test.go @@ -274,7 +274,7 @@ func (suite *SubcommandTestSuite) TestAddWithoutPreOnlyPrereleaseDriver() { baseModel{getDriverRegistry: getTestDriverRegistry, downloadPkg: downloadTestPkg}) out := suite.runCmdErr(m) - suite.Contains(out, "driver `test-driver-only-pre` not found in driver registry index") + suite.Contains(out, "driver `test-driver-only-pre` not found in driver registry index (but prerelease versions filtered out); try: dbc add --pre test-driver-only-pre") } func (suite *SubcommandTestSuite) TestAddWithPreAndConstraint() { diff --git a/cmd/dbc/install_test.go b/cmd/dbc/install_test.go index dab660f2..97fb369a 100644 --- a/cmd/dbc/install_test.go +++ b/cmd/dbc/install_test.go @@ -346,6 +346,8 @@ func (suite *SubcommandTestSuite) TestInstallWithoutPreOnlyPrereleaseDriver() { out := suite.runCmdErr(m) suite.Contains(out, "driver `test-driver-only-pre` not found") + suite.Contains(out, "but prerelease versions filtered out") + suite.Contains(out, "try: dbc install --pre test-driver-only-pre") suite.driverIsNotInstalled("test-driver-only-pre") } diff --git a/drivers.go b/drivers.go index a256ac68..231e0550 100644 --- a/drivers.go +++ b/drivers.go @@ -461,12 +461,19 @@ func (d Driver) Versions(platformTuple string) semver.Collection { func (d Driver) GetPackage(version *semver.Version, platformTuple string, allowPrerelease bool) (PkgInfo, error) { pkglist := d.PkgInfo + + // Filter out pre-releases and record whether any pre-releases were filtered + // out so we can produce a more helpful error message if !allowPrerelease && (version == nil || version.Prerelease() != "") { + hadPackages := len(d.PkgInfo) > 0 pkglist = slices.Collect(filter(slices.Values(d.PkgInfo), func(p pkginfo) bool { return p.Version.Prerelease() == "" })) if len(pkglist) == 0 { - return PkgInfo{}, fmt.Errorf("driver `%s` not found (but prerelease versions filtered out)", d.Path) + if hadPackages { + return PkgInfo{}, fmt.Errorf("driver `%s` not found (but prerelease versions filtered out); try: dbc install --pre %s", d.Path, d.Path) + } + return PkgInfo{}, fmt.Errorf("driver `%s` not found", d.Path) } }