summaryrefslogtreecommitdiff
path: root/builtin/worktree.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-12-27 19:16:21 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-12-27 19:16:21 (GMT)
commite87f9fc9d4ead0ec7f98c9493a9f2ad8c41cd6ee (patch)
treeee27b22b0950137d8f450d1ac95ddb67714df241 /builtin/worktree.c
parent0da2ba4880f971de2782f2d4cfcd68f9148d2860 (diff)
parentade546be4786637ba039478d6f027becb1160803 (diff)
downloadgit-e87f9fc9d4ead0ec7f98c9493a9f2ad8c41cd6ee.zip
git-e87f9fc9d4ead0ec7f98c9493a9f2ad8c41cd6ee.tar.gz
git-e87f9fc9d4ead0ec7f98c9493a9f2ad8c41cd6ee.tar.bz2
Merge branch 'es/worktree-checkout-hook'
"git worktree add" learned to run the post-checkout hook, just like "git checkout" does, after the initial checkout. * es/worktree-checkout-hook: worktree: invoke post-checkout hook (unless --no-checkout)
Diffstat (limited to 'builtin/worktree.c')
-rw-r--r--builtin/worktree.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 002a569..7cef5b1 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -230,20 +230,21 @@ static int add_worktree(const char *path, const char *refname,
int counter = 0, len, ret;
struct strbuf symref = STRBUF_INIT;
struct commit *commit = NULL;
+ int is_branch = 0;
if (file_exists(path) && !is_empty_dir(path))
die(_("'%s' already exists"), path);
/* is 'refname' a branch or commit? */
if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) &&
- ref_exists(symref.buf)) { /* it's a branch */
+ ref_exists(symref.buf)) {
+ is_branch = 1;
if (!opts->force)
die_if_checked_out(symref.buf, 0);
- } else { /* must be a commit */
- commit = lookup_commit_reference_by_name(refname);
- if (!commit)
- die(_("invalid reference: %s"), refname);
}
+ commit = lookup_commit_reference_by_name(refname);
+ if (!commit)
+ die(_("invalid reference: %s"), refname);
name = worktree_basename(path, &len);
git_path_buf(&sb_repo, "worktrees/%.*s", (int)(path + len - name), name);
@@ -308,7 +309,7 @@ static int add_worktree(const char *path, const char *refname,
argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
cp.git_cmd = 1;
- if (commit)
+ if (!is_branch)
argv_array_pushl(&cp.args, "update-ref", "HEAD",
oid_to_hex(&commit->object.oid), NULL);
else
@@ -339,6 +340,15 @@ done:
strbuf_addf(&sb, "%s/locked", sb_repo.buf);
unlink_or_warn(sb.buf);
}
+
+ /*
+ * Hook failure does not warrant worktree deletion, so run hook after
+ * is_junk is cleared, but do return appropriate code when hook fails.
+ */
+ if (!ret && opts->checkout)
+ ret = run_hook_le(NULL, "post-checkout", oid_to_hex(&null_oid),
+ oid_to_hex(&commit->object.oid), "1", NULL);
+
argv_array_clear(&child_env);
strbuf_release(&sb);
strbuf_release(&symref);