Skip to content

Commit

Permalink
checkout: teach check_linked_checkout() about symbolic link HEAD
Browse files Browse the repository at this point in the history
check_linked_checkout() only understands symref-style HEAD (i.e. "ref:
refs/heads/master"), however, HEAD may also be a an actual symbolic link
(on platforms which support it). To accurately detect if a branch is
checked out elsewhere, it needs to handle symbolic link HEAD, as well.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Eric Sunshine authored and Junio C Hamano committed Jul 20, 2015
1 parent 33aef83 commit 746bbdc
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
6 changes: 5 additions & 1 deletion builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -889,7 +889,11 @@ static void check_linked_checkout(const char *branch, const char *id)
else
strbuf_addf(&path, "%s/HEAD", get_git_common_dir());

if (strbuf_read_file(&sb, path.buf, 0) >= 0 &&
if (!strbuf_readlink(&sb, path.buf, 0)) {
if (!starts_with(sb.buf, "refs/") ||
check_refname_format(sb.buf, 0))
goto done;
} else if (strbuf_read_file(&sb, path.buf, 0) >= 0 &&
starts_with(sb.buf, "ref:")) {
strbuf_remove(&sb, 0, strlen("ref:"));
strbuf_trim(&sb);
Expand Down
8 changes: 8 additions & 0 deletions t/t2025-worktree-add.sh
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,14 @@ test_expect_success 'die the same branch is already checked out' '
)
'

test_expect_success SYMLINKS 'die the same branch is already checked out (symlink)' '
head=$(git -C there rev-parse --git-path HEAD) &&
ref=$(git -C there symbolic-ref HEAD) &&
rm "$head" &&
ln -s "$ref" "$head" &&
test_must_fail git -C here checkout newmaster
'

test_expect_success 'not die the same branch is already checked out' '
(
cd here &&
Expand Down

0 comments on commit 746bbdc

Please sign in to comment.