From 83b940337cfb15f28bb20d22ac0da748d9e0eb79 Mon Sep 17 00:00:00 2001 From: Spencer Brower Date: Thu, 11 Jun 2026 21:20:28 -0400 Subject: [PATCH] refactor(odin): Ported remove command. --- cli.odin | 1 + cmd_remove.odin | 42 ++++++++++++++++++++++++++++++++++++++++++ db.odin | 26 ++++++++++++++++++++++++++ main.odin | 2 ++ stubs.odin | 4 ---- 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 cmd_remove.odin diff --git a/cli.odin b/cli.odin index a585741..37dc0dd 100644 --- a/cli.odin +++ b/cli.odin @@ -41,6 +41,7 @@ IMPLEMENTED_COMMANDS := []string{ "list", "backup", "add", + "remove", } parse_args :: proc() -> (cmd: Command, ok: bool) { diff --git a/cmd_remove.odin b/cmd_remove.odin new file mode 100644 index 0000000..46f9d07 --- /dev/null +++ b/cmd_remove.odin @@ -0,0 +1,42 @@ +package main + +import "core:fmt" +import "core:path/filepath" +import "core:strings" + +cmd_remove :: proc(cmd: ^Command) { + if len(cmd.args) != 1 { + fmt.println("Usage: envr remove ") + return + } + + path := cmd.args[0] + if len(strings.trim_space(path)) == 0 { + fmt.println("Error: No path provided") + return + } + + abs_path: string + if filepath.is_abs(path) { + abs_path = path + } else { + resolved, abs_err := filepath.abs(path) + if abs_err != nil { + fmt.printf("Error getting absolute path: %v\n", abs_err) + return + } + abs_path = resolved + } + + db, db_ok := db_open() + if !db_ok { + return + } + defer db_close(&db) + + if !db_delete(&db, abs_path) { + return + } + + fmt.printf("Removed %s from the database\n", abs_path) +} diff --git a/db.odin b/db.odin index 72864d0..93ce4c1 100644 --- a/db.odin +++ b/db.odin @@ -392,6 +392,32 @@ db_insert :: proc(d: ^Db, file: EnvFile) -> bool { return true } +db_delete :: proc(d: ^Db, path: string) -> bool { + sql := "DELETE FROM envr_env_files WHERE path = ?" + stmt: ^rawptr + rc := sqlite.prepare_v2(d.db, string_to_cstring(sql), -1, &stmt, nil) + if rc != sqlite.OK { + fmt.printf("Error preparing delete: %s\n", sqlite.db_errmsg(d.db)) + return false + } + defer sqlite.finalize(stmt) + + rc = sqlite.bind_text(stmt, 1, string_to_cstring(path), -1, nil) + rc = sqlite.step(stmt) + if rc != sqlite.DONE { + fmt.printf("Error deleting: %s\n", sqlite.db_errmsg(d.db)) + return false + } + + if sqlite.changes(d.db) == 0 { + fmt.printf("No file found with path: %s\n", path) + return false + } + + d.changed = true + return true +} + cstring_to_string :: proc(cs: cstring) -> string { if cs == nil { return "" diff --git a/main.odin b/main.odin index dd2fb7c..2df6b02 100644 --- a/main.odin +++ b/main.odin @@ -25,6 +25,8 @@ main :: proc() { cmd_list(&cmd) case "backup", "add": cmd_backup(&cmd) + case "remove": + cmd_remove(&cmd) case: fmt.printf("Unknown command: %s\n", cmd.name) print_usage() diff --git a/stubs.odin b/stubs.odin index cb22840..43baa01 100644 --- a/stubs.odin +++ b/stubs.odin @@ -18,10 +18,6 @@ cmd_restore :: proc(cmd: ^Command) { fmt.println("TODO: restore") } -cmd_remove :: proc(cmd: ^Command) { - fmt.println("TODO: remove") -} - cmd_check :: proc(cmd: ^Command) { fmt.println("TODO: check") }