diff --git a/builtin/worktree.c b/builtin/worktree.c index 214de50d4c..e5b7d6f5ec 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -768,7 +768,7 @@ static char *dwim_branch(const char *path, char **new_branch) int n; int branch_exists; const char *s = worktree_basename(path, &n); - char *branchname = xstrndup(s, n); + char *branchname = xmemdupz(s, path + n - s); struct strbuf ref = STRBUF_INIT; branch_exists = !check_branch_ref(&ref, branchname) && @@ -877,7 +877,7 @@ static int add(int ac, const char **av, const char *prefix, if (opts.orphan && !new_branch) { int n; const char *s = worktree_basename(path, &n); - new_branch = new_branch_to_free = xstrndup(s, n); + new_branch = new_branch_to_free = xmemdupz(s, path + n - s); } else if (opts.orphan) { ; /* no-op */ } else if (opts.detach) { diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index 4ffdd56fb4..9542a17cf3 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -298,6 +298,11 @@ test_expect_success '"add" with omitted' ' test_cmp_rev HEAD bat ' +test_expect_success '"add" with trailing slash and omitted' ' + git worktree add waffle/bit/ && + test_cmp_rev HEAD bit +' + test_expect_success '"add" checks out existing branch of dwimd name' ' git branch dwim HEAD~1 && git worktree add dwim && @@ -388,6 +393,14 @@ test_expect_success '"add --orphan (no -b)"' ' test_cmp expected actual ' +test_expect_success '"add --orphan with trailing slash (no -b)"' ' + test_when_finished "git worktree remove -f -f neworphan" && + git worktree add --orphan ./neworphan/ && + echo refs/heads/neworphan >expected && + git -C neworphan symbolic-ref HEAD >actual && + test_cmp expected actual +' + test_expect_success '"add --orphan --quiet"' ' test_when_finished "git worktree remove -f -f orphandir" && git worktree add --quiet --orphan -b neworphan orphandir 2>log.actual &&