diff --git a/changelog.md b/changelog.md index 2846d08..b7242bf 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. -## [unreleased] +## [0.4.0] - 2025-01-20 ### 🚀 Features diff --git a/cmd/search_cmd.go b/cmd/search_cmd.go index 6fe1f68..ca92f53 100644 --- a/cmd/search_cmd.go +++ b/cmd/search_cmd.go @@ -5,6 +5,7 @@ import ( "log" "runtime" "strings" + "sync" pm "system_setup_tool/packagemanager" @@ -57,9 +58,7 @@ var searchCmd = &cobra.Command{ return } - for _, manager := range managers { - searchAndDisplayResults(manager, packageName) - } + searchConcurrently(managers, packageName) }, } @@ -79,3 +78,34 @@ func searchAndDisplayResults(manager pm.PackageManager, packageName string) { displayResults(results, manager.Name()) fmt.Println() } + +func searchConcurrently(managers []pm.PackageManager, packageName string) { + var wg sync.WaitGroup + results := make(chan struct { + manager pm.PackageManager + results []string + }, len(managers)) + + for _, manager := range managers { + wg.Add(1) + go func(m pm.PackageManager) { + defer wg.Done() + searchResults := m.SearchPackage(packageName) + results <- struct { + manager pm.PackageManager + results []string + }{m, searchResults} + }(manager) + } + + go func() { + wg.Wait() + close(results) + }() + + for result := range results { + fmt.Printf("Results from %s:\n", result.manager.Name()) + displayResults(result.results, result.manager.Name()) + fmt.Println() + } +} diff --git a/cmd/update_command.go b/cmd/update_command.go index a6162b5..14c0621 100644 --- a/cmd/update_command.go +++ b/cmd/update_command.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "runtime" + "sync" pm "system_setup_tool/packagemanager" "system_setup_tool/utils" @@ -64,20 +65,55 @@ 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() + 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() +} diff --git a/packagemanager/dnf.go b/packagemanager/dnf.go index d68a59f..6c539b2 100644 --- a/packagemanager/dnf.go +++ b/packagemanager/dnf.go @@ -47,11 +47,8 @@ func (d *DnfManager) RemovePackage(pkg string) error { } func (d *DnfManager) SearchPackage(pkg string) []string { - cmd := "dnf search -y" - fullCmd := fmt.Sprintf("%s %s", cmd, pkg) - command := shell.ExecCommand("sudo", "-S", "sh", "-c", fullCmd) - command.Stdin = strings.NewReader(d.SudoPassword + "\n") - packages, err := command.Output() + cmd := shell.ExecCommand("dnf", "search", pkg) + packages, err := cmd.Output() if err != nil { log.Printf("error fetching %s packages: %v", d.Name(), err) }