Skip to content

Commit

Permalink
worktree: avoid resolving HEAD unnecessarily
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eric Sunshine authored and Junio C Hamano committed Jul 20, 2015
1 parent 7f44e3d commit ed197a6
Showing 1 changed file with 5 additions and 12 deletions.
17 changes: 5 additions & 12 deletions builtin/worktree.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@ static int add_worktree(const char *path, const char *refname,
int counter = 0, len, ret;
struct strbuf symref = STRBUF_INIT;
struct commit *commit = NULL;
unsigned char rev[20];

if (file_exists(path) && !is_empty_dir(path))
die(_("'%s' already exists"), path);
Expand Down Expand Up @@ -253,20 +252,14 @@ static int add_worktree(const char *path, const char *refname,
real_path(get_git_common_dir()), name);
/*
* This is to keep resolve_ref() happy. We need a valid HEAD
* or is_git_directory() will reject the directory. Moreover, HEAD
* in the new worktree must resolve to the same value as HEAD in
* the current tree since the command invoked to populate the new
* worktree will be handed the branch/ref specified by the user.
* 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.
* or is_git_directory() will reject the directory. Any value which
* looks like an object ID will do since it will be immediately
* replaced by the symbolic-ref or update-ref invocation in the new
* worktree.
*/
if (!resolve_ref_unsafe("HEAD", 0, rev, NULL))
die(_("unable to resolve HEAD"));
strbuf_reset(&sb);
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_addf(&sb, "%s/commondir", sb_repo.buf);
write_file(sb.buf, 1, "../..\n");
Expand Down

0 comments on commit ed197a6

Please sign in to comment.