hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-29 05:00:39 +0200
committerhachem <im@hachem.wtf>2026-08-29 05:00:39 +0200
commit25bdd381d6dcf8581b1391c1c1fa22c108913ccb (patch)
tree638f3c0aa224643da7a7f79e50686790e109d8fc /internal
parent6d44318d728da84e5018bbbdbf69dc3053ffe133 (diff)
add: clean command
Diffstat (limited to 'internal')
-rw-r--r--internal/cli/clean.go74
-rw-r--r--internal/cli/cli.go5
-rw-r--r--internal/cli/commands.go5
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 {