From 14fe71842efd19d509550b53dd7c5d97aa569020 Mon Sep 17 00:00:00 2001 From: EnumDev Date: Thu, 10 Apr 2025 14:38:32 +0300 Subject: [PATCH] Added custom error types --- src/bpm/main.go | 19 ++++++++++++++----- src/bpmlib/errors.go | 31 +++++++++++++++++++++++++++++++ src/bpmlib/general.go | 33 ++++++++++++++++++++------------- 3 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 src/bpmlib/errors.go diff --git a/src/bpm/main.go b/src/bpm/main.go index 8cb250f..1b6a3d1 100644 --- a/src/bpm/main.go +++ b/src/bpm/main.go @@ -2,6 +2,7 @@ package main import ( "bufio" + "errors" "flag" "fmt" "git.enumerated.dev/bubble-package-manager/bpm/src/bpmlib" @@ -237,7 +238,9 @@ func resolveCommand() { // Create installation operation operation, err := bpmlib.InstallPackages(rootDir, ir, reinstallMethod, !noOptional, force, verbose, subcommandArgs...) - if err != nil { + if errors.As(err, &bpmlib.PackageNotFoundErr{}) || errors.As(err, &bpmlib.DependencyNotFoundErr{}) || errors.As(err, &bpmlib.PackageConflictErr{}) { + log.Fatalf("Error: %s", err) + } else if err != nil { log.Fatalf("Error: could not setup operation: %s\n", err) } @@ -280,8 +283,10 @@ func resolveCommand() { // Create update operation operation, err := bpmlib.UpdatePackages(rootDir, !nosync, !noOptional, force, verbose) - if err != nil { - log.Fatalf("Error: could not setuo operation: %s\n", err) + if errors.As(err, &bpmlib.PackageNotFoundErr{}) || errors.As(err, &bpmlib.DependencyNotFoundErr{}) || errors.As(err, &bpmlib.PackageConflictErr{}) { + log.Fatalf("Error: %s", err) + } else if err != nil { + log.Fatalf("Error: could not setup operation: %s\n", err) } // Show operation summary @@ -347,7 +352,9 @@ func resolveCommand() { // Create remove operation operation, err := bpmlib.RemovePackages(rootDir, removeUnused, doCleanup, verbose, subcommandArgs...) - if err != nil { + if errors.As(err, &bpmlib.PackageNotFoundErr{}) || errors.As(err, &bpmlib.DependencyNotFoundErr{}) || errors.As(err, &bpmlib.PackageConflictErr{}) { + log.Fatalf("Error: %s", err) + } else if err != nil { log.Fatalf("Error: could not setup operation: %s\n", err) } @@ -385,7 +392,9 @@ func resolveCommand() { // Create cleanup operation operation, err := bpmlib.CleanupPackages(rootDir, verbose) - if err != nil { + if errors.As(err, &bpmlib.PackageNotFoundErr{}) || errors.As(err, &bpmlib.DependencyNotFoundErr{}) || errors.As(err, &bpmlib.PackageConflictErr{}) { + log.Fatalf("Error: %s", err) + } else if err != nil { log.Fatalf("Error: could not setup operation: %s\n", err) } diff --git a/src/bpmlib/errors.go b/src/bpmlib/errors.go new file mode 100644 index 0000000..b9d193e --- /dev/null +++ b/src/bpmlib/errors.go @@ -0,0 +1,31 @@ +package bpmlib + +import ( + "fmt" + "strings" +) + +type PackageNotFoundErr struct { + packages []string +} + +func (e PackageNotFoundErr) Error() string { + return "The following packages were not found in any repositories: " + strings.Join(e.packages, ", ") +} + +type DependencyNotFoundErr struct { + dependencies []string +} + +func (e DependencyNotFoundErr) Error() string { + return "The following dependencies were not found in any repositories: " + strings.Join(e.dependencies, ", ") +} + +type PackageConflictErr struct { + pkg string + conflicts []string +} + +func (e PackageConflictErr) Error() string { + return fmt.Sprintf("Package (%s) is in conflict with the following packages: %s", e.pkg, strings.Join(e.conflicts, ", ")) +} diff --git a/src/bpmlib/general.go b/src/bpmlib/general.go index dfe51c9..1d5ee80 100644 --- a/src/bpmlib/general.go +++ b/src/bpmlib/general.go @@ -1,11 +1,11 @@ package bpmlib import ( + "errors" "fmt" "log" "os" "slices" - "strings" ) type ReinstallMethod uint8 @@ -28,6 +28,7 @@ func InstallPackages(rootDir string, installationReason InstallationReason, rein } // Resolve packages + pkgsNotFound := make([]string, 0) for _, pkg := range packages { if stat, err := os.Stat(pkg); err == nil && !stat.IsDir() { bpmpkg, err := ReadPackage(pkg) @@ -50,12 +51,14 @@ func InstallPackages(rootDir string, installationReason InstallationReason, rein } else if isVirtual, p := IsVirtualPackage(pkg, rootDir); isVirtual { entry, _, err = GetRepositoryEntry(p) if err != nil { - return nil, fmt.Errorf("could not find package (%s) in any repositor", p) + pkgsNotFound = append(pkgsNotFound, pkg) + continue } } else if e := ResolveVirtualPackage(pkg); e != nil { entry = e } else { - return nil, fmt.Errorf("could not find package (%s) in any repository", pkg) + pkgsNotFound = append(pkgsNotFound, pkg) + continue } if reinstallMethod == ReinstallMethodNone && IsPackageInstalled(entry.Info.Name, rootDir) && GetPackageInfo(entry.Info.Name, rootDir).GetFullVersion() == entry.Info.GetFullVersion() { continue @@ -67,6 +70,11 @@ func InstallPackages(rootDir string, installationReason InstallationReason, rein } } + // Return error if not all packages are found + if len(pkgsNotFound) != 0 { + return nil, PackageNotFoundErr{pkgsNotFound} + } + // Resolve dependencies err = operation.ResolveDependencies(reinstallMethod == ReinstallMethodAll, installOptionalDependencies, verbose) if err != nil { @@ -74,9 +82,9 @@ func InstallPackages(rootDir string, installationReason InstallationReason, rein } if len(operation.UnresolvedDepends) != 0 { if !forceInstallation { - return nil, fmt.Errorf("dependencies (%s) could not be found in any repositories", strings.Join(operation.UnresolvedDepends, ", ")) + return nil, DependencyNotFoundErr{operation.UnresolvedDepends} } else if verbose { - log.Println("Warning: The following dependencies could not be found in any repositories: " + strings.Join(operation.UnresolvedDepends, ", ")) + log.Printf("Warning: %s", DependencyNotFoundErr{operation.UnresolvedDepends}) } } @@ -89,15 +97,14 @@ func InstallPackages(rootDir string, installationReason InstallationReason, rein return nil, fmt.Errorf("could not complete package conflict check: %s", err) } if len(conflicts) > 0 { - if verbose { - for pkg, conflict := range conflicts { - fmt.Printf("%s is in conflict with packages (%s)\n", pkg, strings.Join(conflict, ", ")) - } + err = nil + for pkg, conflict := range conflicts { + err = errors.Join(err, PackageConflictErr{pkg, conflict}) } if !forceInstallation { - return nil, fmt.Errorf("conflicting packages found") + return nil, err } else { - log.Println("Warning: conflicting packages found") + log.Printf("Warning: %s", err) } } @@ -222,9 +229,9 @@ func UpdatePackages(rootDir string, syncDatabase bool, installOptionalDependenci } if len(operation.UnresolvedDepends) != 0 { if !forceInstallation { - return nil, fmt.Errorf("dependencies (%s) could not be found in any repositories", strings.Join(operation.UnresolvedDepends, ", ")) + return nil, DependencyNotFoundErr{operation.UnresolvedDepends} } else if verbose { - log.Printf("Warning: dependencies (%s) could not be found in any repositories\n", strings.Join(operation.UnresolvedDepends, ", ")) + log.Printf("Warning: %s", DependencyNotFoundErr{operation.UnresolvedDepends}) } }