diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 8bc3b8a..3a2d8da 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -1,8 +1,3 @@ -# This is an example .goreleaser.yml file with some sensible defaults. -# Make sure to check the documentation at https://goreleaser.com - -# The lines below are called `modelines`. See `:help modeline` -# Feel free to remove those if you don't want/need to use them. # yaml-language-server: $schema=https://goreleaser.com/static/schema.json # vim: set ts=2 sw=2 tw=0 fo=cnqoj @@ -10,11 +5,9 @@ version: 2 before: hooks: - # You may remove this if you don't use go modules. - go mod tidy - # you may remove this if you don't need go generate - go generate ./... - - go test ./... + - go test ./... -v builds: - env: @@ -26,7 +19,6 @@ builds: archives: - format: tar.gz - # this name template makes the OS and Arch compatible with the results of `uname`. name_template: >- {{ .ProjectName }}_ {{- title .Os }}_ @@ -34,7 +26,6 @@ archives: {{- else if eq .Arch "386" }}i386 {{- else }}{{ .Arch }}{{ end }} {{- if .Arm }}v{{ .Arm }}{{ end }} - # use zip for windows archives format_overrides: - goos: windows format: zip diff --git a/flatpak.go b/flatpak.go index 736335f..23c8f85 100644 --- a/flatpak.go +++ b/flatpak.go @@ -2,7 +2,9 @@ package main import ( "fmt" + "log" "os/exec" + "strings" ) type FlatpakManager struct { @@ -94,5 +96,11 @@ func (f *FlatpakManager) RemovePackage(pkg string) error { } func (f *FlatpakManager) SearchPackage(pkg string) []string { - return []string{} + cmd := execCommand("flatpak", "search", pkg) + packages, err := cmd.Output() + if err != nil { + log.Printf("error fetching %s packages: %v", f.Name(), err) + } + packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") + return packageList } diff --git a/homebrew.go b/homebrew.go index ef70c0b..9cd259d 100644 --- a/homebrew.go +++ b/homebrew.go @@ -2,6 +2,8 @@ package main import ( "fmt" + "log" + "strings" ) type HomebrewManager struct{} @@ -48,5 +50,11 @@ func (h *HomebrewManager) RemovePackage(pkg string) error { } func (h *HomebrewManager) SearchPackage(pkg string) []string { - return []string{} + cmd := execCommand("brew", "search", pkg) + packages, err := cmd.Output() + if err != nil { + log.Printf("error fetching %s packages: %v", h.Name(), err) + } + packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") + return packageList } diff --git a/install_cmd.go b/install_cmd.go index 7dbef0b..468ab9f 100644 --- a/install_cmd.go +++ b/install_cmd.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "github.com/spf13/cobra" @@ -37,6 +38,7 @@ var installCmd = &cobra.Command{ case "flatpak": manager = &FlatpakManager{} default: + fmt.Println("No PackageManager found") } if err := manager.InstallPackage(packageName); err != nil { log.Printf("error: %v\n", err) diff --git a/osinfo.go b/osinfo.go index 9d2fbb0..bba7397 100644 --- a/osinfo.go +++ b/osinfo.go @@ -40,6 +40,10 @@ func (o *OSManager) Install(packages []string) error { return err } +func (o *OSManager) InstallPackage(pkg string) error { + return installPackage(o.OS.InstallCommand, pkg, o.SudoPassword) +} + func (o *OSManager) InstallBuildEssentials() error { return installBuildEssentials(o.OS, o.SudoPassword) } @@ -48,7 +52,7 @@ func (o *OSManager) InstallSpecialSoftware() error { return o.Model.installSpecialSoftware() } -func (o *OSManager) removePackage(pkg string) error { +func (o *OSManager) RemovePackage(pkg string) error { fullCmd := fmt.Sprintf("%s %s", o.OS.RemoveCommand, pkg) command := execCommand("sudo", "-S", "sh", "-c", fullCmd) command.Stdin = strings.NewReader(o.SudoPassword + "\n") @@ -56,7 +60,22 @@ func (o *OSManager) removePackage(pkg string) error { } func (o *OSManager) SearchPackage(pkg string) []string { - return []string{} + + cmdParts := strings.Fields(o.OS.SearchCommand) + if len(cmdParts) == 0 { + log.Printf("Invalid search command for OS package manager") + return []string{} + } + + cmd := execCommand(cmdParts[0], append(cmdParts[1:], pkg)...) + packages, err := cmd.Output() + if err != nil { + log.Printf("Error fetching %s packages: %v", o.OS.PackageManager, err) + return []string{} + } + + packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") + return packageList } type OS struct { diff --git a/search_cmd.go b/search_cmd.go index f82a5e0..8514355 100644 --- a/search_cmd.go +++ b/search_cmd.go @@ -15,16 +15,34 @@ var searchCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { packageName := args[0] managerName, _ := cmd.Flags().GetString("manager") - // var manager PackageManager - if managerName == "" { - managers := []string{"brew", "os", "flatpak"} + if managerName == "os" { + managerName = "OS Package Manager" + } + opSys, err := getLinuxDistribution() + if err != nil { + log.Printf("error getting OS information: %v", err) + return + } - for _, manager := range managers { - fmt.Printf("Searching in %s:\n", manager) - results := searchPackage(packageName, manager) - displayResults(results, manager) - fmt.Println() + managers := []PackageManager{ + NewOSManager(opSys, "", nil), + &HomebrewManager{}, + &FlatpakManager{}, + } + + if managerName != "" { + for _, m := range managers { + if strings.EqualFold(m.Name(), managerName) { + searchAndDisplayResults(m, packageName) + return + } } + fmt.Printf("Not supported for '%s'\n", managerName) + return + } + + for _, manager := range managers { + searchAndDisplayResults(manager, packageName) } }, } @@ -39,46 +57,9 @@ func displayResults(results []string, manager string) { } } -func searchPackage(packageName, manager string) []string { - switch manager { - case "brew": - cmd := execCommand("brew", "search", packageName) - packages, err := cmd.Output() - if err != nil { - log.Printf("error fetching %s packages: %v", manager, err) - } - packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") - return packageList - case "os": - opSys, err := getLinuxDistribution() - if err != nil { - log.Printf("Error getting OS information: %v", err) - return []string{} - } - - cmdParts := strings.Fields(opSys.SearchCommand) - if len(cmdParts) == 0 { - log.Printf("Invalid search command for OS package manager") - return []string{} - } - - cmd := execCommand(cmdParts[0], append(cmdParts[1:], packageName)...) - packages, err := cmd.Output() - if err != nil { - log.Printf("Error fetching %s packages: %v", manager, err) - return []string{} - } - - packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") - return packageList - case "flatpak": - cmd := execCommand("flatpak", "search", packageName) - packages, err := cmd.Output() - if err != nil { - log.Printf("error fetching %s packages: %v", manager, err) - } - packageList := strings.Split(strings.TrimSpace(string(packages)), "\n") - return packageList - } - return []string{} +func searchAndDisplayResults(manager PackageManager, packageName string) { + fmt.Printf("Searching in %s:\n", manager.Name()) + results := manager.SearchPackage(packageName) + displayResults(results, manager.Name()) + fmt.Println() } diff --git a/utils_test.go b/utils_test.go index 20dcde6..ffd2eaa 100644 --- a/utils_test.go +++ b/utils_test.go @@ -53,7 +53,6 @@ func TestInstallWithProgress(t *testing.T) { } } -// MockPackageManager implementiert das PackageManager Interface für Tests type MockPackageManager struct { packages []string installedPackages []string @@ -76,3 +75,11 @@ func (m *MockPackageManager) InstallManager() error { func (m *MockPackageManager) Name() string { return "MockManager" } + +func (m *MockPackageManager) RemovePackage(pkg string) error { + return nil +} + +func (m *MockPackageManager) SearchPackage(pkg string) []string { + return nil +}