mirror of
https://github.com/git/git
synced 2024-10-28 19:25:47 +00:00
checkout: teach check_linked_checkout() about symbolic link HEAD
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>
This commit is contained in:
parent
33aef83666
commit
746bbdc64f
2 changed files with 13 additions and 1 deletions
|
@ -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);
|
||||
|
|
|
@ -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 &&
|
||||
|
|
Loading…
Reference in a new issue