system_setup_tool/package_commands.go
Patryk Hegenberg c9bf9c9a6f feature(cli): add packages command and various subcommands
add commands to handle package management
add -> adds packages
delete -> deletes packages
show -> shows config sorted by package_managers
2025-01-16 22:27:29 +01:00

192 lines
5.2 KiB
Go

package main
import (
"fmt"
"os"
"sort"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var packageCmd = &cobra.Command{
Use: "package",
Short: "Manage packages in the configuration",
}
var addCmd = &cobra.Command{
Use: "add",
Short: "Adds a package to the config.toml",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
manager, _ := cmd.Flags().GetString("manager")
isSystem, _ := cmd.Flags().GetBool("system")
isHeadless, _ := cmd.Flags().GetBool("headless")
if isSystem {
var packages []string
if isHeadless {
packages = viper.GetStringSlice("packages.headless")
} else {
packages = viper.GetStringSlice("packages.non_headless")
}
// Add package to the appropriate list
packages = append(packages, name)
if isHeadless {
viper.Set("packages.headless", packages)
} else {
viper.Set("packages.non_headless", packages)
}
} else {
packages := viper.GetStringSlice(fmt.Sprintf("package_managers.%s.packages", manager))
for _, pkg := range packages {
if pkg == name {
fmt.Printf("Package %s is already present in the configuration for %s\n", name, manager)
return
}
}
packages = append(packages, name)
viper.Set(fmt.Sprintf("package_managers.%s.packages", manager), packages)
}
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package %s has been added to the configuration for %s\n", name, manager)
},
}
var deleteCmd = &cobra.Command{
Use: "delete",
Short: "Deletes a package from the config.toml",
Run: func(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
manager, _ := cmd.Flags().GetString("manager")
isSystem, _ := cmd.Flags().GetBool("system")
isHeadless, _ := cmd.Flags().GetBool("headless")
if isSystem {
var packages []string
var packageType string
if isHeadless {
packages = viper.GetStringSlice("packages.headless")
packageType = "headless"
} else {
packages = viper.GetStringSlice("packages.non_headless")
packageType = "non-headless"
}
for i, pkg := range packages {
if pkg == name {
packages = append(packages[:i], packages[i+1:]...)
if isHeadless {
viper.Set("packages.headless", packages)
} else {
viper.Set("packages.non_headless", packages)
}
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package %s has been deleted from the %s system packages\n", name, packageType)
return
}
}
fmt.Printf("Package %s was not found in the %s system packages\n", name, packageType)
} else {
packages := viper.GetStringSlice(fmt.Sprintf("package_managers.%s.packages", manager))
for i, pkg := range packages {
if pkg == name {
packages = append(packages[:i], packages[i+1:]...)
viper.Set(fmt.Sprintf("package_managers.%s.packages", manager), packages)
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package %s has been deleted from the configuration for %s\n", name, manager)
return
}
}
fmt.Printf("Package %s was not found in the configuration for %s\n", name, manager)
}
},
}
var showCmd = &cobra.Command{
Use: "show",
Short: "Shows the current package configuration",
Run: func(cmd *cobra.Command, args []string) {
packageManagers := viper.GetStringMap("package_managers")
if len(packageManagers) == 0 {
fmt.Println("No package managers configured.")
return
}
var managers []string
for manager := range packageManagers {
managers = append(managers, manager)
}
sort.Strings(managers)
for _, manager := range managers {
fmt.Printf("Package Manager: %s\n", manager)
packages := viper.GetStringSlice(fmt.Sprintf("package_managers.%s.packages", manager))
sort.Strings(packages)
for _, pkg := range packages {
fmt.Printf(" - %s\n", pkg)
}
fmt.Println()
}
fmt.Println("System Packages:")
headless := viper.GetStringSlice("packages.headless")
nonHeadless := viper.GetStringSlice("packages.non_headless")
fmt.Println(" Headless:")
for _, pkg := range headless {
fmt.Printf(" - %s\n", pkg)
}
fmt.Println(" Non-Headless:")
for _, pkg := range nonHeadless {
fmt.Printf(" - %s\n", pkg)
}
},
}
var enableCmd = &cobra.Command{
Use: "enable [package_manager]",
Short: "Enable or disable a package manager (Options: homebrew|go|cargo|pipx|flatpak)",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
manager := args[0]
enable, _ := cmd.Flags().GetBool("value")
if !viper.IsSet(fmt.Sprintf("package_managers.%s", manager)) {
fmt.Printf("Package manager %s not found in configuration\n", manager)
return
}
viper.Set(fmt.Sprintf("package_managers.%s.enable", manager), enable)
if err := viper.WriteConfig(); err != nil {
fmt.Printf("Error writing configuration: %v\n", err)
os.Exit(1)
}
fmt.Printf("Package manager %s has been %s\n", manager, map[bool]string{true: "enabled", false: "disabled"}[enable])
},
}