From 8a14b72c5b8555b3c762f220cba1d9db8baaaa95 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Fri, 17 Jan 2025 10:50:48 +0100 Subject: [PATCH] feat(cli): implement search argument --- cmd.go | 77 ++++++++++++++++++++++++++++++++++++++++++++- osinfo.go | 21 +++++++++++++ package_commands.go | 1 - 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/cmd.go b/cmd.go index 3658cb3..67d69b2 100644 --- a/cmd.go +++ b/cmd.go @@ -2,7 +2,10 @@ package main import ( "fmt" + "log" "os" + "os/exec" + "strings" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -14,6 +17,24 @@ var rootCmd = &cobra.Command{ Run: run, } +var searchCmd = &cobra.Command{ + Use: "search [package_name]", + Short: "Search for a package across package managers (will search in os|flatpak|homebrew)", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + packageName := args[0] + + managers := []string{"brew", "os", "flatpak"} + + for _, manager := range managers { + fmt.Printf("Searching in %s:\n", manager) + results := searchPackage(packageName, manager) + displayResults(results, manager) + fmt.Println() + } + }, +} + func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringP("config", "c", "", "Path to the configuration file") @@ -32,7 +53,7 @@ func init() { enableCmd.Flags().Bool("value", true, "Set to true to enable, false to disable") packageCmd.AddCommand(addCmd, deleteCmd, showCmd, enableCmd) - rootCmd.AddCommand(packageCmd) + rootCmd.AddCommand(packageCmd, searchCmd) } func initConfig() { @@ -49,3 +70,57 @@ func initConfig() { os.Exit(1) } } + +func displayResults(results []string, manager string) { + if len(results) == 0 { + fmt.Printf("No results found in %s\n", manager) + return + } + for _, result := range results { + fmt.Printf("- %s\n", result) + } +} + +func searchPackage(packageName, manager string) []string { + switch manager { + case "brew": + cmd := exec.Command("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 := exec.Command(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 := exec.Command("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{"Beispielpaket 1", "Beispielpaket 2"} // Platzhalter +} diff --git a/osinfo.go b/osinfo.go index 195dc4c..dad41ef 100644 --- a/osinfo.go +++ b/osinfo.go @@ -54,6 +54,7 @@ type OS struct { Version string PackageManager string InstallCommand string + SearchCommand string // TODO: has to be implemented } func parseOsRelease(osRelease string) *OS { @@ -88,6 +89,10 @@ func parseOsRelease(osRelease string) *OS { if err != nil { log.Fatal(err) } + err = result.getSearchCommand() + if err != nil { + log.Fatal(err) + } return &result } @@ -145,6 +150,22 @@ func (os *OS) getInstallCommand() error { } } +func (os *OS) getSearchCommand() error { + switch os.PackageManager { + case "apt": + os.SearchCommand = "apt search" + return nil + case "pacman": + os.SearchCommand = "pacman -Ss" + return nil + case "dnf": + os.SearchCommand = "dnf search" + 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/package_commands.go b/package_commands.go index 29057f3..a73126d 100644 --- a/package_commands.go +++ b/package_commands.go @@ -31,7 +31,6 @@ var addCmd = &cobra.Command{ packages = viper.GetStringSlice("packages.non_headless") } - // Add package to the appropriate list packages = append(packages, name) if isHeadless {