Skip to content

Commit 93f5484

Browse files
committed
Rebase: Run post-checkout hook on checkout
Signed-off-by: Orgad Shaneh <[email protected]>
1 parent cd63940 commit 93f5484

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

builtin/rebase.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ static void add_var(struct strbuf *buf, const char *name, const char *value)
369369
#define RESET_HEAD_DETACH (1<<0)
370370
#define RESET_HEAD_HARD (1<<1)
371371
#define RESET_HEAD_REFS_ONLY (1<<2)
372+
#define RESET_HEAD_RUN_HOOK (1<<3)
372373

373374
static int reset_head(struct object_id *oid, const char *action,
374375
const char *switch_to_branch, unsigned flags,
@@ -377,6 +378,7 @@ static int reset_head(struct object_id *oid, const char *action,
377378
unsigned detach_head = flags & RESET_HEAD_DETACH;
378379
unsigned reset_hard = flags & RESET_HEAD_HARD;
379380
unsigned refs_only = flags & RESET_HEAD_REFS_ONLY;
381+
unsigned run_hook = flags & RESET_HEAD_RUN_HOOK;
380382
struct object_id head_oid;
381383
struct tree_desc desc[2] = { { NULL }, { NULL } };
382384
struct lock_file lock = LOCK_INIT;
@@ -481,6 +483,10 @@ static int reset_head(struct object_id *oid, const char *action,
481483
ret = create_symref("HEAD", switch_to_branch,
482484
reflog_head);
483485
}
486+
if (run_hook)
487+
run_hook_le(NULL, "post-checkout",
488+
oid_to_hex(orig ? orig : &null_oid),
489+
oid_to_hex(oid), "1", NULL);
484490

485491
leave_reset_head:
486492
strbuf_release(&msg);
@@ -1729,7 +1735,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
17291735
strbuf_addf(&msg, "%s: checkout %s",
17301736
getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
17311737
if (reset_head(&options.onto->object.oid, "checkout", NULL,
1732-
RESET_HEAD_DETACH, NULL, msg.buf))
1738+
RESET_HEAD_DETACH | RESET_HEAD_RUN_HOOK, NULL, msg.buf))
17331739
die(_("Could not detach HEAD"));
17341740
strbuf_release(&msg);
17351741

t/t5403-post-checkout-hook.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ test_description='Test the post-checkout hook.'
99
test_expect_success setup '
1010
test_commit one &&
1111
test_commit two &&
12+
test_commit rebase-on-me &&
13+
git reset --hard HEAD^ &&
1214
test_commit three three &&
1315
mv .git/hooks-disabled .git/hooks
1416
'
@@ -52,6 +54,22 @@ test_expect_success 'post-checkout receives the right args when not switching br
5254
test $old = $new && test $flag = 0
5355
'
5456

57+
test_expect_success 'post-checkout is triggered on rebase' '
58+
git checkout -b rebase-test master &&
59+
rm -f .git/post-checkout.args &&
60+
git rebase rebase-on-me &&
61+
read old new flag < .git/post-checkout.args &&
62+
test $old != $new && test $flag = 1
63+
'
64+
65+
test_expect_success 'post-checkout is triggered on rebase with fast-forward' '
66+
git checkout -b ff-rebase-test rebase-on-me^ &&
67+
rm -f .git/post-checkout.args &&
68+
git rebase rebase-on-me &&
69+
read old new flag < .git/post-checkout.args &&
70+
test $old != $new && test $flag = 1
71+
'
72+
5573
if test "$(git config --bool core.filemode)" = true; then
5674
mkdir -p templates/hooks
5775
cat >templates/hooks/post-checkout <<'EOF'

0 commit comments

Comments
 (0)