summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2015-07-17 19:00:02 -0400
committerJunio C Hamano <gitster@pobox.com>2015-07-20 11:29:24 -0700
commit33aef83666900df03c39bcf7e391e2f8195dd13c (patch)
treefc709a2b5aed1e79ce51863e6e4485762c4234df
parent39e69e151951040b952b3c81d2ee40b827fd9abf (diff)
downloadgit-33aef83666900df03c39bcf7e391e2f8195dd13c.tar.gz
checkout: check_linked_checkout: simplify symref parsing
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), thus it will need to check that style HEAD, as well (via readlink()). As a preparatory step, simplify parsing of symref-style HEAD so the actual branch check can be re-used easily for symbolic links (in an upcoming patch). Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/checkout.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/builtin/checkout.c b/builtin/checkout.c
index de6619f4c5..6f4e49232a 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -878,7 +878,6 @@ static void check_linked_checkout(const char *branch, const char *id)
struct strbuf sb = STRBUF_INIT;
struct strbuf path = STRBUF_INIT;
struct strbuf gitdir = STRBUF_INIT;
- const char *start, *end;
/*
* $GIT_COMMON_DIR/HEAD is practically outside
@@ -890,15 +889,13 @@ 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 ||
- !skip_prefix(sb.buf, "ref:", &start))
+ if (strbuf_read_file(&sb, path.buf, 0) >= 0 &&
+ starts_with(sb.buf, "ref:")) {
+ strbuf_remove(&sb, 0, strlen("ref:"));
+ strbuf_trim(&sb);
+ } else
goto done;
- while (isspace(*start))
- start++;
- end = start;
- while (*end && !isspace(*end))
- end++;
- if (strncmp(start, branch, end - start) || branch[end - start] != '\0')
+ if (strcmp(sb.buf, branch))
goto done;
if (id) {
strbuf_reset(&path);