worktree: avoid resolving HEAD unnecessarily

Now that git-worktree sets HEAD explicitly to its final value via either
git-symbolic-ref or git-update-ref, rather than relying upon
git-checkout to do so, the "hack" for pacifying is_git_directory() with
a temporary HEAD, though still necessary, can be simplified.

Since the real HEAD is now populated with its proper final value, the
value of the temporary HEAD truly no longer matters, and any value which
looks like an object ID is good enough to satisfy is_git_directory().
Therefore, just set the temporary HEAD to a literal value rather than
going through the effort of resolving the current branch's HEAD.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Sunshine
2015-07-17 19:00:15 -04:00
committed by Junio C Hamano
parent 7f44e3d1de
commit ed197a6ab9

View File

@ -192,7 +192,6 @@ static int add_worktree(const char *path, const char *refname,
int counter = 0, len, ret; int counter = 0, len, ret;
struct strbuf symref = STRBUF_INIT; struct strbuf symref = STRBUF_INIT;
struct commit *commit = NULL; struct commit *commit = NULL;
unsigned char rev[20];
if (file_exists(path) && !is_empty_dir(path)) if (file_exists(path) && !is_empty_dir(path))
die(_("'%s' already exists"), path); die(_("'%s' already exists"), path);
@ -253,20 +252,14 @@ static int add_worktree(const char *path, const char *refname,
real_path(get_git_common_dir()), name); real_path(get_git_common_dir()), name);
/* /*
* This is to keep resolve_ref() happy. We need a valid HEAD * This is to keep resolve_ref() happy. We need a valid HEAD
* or is_git_directory() will reject the directory. Moreover, HEAD * or is_git_directory() will reject the directory. Any value which
* in the new worktree must resolve to the same value as HEAD in * looks like an object ID will do since it will be immediately
* the current tree since the command invoked to populate the new * replaced by the symbolic-ref or update-ref invocation in the new
* worktree will be handed the branch/ref specified by the user. * worktree.
* For instance, if the user asks for the new worktree to be based
* at HEAD~5, then the resolved HEAD~5 in the new worktree must
* match the resolved HEAD~5 in the current tree in order to match
* the user's expectation.
*/ */
if (!resolve_ref_unsafe("HEAD", 0, rev, NULL))
die(_("unable to resolve HEAD"));
strbuf_reset(&sb); strbuf_reset(&sb);
strbuf_addf(&sb, "%s/HEAD", sb_repo.buf); strbuf_addf(&sb, "%s/HEAD", sb_repo.buf);
write_file(sb.buf, 1, "%s\n", sha1_to_hex(rev)); write_file(sb.buf, 1, "0000000000000000000000000000000000000000\n");
strbuf_reset(&sb); strbuf_reset(&sb);
strbuf_addf(&sb, "%s/commondir", sb_repo.buf); strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
write_file(sb.buf, 1, "../..\n"); write_file(sb.buf, 1, "../..\n");