diff --git a/src/bpm/main.go b/src/bpm/main.go index 683514b..ade1e0e 100644 --- a/src/bpm/main.go +++ b/src/bpm/main.go @@ -137,6 +137,7 @@ func main() { currentFlagSet.BoolP("force", "f", false, "Bypass warnings during package update") currentFlagSet.BoolP("yes", "y", false, "Enter 'yes' in all prompts") currentFlagSet.BoolP("no-sync", "n", false, "Do not sync databases") + currentFlagSet.Bool("allow-downgrades", false, "Allow package downgrades") currentFlagSet.BoolP("optional", "o", false, "Install all optional dependencies") setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("bpm %s ", subcommand), "Update installed packages", os.Args[2:]) @@ -894,6 +895,7 @@ func updatePackages() { force, _ := currentFlagSet.GetBool("force") yesAll, _ := currentFlagSet.GetBool("yes") noSync, _ := currentFlagSet.GetBool("no-sync") + allowDowngrades, _ := currentFlagSet.GetBool("allow-downgrades") installOptional, _ := currentFlagSet.GetBool("optional") // Check for required permissions @@ -932,7 +934,7 @@ func updatePackages() { } // Create update operation - operation, err := bpmlib.UpdatePackages(rootDir, !noSync, installOptional, force, verbose) + operation, err := bpmlib.UpdatePackages(rootDir, !noSync, allowDowngrades, installOptional, force, verbose) if errors.As(err, &bpmlib.PackageNotFoundErr{}) || errors.As(err, &bpmlib.DependencyNotFoundErr{}) || errors.As(err, &bpmlib.PackageConflictErr{}) { log.Printf("Error: %s", err) exitCode = 1 diff --git a/src/bpmlib/general.go b/src/bpmlib/general.go index ef66a14..3a25aca 100644 --- a/src/bpmlib/general.go +++ b/src/bpmlib/general.go @@ -365,7 +365,7 @@ func CleanupCache(rootDir string, cleanupCompilationFiles, cleanupCompiledPackag } // UpdatePackages fetches the newest versions of all installed packages from -func UpdatePackages(rootDir string, syncDatabase bool, installOptionalDependencies, forceInstallation, verbose bool) (operation *BPMOperation, err error) { +func UpdatePackages(rootDir string, syncDatabase bool, allowDowngrades bool, installOptionalDependencies, forceInstallation, verbose bool) (operation *BPMOperation, err error) { // Sync databases if syncDatabase { err := SyncDatabase(verbose) @@ -419,7 +419,7 @@ func UpdatePackages(rootDir string, syncDatabase bool, installOptionalDependenci return nil, fmt.Errorf("could not get package info for package (%s)", pkg) } else { comparison := CompareVersions(entry.Info.GetFullVersion(), installedInfo.GetFullVersion()) - if comparison > 0 { + if (!allowDowngrades && comparison > 0) || (allowDowngrades && comparison != 0) { operation.AppendAction(&FetchPackageAction{ InstallationReason: GetInstallationReason(pkg, rootDir), DatabaseEntry: entry,