2 Commits

Author SHA1 Message Date
spencer 997f11b257 perf: Added a pre-alloc opportunity. 2026-07-03 22:12:08 -04:00
spencer f5624e91f1 perf: Added #no_bounds_check to ssh parsers. 2026-07-03 21:43:06 -04:00
3 changed files with 35 additions and 37 deletions
+4 -7
View File
@@ -6,17 +6,14 @@
3. procedures should be ordered by use, main at the top, then in the order they are called from main.
4. Check for prealloc opportunities. i.e. `make([dynamic]string)` -> `make([dynamic]string, 5)`.
4. Test all command branches.
5. Test all command branches.
5. Generate md and man pages again.
6. Generate md and man pages again.
6. Bash Shell completion
7. Bash Shell completion
7. Add tests for untested commands.
8. Add tests for untested commands.
9. Audit ssh.odin for places where `#no_bounds_check` would be appropriate.
## Double-check AI output
+20 -25
View File
@@ -68,76 +68,71 @@ GLOBAL_FLAGS: bit_set[Flag_Type] = {.Help, .Config_File, .Color}
COMMANDS := []CommandInfo {
{
name = "init",
name = "init",
usage = "envr init",
short = "Set up envr",
long = `The init command generates your initial config and saves it to
long = `The init command generates your initial config and saves it to
~/.envr/config in JSON format.\n\nDuring setup, you will be prompted to select one or more ssh keys with which to
encrypt your databse. **Make 100% sure** that you have **a remote copy** of this
key somewhere, otherwise your data could be lost forever.`,
flags = GLOBAL_FLAGS + {.Force},
},
{
name = "scan",
name = "scan",
usage = "envr scan",
short = "Find and select .env files for backup",
flags = GLOBAL_FLAGS,
},
{
name = "sync",
name = "sync",
usage = "envr sync",
short = "Update or restore your env backups",
flags = GLOBAL_FLAGS + {.Output},
},
{
name = "backup",
usage = "envr backup <path>",
short = "Import a .env file into envr",
name = "backup",
usage = "envr backup <path>",
short = "Import a .env file into envr",
aliases = {"add"},
flags = GLOBAL_FLAGS,
args = {{name = "path", completion = "untracked-paths"}},
flags = GLOBAL_FLAGS,
args = {{name = "path", completion = "untracked-paths"}},
},
{
name = "restore",
name = "restore",
usage = "envr restore <path>",
short = "Restore a .env file from the database",
flags = GLOBAL_FLAGS,
args = {{name = "path", completion = "tracked-paths"}},
args = {{name = "path", completion = "tracked-paths"}},
},
{
name = "list",
name = "list",
usage = "envr list",
short = "View your tracked files",
flags = GLOBAL_FLAGS + {.Output},
},
{
name = "remove",
name = "remove",
usage = "envr remove <path>",
short = "Remove a .env file from your database",
flags = GLOBAL_FLAGS,
args = {{name = "path", completion = "tracked-paths"}},
args = {{name = "path", completion = "tracked-paths"}},
},
{
name = "check",
name = "check",
usage = "envr check [path]",
short = "Check if files are backed up",
flags = GLOBAL_FLAGS,
args = {{name = "path", optional = true}},
args = {{name = "path", optional = true}},
},
{name = "version", usage = "envr version", short = "Show envr's version", flags = {.Help}},
{
name = "version",
usage = "envr version",
short = "Show envr's version",
flags = {.Help},
},
{
name = "edit-config",
name = "edit-config",
usage = "envr edit-config",
short = "Edit your config with your default editor",
flags = GLOBAL_FLAGS,
},
{
name = "nushell-completion",
name = "nushell-completion",
usage = "envr nushell-completion",
short = "Generate custom completions for nushell",
flags = {.Help},
@@ -160,7 +155,7 @@ parse_args :: proc(args: []string, out: io.Stream, err: io.Stream) -> (cmd: Comm
}
cmd.name = args[1]
cmd.args = make([dynamic]string)
cmd.args = make([dynamic]string, 0, len(args[2:]))
overflow := parse_flags(&cmd.flags, args[2:])
for arg in overflow {
+11 -5
View File
@@ -164,20 +164,26 @@ is_ed25519_key :: proc(
return ok, nil
}
read_wire_string :: proc(data: ^[]u8) -> (s: []u8, ok: bool) {
if len(data^) < 4 do return
read_wire_string :: proc(data: ^[]u8) -> (s: []u8, ok: bool) #no_bounds_check {
if len(data^) < 4 {
return
}
length := endian.get_u32(data^[:4], .Big) or_return
data^ = data^[4:]
if len(data^) < int(length) do return
if len(data^) < int(length) {
return
}
s = data^[:int(length)]
data^ = data^[int(length):]
ok = true
return
}
read_wire_u32 :: proc(data: ^[]u8) -> (v: u32, ok: bool) {
if len(data^) < 4 do return
read_wire_u32 :: proc(data: ^[]u8) -> (v: u32, ok: bool) #no_bounds_check {
if len(data^) < 4 {
return
}
v = endian.get_u32(data^[:4], .Big) or_return
data^ = data^[4:]
ok = true