From f39051f93d2de8e5e4ba53440b8d0837f2b4d558 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Sun, 19 Jan 2025 22:21:28 +0100 Subject: [PATCH] feat(cli): add update and update-all command --- cmd/cmd.go | 4 +- cmd/install_cmd.go | 7 ++- cmd/remove_cmd.go | 7 ++- cmd/search_cmd.go | 5 +- cmd/update_command.go | 81 ++++++++++++++++++++++++++++++++ packagemanager/cargo.go | 13 ++++- packagemanager/flatpak.go | 10 ++++ packagemanager/golang.go | 13 ++++- packagemanager/homebrew.go | 10 ++++ packagemanager/os.go | 38 +++++++++++++++ packagemanager/packagemanager.go | 2 + packagemanager/pipx.go | 10 ++++ 12 files changed, 192 insertions(+), 8 deletions(-) create mode 100644 cmd/update_command.go diff --git a/cmd/cmd.go b/cmd/cmd.go index 102668c..c940ea8 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -38,8 +38,10 @@ func init() { searchCmd.Flags().StringP("manager", "m", "", "The package manager you want to search a package with. (Options: os|homebrew|flatpak)") + updateCmd.Flags().StringP("manager", "m", "os", "The package manager you want to update packages with. (Options: os|homebrew|pipx|flatpak)") + packageCmd.AddCommand(addCmd, deleteCmd, showCmd, enableCmd) - RootCmd.AddCommand(packageCmd, searchCmd, installCmd, removeCmd) + RootCmd.AddCommand(packageCmd, searchCmd, installCmd, removeCmd, updateCmd, updateAllCmd) } func initConfig() { diff --git a/cmd/install_cmd.go b/cmd/install_cmd.go index 6b8deaa..b31c3b2 100644 --- a/cmd/install_cmd.go +++ b/cmd/install_cmd.go @@ -18,6 +18,11 @@ var installCmd = &cobra.Command{ packageName := args[0] managerName, _ := cmd.Flags().GetString("manager") var manager pm.PackageManager + if managerName == "os" { + managerName = "OS Package Manager" + } else if managerName == "brew" { + managerName = "homebrew" + } switch managerName { case "os": sudoPassword, err := utils.GetSudoPassword() @@ -28,7 +33,7 @@ var installCmd = &cobra.Command{ if err := osManager.Install([]string{packageName}); err != nil { log.Printf("error: %v\n", err) } - case "homebrew", "brew": + case "homebrew": manager = &pm.HomebrewManager{} case "cargo": manager = &pm.CargoManager{} diff --git a/cmd/remove_cmd.go b/cmd/remove_cmd.go index defd1b5..a41ff61 100644 --- a/cmd/remove_cmd.go +++ b/cmd/remove_cmd.go @@ -18,6 +18,11 @@ var removeCmd = &cobra.Command{ packageName := args[0] managerName, _ := cmd.Flags().GetString("manager") var manager pm.PackageManager + if managerName == "os" { + managerName = "OS Package Manager" + } else if managerName == "brew" { + managerName = "homebrew" + } switch managerName { case "os": sudoPassword, err := utils.GetSudoPassword() @@ -28,7 +33,7 @@ var removeCmd = &cobra.Command{ if err := osManager.Install([]string{packageName}); err != nil { log.Printf("error: %v\n", err) } - case "homebrew", "brew": + case "homebrew": manager = &pm.HomebrewManager{} case "cargo": manager = &pm.CargoManager{} diff --git a/cmd/search_cmd.go b/cmd/search_cmd.go index 2536fea..969f08c 100644 --- a/cmd/search_cmd.go +++ b/cmd/search_cmd.go @@ -18,6 +18,8 @@ var searchCmd = &cobra.Command{ managerName, _ := cmd.Flags().GetString("manager") if managerName == "os" { managerName = "OS Package Manager" + } else if managerName == "brew" { + managerName = "homebrew" } managers := []pm.PackageManager{ @@ -27,9 +29,6 @@ var searchCmd = &cobra.Command{ } if managerName != "" { - if managerName == "brew" { - managerName = "homebrew" - } for _, m := range managers { if strings.EqualFold(m.Name(), managerName) { searchAndDisplayResults(m, packageName) diff --git a/cmd/update_command.go b/cmd/update_command.go new file mode 100644 index 0000000..ebb23b2 --- /dev/null +++ b/cmd/update_command.go @@ -0,0 +1,81 @@ +package cmd + +import ( + "fmt" + "log" + pm "system_setup_tool/packagemanager" + "system_setup_tool/utils" + + "github.com/spf13/cobra" +) + +var updateCmd = &cobra.Command{ + Use: "update [package_name]", + Short: "update a package with the specified package manager.", + Long: "update a package with the specified package manager.\nIf no package specified, all packages for the package manager will be updated", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + packageName := args[0] + managerName, _ := cmd.Flags().GetString("manager") + var manager pm.PackageManager + if managerName == "os" { + managerName = "OS Package Manager" + } else if managerName == "brew" { + managerName = "homebrew" + } + + switch managerName { + case "os": + sudoPassword, err := utils.GetSudoPassword() + if err != nil { + log.Fatal(err) + } + osManager := pm.NewOSManager(sudoPassword) + if err := osManager.Install([]string{packageName}); err != nil { + log.Printf("error: %v\n", err) + } + case "homebrew": + manager = &pm.HomebrewManager{} + case "cargo": + manager = &pm.CargoManager{} + case "pipx": + manager = &pm.PipxManager{} + case "flatpak": + manager = &pm.FlatpakManager{} + default: + fmt.Println("No PackageManager found") + return + } + if packageName != "" { + if err := manager.UpdatePackage(packageName); err != nil { + log.Printf("error: %v\n", err) + } + } else { + if err := manager.UpdateAllPackages(); err != nil { + log.Printf("error: %v\n", err) + } + } + }, +} + +var updateAllCmd = &cobra.Command{ + Use: "update-all", + Short: "update all packages with all package managers.", + Run: func(cmd *cobra.Command, args []string) { + sudoPassword, err := utils.GetSudoPassword() + if err != nil { + log.Fatal(err) + } + + managers := []pm.PackageManager{ + pm.NewOSManager(sudoPassword), + &pm.HomebrewManager{}, + &pm.FlatpakManager{}, + &pm.PipxManager{}, + } + for _, m := range managers { + fmt.Printf("Updating %s-Packages\n", m.Name()) + m.UpdateAllPackages() + } + }, +} diff --git a/packagemanager/cargo.go b/packagemanager/cargo.go index 9623a89..d99a0f5 100644 --- a/packagemanager/cargo.go +++ b/packagemanager/cargo.go @@ -1,6 +1,9 @@ package packagemanager -import "system_setup_tool/internal/shell" +import ( + "fmt" + "system_setup_tool/internal/shell" +) type CargoManager struct{} @@ -45,3 +48,11 @@ func (c *CargoManager) RemovePackage(pkg string) error { func (c *CargoManager) SearchPackage(pkg string) []string { return []string{} } + +func (c *CargoManager) UpdatePackage(pkg string) error { + return fmt.Errorf("update not supported") +} + +func (c *CargoManager) UpdateAllPackages() error { + return fmt.Errorf("update not supported") +} diff --git a/packagemanager/flatpak.go b/packagemanager/flatpak.go index 4c30842..2f4a72b 100644 --- a/packagemanager/flatpak.go +++ b/packagemanager/flatpak.go @@ -116,3 +116,13 @@ func (f *FlatpakManager) SearchPackage(pkg string) []string { packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") return packageList } + +func (f *FlatpakManager) UpdatePackage(pkg string) error { + cmd := shell.ExecCommand("flatpak", "update", "-y", pkg) + return cmd.Run() +} + +func (f *FlatpakManager) UpdateAllPackages() error { + cmd := shell.ExecCommand("flatpak", "update", "-y") + return cmd.Run() +} diff --git a/packagemanager/golang.go b/packagemanager/golang.go index 9392f89..87d779f 100644 --- a/packagemanager/golang.go +++ b/packagemanager/golang.go @@ -1,6 +1,9 @@ package packagemanager -import "system_setup_tool/internal/shell" +import ( + "fmt" + "system_setup_tool/internal/shell" +) type GolangManager struct{} @@ -45,3 +48,11 @@ func (g *GolangManager) RemovePackage(pkg string) error { func (g *GolangManager) SearchPackage(pkg string) []string { return []string{} } + +func (g *GolangManager) UpdatePackage(pkg string) error { + return fmt.Errorf("update not supported") +} + +func (g *GolangManager) UpdateAllPackages() error { + return fmt.Errorf("update not supported") +} diff --git a/packagemanager/homebrew.go b/packagemanager/homebrew.go index 93cbcd6..2baa2f2 100644 --- a/packagemanager/homebrew.go +++ b/packagemanager/homebrew.go @@ -59,3 +59,13 @@ func (h *HomebrewManager) SearchPackage(pkg string) []string { packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") return packageList } + +func (h *HomebrewManager) UpdatePackage(pkg string) error { + cmd := shell.ExecCommand("brew", "upgrade", pkg) + return cmd.Run() +} + +func (h *HomebrewManager) UpdateAllPackages() error { + cmd := shell.ExecCommand("brew", "update") + return cmd.Run() +} diff --git a/packagemanager/os.go b/packagemanager/os.go index e337347..48f1934 100644 --- a/packagemanager/os.go +++ b/packagemanager/os.go @@ -74,6 +74,20 @@ func (o *OSManager) SearchPackage(pkg string) []string { return packageList } +func (o *OSManager) UpdatePackage(pkg string) error { + fullCmd := fmt.Sprintf("%s %s", o.OS.UpdateCommand, pkg) + command := shell.ExecCommand("sudo", "-S", "sh", "-c", fullCmd) + command.Stdin = strings.NewReader(o.SudoPassword + "\n") + return command.Run() +} + +func (o *OSManager) UpdateAllPackages() error { + fullCmd := fmt.Sprintf("%s", o.OS.UpdateCommand) + command := shell.ExecCommand("sudo", "-S", "sh", "-c", fullCmd) + command.Stdin = strings.NewReader(o.SudoPassword + "\n") + return command.Run() +} + type OS struct { ID string Name string @@ -82,6 +96,7 @@ type OS struct { InstallCommand string SearchCommand string RemoveCommand string + UpdateCommand string } func parseOsRelease(osRelease string) *OS { @@ -91,6 +106,9 @@ func parseOsRelease(osRelease string) *OS { result.Version = "Unknown" result.PackageManager = "Unkown" result.InstallCommand = "Unkown" + result.SearchCommand = "Unkown" + result.RemoveCommand = "Unkown" + result.UpdateCommand = "Unkown" lines := strings.Split(osRelease, "\n") @@ -120,6 +138,10 @@ func parseOsRelease(osRelease string) *OS { if err != nil { log.Fatal(err) } + err = result.getUpdateCommand() + if err != nil { + log.Fatal(err) + } return &result } @@ -209,6 +231,22 @@ func (os *OS) getDeleteCommand() error { } } +func (os *OS) getUpdateCommand() error { + switch os.PackageManager { + case "apt": + os.UpdateCommand = "apt update" + return nil + case "pacman": + os.UpdateCommand = "pacman -S" + return nil + case "dnf": + os.UpdateCommand = "dnf update" + return nil + default: + return fmt.Errorf("no install command found for package manager: %s", os.ID) + } +} + func InstallBuildEssentials(os *OS, sudoPassword string) error { var command string switch os.PackageManager { diff --git a/packagemanager/packagemanager.go b/packagemanager/packagemanager.go index 48362d2..8350beb 100644 --- a/packagemanager/packagemanager.go +++ b/packagemanager/packagemanager.go @@ -6,5 +6,7 @@ type PackageManager interface { InstallManager() error RemovePackage(pkg string) error SearchPackage(pkg string) []string + UpdatePackage(pkg string) error + UpdateAllPackages() error Name() string } diff --git a/packagemanager/pipx.go b/packagemanager/pipx.go index a4e1716..c8711ec 100644 --- a/packagemanager/pipx.go +++ b/packagemanager/pipx.go @@ -46,3 +46,13 @@ func (p *PipxManager) RemovePackage(pkg string) error { func (p *PipxManager) SearchPackage(pkg string) []string { return []string{} } + +func (p *PipxManager) UpdatePackage(pkg string) error { + cmd := shell.ExecCommand("pipx", "upgrade", pkg) + return cmd.Run() +} + +func (p *PipxManager) UpdateAllPackages() error { + cmd := shell.ExecCommand("pipx", "upgrade-all") + return cmd.Run() +}