feat(cli): add concurrent execution of search and update to improve performance

This commit is contained in:
Patryk Hegenberg 2025-01-20 22:10:19 +01:00
parent 0306ad36ef
commit afaf7707aa
4 changed files with 85 additions and 22 deletions

View file

@ -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()
}