package cmd import ( "fmt" "log" "runtime" "sync" 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), Aliases: []string{"u"}, 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 Package Manager": if runtime.GOOS != "windows" { sudoPassword, err := utils.GetSudoPassword() if err != nil { log.Fatal(err) } manager = pm.NewOSManager(sudoPassword) } else { manager = pm.NewOSManager("") } 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) { var managers []pm.PackageManager switch runtime.GOOS { case "linux": sudoPassword, err := utils.GetSudoPassword() if err != nil { log.Fatal(err) } managers = []pm.PackageManager{ pm.NewOSManager(sudoPassword), &pm.HomebrewManager{}, &pm.FlatpakManager{}, &pm.PipxManager{}, } case "windows": managers = []pm.PackageManager{ pm.NewOSManager(""), &pm.WingetManager{}, &pm.ChocoManager{}, &pm.PipxManager{}, } case "darwin": sudoPassword, err := utils.GetSudoPassword() if err != nil { log.Fatal(err) } managers = []pm.PackageManager{ pm.NewOSManager(sudoPassword), &pm.PipxManager{}, } default: log.Println("No Package Managers found") } updateAllConcurrently(managers) }, } func updateAllConcurrently(managers []pm.PackageManager) { var wg sync.WaitGroup for _, m := range managers { wg.Add(1) go func(manager pm.PackageManager) { defer wg.Done() fmt.Printf("Updating %s-Packages\n", manager.Name()) err := manager.UpdateAllPackages() if err != nil { log.Printf("Error updating %s: %v\n", manager.Name(), err) } }(m) } wg.Wait() }