diff options
| author | hachem <im@hachem.wtf> | 2026-08-29 05:00:39 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-29 05:00:39 +0200 |
| commit | 25bdd381d6dcf8581b1391c1c1fa22c108913ccb (patch) | |
| tree | 638f3c0aa224643da7a7f79e50686790e109d8fc | |
| parent | 6d44318d728da84e5018bbbdbf69dc3053ffe133 (diff) | |
add: clean command
| -rw-r--r-- | internal/cli/clean.go | 74 | ||||
| -rw-r--r-- | internal/cli/cli.go | 5 | ||||
| -rw-r--r-- | internal/cli/commands.go | 5 |
3 files changed, 83 insertions, 1 deletions
diff --git a/internal/cli/clean.go b/internal/cli/clean.go new file mode 100644 index 0000000..65e9123 --- /dev/null +++ b/internal/cli/clean.go @@ -0,0 +1,74 @@ +package cli + +import ( + "os" + "path/filepath" + "sort" + "strings" + + tea "github.com/charmbracelet/bubbletea" + + "github.com/hachem-wtf/benson/internal/config" +) + +const cleanUsage = "Usage: clean generated | clean latest | clean all" + +func runClean(m *model) tea.Cmd { + if len(m.args) == 0 { + return tea.Println(mutedStyle.Render(cleanUsage)) + } + + switch m.args[0] { + case "generated": + return tea.Println(cleanGenerated()) + case "latest": + return tea.Println(cleanLatest(m.cfg)) + case "all": + return tea.Println(cleanGenerated() + "\n" + cleanLatest(m.cfg)) + default: + return tea.Println(mutedStyle.Render(cleanUsage)) + } +} + +func cleanGenerated() string { + if _, err := os.Stat(serverDir); err != nil { + return mutedStyle.Render("Server directory doesn't exist.") + } + if err := os.RemoveAll(serverDir); err != nil { + return errorStyle.Render("Failed to remove server directory: " + err.Error()) + } + return successStyle.Render("Removed server directory.") +} + +func cleanLatest(cfg *config.Config) string { + if cfg.BackupLocation == "" { + return errorStyle.Render("backup_location must be set in config.") + } + if _, err := os.Stat(cfg.BackupLocation); err != nil { + return mutedStyle.Render("Backup directory doesn't exist.") + } + + entries, err := os.ReadDir(cfg.BackupLocation) + if err != nil { + return errorStyle.Render("Failed to read backup directory: " + err.Error()) + } + + var zips []string + for _, e := range entries { + name := e.Name() + if strings.HasPrefix(name, "backup_") && strings.HasSuffix(name, ".zip") { + zips = append(zips, name) + } + } + if len(zips) == 0 { + return mutedStyle.Render("No backup files found.") + } + + sort.Strings(zips) + latest := zips[len(zips)-1] + + if err := os.Remove(filepath.Join(cfg.BackupLocation, latest)); err != nil { + return errorStyle.Render("Failed to remove latest backup: " + err.Error()) + } + return successStyle.Render("Removed latest backup: ") + latest +} diff --git a/internal/cli/cli.go b/internal/cli/cli.go index fecf64b..d019730 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -30,6 +30,7 @@ type model struct { spin spinner.Model commands []command + args []string busy bool quitting bool events chan tea.Msg @@ -142,7 +143,9 @@ func (m *model) submit() tea.Cmd { echo := tea.Println(promptStyle.Render("benson ❯ ") + raw) - name := strings.ToLower(strings.Fields(raw)[0]) + fields := strings.Fields(strings.ToLower(raw)) + name := fields[0] + m.args = fields[1:] if name == "?" { name = "help" } diff --git a/internal/cli/commands.go b/internal/cli/commands.go index fc620c6..f50036c 100644 --- a/internal/cli/commands.go +++ b/internal/cli/commands.go @@ -35,6 +35,11 @@ func defaultCommands() []command { run: runMerge, }, { + name: "clean", + desc: "Remove generated files and/or the latest backup (generated|latest|all)", + run: runClean, + }, + { name: "help", desc: "Show available commands", run: func(m *model) tea.Cmd { |
