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
This commit is contained in:
Patryk Hegenberg 2025-01-16 22:27:29 +01:00
parent ffd3faadcd
commit c9bf9c9a6f
4 changed files with 240 additions and 130 deletions

24
cmd.go
View file

@ -9,15 +9,30 @@ import (
)
var rootCmd = &cobra.Command{
Use: "package-installer",
Short: "Installiert Pakete basierend auf TOML-Konfiguration",
Use: "system_setup_tool",
Short: "Installs packages based on TOML configuration",
Run: run,
}
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringP("config", "c", "", "Pfad zur Konfigurationsdatei")
rootCmd.PersistentFlags().StringP("config", "c", "", "Path to the configuration file")
viper.BindPFlag("config", rootCmd.PersistentFlags().Lookup("config"))
addCmd.Flags().StringP("name", "n", "", "The name of the package you want to add")
addCmd.Flags().StringP("manager", "m", "", "The package manager you want to add the package to (homebrew|cargo|flatpak|pipx|go)")
addCmd.Flags().Bool("system", false, "Add as a system package")
addCmd.Flags().Bool("headless", false, "Add as a headless system package (only used with --system)")
deleteCmd.Flags().StringP("name", "n", "", "The name of the package you want to delete")
deleteCmd.Flags().StringP("manager", "m", "", "The package manager you want to delete the package from (homebrew|cargo|flatpak|pipx|go)")
deleteCmd.Flags().Bool("system", false, "Delete from system packages")
deleteCmd.Flags().Bool("headless", false, "Delete from headless system packages (only used with --system)")
enableCmd.Flags().Bool("value", true, "Set to true to enable, false to disable")
packageCmd.AddCommand(addCmd, deleteCmd, showCmd, enableCmd)
rootCmd.AddCommand(packageCmd)
}
func initConfig() {
@ -25,11 +40,12 @@ func initConfig() {
viper.SetConfigFile(cfgFile)
} else {
viper.SetConfigName("config")
viper.SetConfigType("toml")
viper.AddConfigPath(".")
}
if err := viper.ReadInConfig(); err != nil {
fmt.Println("Fehler beim Lesen der Konfigurationsdatei:", err)
fmt.Println("Error reading configuration file:", err)
os.Exit(1)
}
}

View file

@ -1,129 +1,31 @@
config = ''
headless = true
[packages]
headless = [
"git",
"curl",
"wget",
"biber",
"bear",
"docker",
"docker-compose",
"zsh",
"npm",
"task",
"tree-sitter-cli",
"python3-pip",
"latexmk",
"luarocks",
"typst-cli",
]
non_headless = [
"flameshot",
"fuzzel",
"hyprcursor",
"hypridle",
"hyprland",
"hyprland-qtutils",
"hyprlock",
"hyprpaper",
"hyprutils",
"kitty",
"mako",
"SwayNotificationCenter",
"SwayNotificationCenter-zsh-completion",
"mpv",
"pidgin",
"remmina",
"thunderbird-i18n-de",
"virt-manager",
"vlc",
"waybar",
"nwg-panel",
"nwg-look",
"xdg-desktop-portal-hyprland",
"zathura",
"zathura-pdf-mupdf",
]
[package_managers.homebrew]
enable = true
packages = [
"fd",
"fzf",
"ripgrep",
"neovim",
"helix",
# "golang",
# "rust",
"node",
"yazi",
"zk",
"bat",
"bottom",
"btop",
"git-cliff",
"glow",
"lazygit",
"goreleaser",
"harlequin",
"mage",
"posting",
"typst",
"wails",
"zoxide",
"lsd",
"jq",
"yq",
"timewarrior",
"tmux",
# "pipx",
"fastfetch",
"stow",
"distrobox",
# "asciidoc",
# "asciidoctor",
]
[package_managers.go]
enable = true
packages = [
"github.com/stefanlogue/meteor",
"golang.org/x/tools/gopls",
"github.com/go-delve/delve/cmd/dlv",
"github.com/air-verse/air",
# "go.senan.xyz/cliphist",
]
[package_managers.cargo]
enable = true
packages = ["typst-cli"]
[package_managers.pipx]
enable = true
packages = ["euporie"]
[package_managers.flatpak]
enable = true
remotes = [
{ name = "flathub", url = "https://flathub.org/repo/flathub.flatpakrepo" },
]
packages = [
"com.spotify.Client",
"us.zoom.Zoom",
"org.zotero.Zotero",
"com.google.AndroidStudio",
"io.freetubeapp.FreeTube",
"com.discordapp.Discord",
"com.nextcloud.desktopclient.nextcloud",
"com.github.tchx84.Flatseal",
"io.github.flattool.Warehouse",
"org.onlyoffice.desktopeditors",
# "com.google.Chrome",
# "org.mozilla.Thunderbird",
]
[dotfiles]
enable = false
git_repo = "https://codeberg.org/Pata1704/dotfiles.git"
git_repo = 'https://codeberg.org/Pata1704/dotfiles.git'
[package_managers]
[package_managers.cargo]
enable = true
packages = ['typst-cli']
[package_managers.flatpak]
enable = true
packages = ['com.spotify.Client', 'us.zoom.Zoom', 'org.zotero.Zotero', 'com.google.AndroidStudio', 'io.freetubeapp.FreeTube', 'com.discordapp.Discord', 'com.nextcloud.desktopclient.nextcloud', 'com.github.tchx84.Flatseal', 'io.github.flattool.Warehouse', 'org.onlyoffice.desktopeditors']
[package_managers.go]
enable = true
packages = ['github.com/stefanlogue/meteor', 'golang.org/x/tools/gopls', 'github.com/go-delve/delve/cmd/dlv', 'github.com/air-verse/air']
[package_managers.homebrew]
enable = true
packages = ['fd', 'fzf', 'ripgrep', 'neovim', 'helix', 'node', 'yazi', 'zk', 'bat', 'bottom', 'btop', 'git-cliff', 'glow', 'lazygit', 'goreleaser', 'harlequin', 'mage', 'posting', 'typst', 'wails', 'zoxide', 'lsd', 'jq', 'yq', 'timewarrior', 'tmux', 'fastfetch', 'stow', 'distrobox']
[package_managers.pipx]
enable = true
packages = ['euporie']
[packages]
headless = ['git', 'curl', 'wget', 'biber', 'bear', 'docker', 'docker-compose', 'zsh', 'npm', 'task', 'tree-sitter-cli', 'python3-pip', 'latexmk', 'luarocks']
non_headless = ['flameshot', 'fuzzel', 'hyprcursor', 'hypridle', 'hyprland', 'hyprland-qtutils', 'hyprlock', 'hyprpaper', 'hyprutils', 'kitty', 'mako', 'SwayNotificationCenter', 'SwayNotificationCenter-zsh-completion', 'mpv', 'pidgin', 'remmina', 'thunderbird-i18n-de', 'virt-manager', 'vlc', 'waybar', 'nwg-panel', 'nwg-look', 'xdg-desktop-portal-hyprland', 'zathura', 'zathura-pdf-mupdf']

2
go.mod
View file

@ -1,4 +1,4 @@
module system_setup
module system_setup_tool
go 1.23.4

192
package_commands.go Normal file
View file

@ -0,0 +1,192 @@
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])
},
}