Merge pull request 'feat(cli): implement search argument' (#1) from dev/add-search-command-to-package-command into development

Reviewed-on: https://codeberg.org/Pata1704/system_setup/pulls/1
This commit is contained in:
Pata1704 2025-01-17 18:44:33 +00:00
commit c1e913641e
3 changed files with 97 additions and 2 deletions

77
cmd.go
View file

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

View file

@ -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 {

View file

@ -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 {