diff --git a/src/cli.zig b/src/cli.zig index db9c889..f7ca5da 100644 --- a/src/cli.zig +++ b/src/cli.zig @@ -143,13 +143,22 @@ fn openRepo() !git.Repository { }; } +fn canonicalPassthroughCmd(cmd: [:0]const u8) [:0]const u8 { + if (std.mem.eql(u8, cmd, "b")) return "branch"; + if (std.mem.eql(u8, cmd, "s")) return "status"; + if (std.mem.eql(u8, cmd, "d")) return "diff"; + if (std.mem.eql(u8, cmd, "l")) return "log"; + return cmd; +} + fn passthrough(args: []const [:0]const u8) !void { - // Build null-terminated argv: ["git", args[1..], null] + // Build null-terminated argv: ["git", canonicalized args[1..], null] const alloc = std.heap.page_allocator; const argv = try alloc.alloc(?[*:0]const u8, args.len + 1); argv[0] = "git"; for (args[1..], 1..) |arg, idx| { - argv[idx] = arg.ptr; + const passthrough_arg = if (idx == 1) canonicalPassthroughCmd(arg) else arg; + argv[idx] = passthrough_arg.ptr; } argv[args.len] = null; diff --git a/tests/conformance.sh b/tests/conformance.sh index 9383b88..68b1d19 100755 --- a/tests/conformance.sh +++ b/tests/conformance.sh @@ -209,10 +209,18 @@ check "log --graph passthrough" \ "git log --graph --oneline -3" \ "$NIT log --graph --oneline -3" +check "short alias l --graph passthrough" \ + "git log --graph --oneline -3" \ + "$NIT l --graph --oneline -3" + check "diff --name-only passthrough" \ "git diff --name-only" \ "$NIT diff --name-only" +check "short alias d --name-only passthrough" \ + "git diff --name-only" \ + "$NIT d --name-only" + check "diff --stat passthrough" \ "git diff --stat" \ "$NIT diff --stat"