From c9bf9c9a6ff3bb1ab9d54f133680306ffc081ae8 Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 16 Jan 2025 22:27:29 +0100 Subject: [PATCH] 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 --- cmd.go | 24 +++++- config.toml | 152 +++++++---------------------------- go.mod | 2 +- package_commands.go | 192 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 240 insertions(+), 130 deletions(-) create mode 100644 package_commands.go diff --git a/cmd.go b/cmd.go index 658b3b8..3658cb3 100644 --- a/cmd.go +++ b/cmd.go @@ -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) } } diff --git a/config.toml b/config.toml index de478c8..e3f63a0 100644 --- a/config.toml +++ b/config.toml @@ -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'] diff --git a/go.mod b/go.mod index 3bb16b2..f283e32 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module system_setup +module system_setup_tool go 1.23.4 diff --git a/package_commands.go b/package_commands.go new file mode 100644 index 0000000..29057f3 --- /dev/null +++ b/package_commands.go @@ -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]) + }, +}