[PATCH 8/8] checkout: move post_checkout_hook() to checkout.c
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 28, 2026, 22:52 UTC
- Message-ID
- <20260828225206.310500-9-gitster@pobox.com>
- In-Reply-To
- <20260828225206.310500-1-gitster@pobox.com>
post_checkout_hook() in builtin/checkout.c runs the 'post-checkout' hook after switching branches or checking out paths.
Move post_checkout_hook() to checkout.c and declare it in checkout.h so that other subsystems can invoke the post-checkout hook without depending on builtin/checkout.c.
This step in the series is entirely optional and is here primarily for illustration. We may later want to teach 'git worktree' to trigger the 'post-checkout' hook, for example, in which case such libification may turn out to be useful.
Signed-off-by: Junio C Hamano <gitster@pobox.com> --- builtin/checkout.c | 18 ------------------ checkout.c | 22 ++++++++++++++++++++++ checkout.h | 8 ++++++++ 3 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c index f13d70b224..b13e2ff205 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -124,24 +124,6 @@ static void branch_info_release(struct branch_info *info) free(info->checkout); } -static int post_checkout_hook(struct commit *old_commit, struct commit *new_commit, - int changed) -{ - struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT_FORCE_SERIAL; - - /* - * "new_commit" can be NULL when checking out from the index before - * a commit exists. - */ - strvec_pushl(&opt.args, - oid_to_hex(old_commit ? &old_commit->object.oid : null_oid(the_hash_algo)), - oid_to_hex(new_commit ? &new_commit->object.oid : null_oid(the_hash_algo)), - changed ? "1" : "0", - NULL); - - return run_hooks_opt(the_repository, "post-checkout", &opt); -} - /* * Handle a tree object and determine if we need to recurse into the * tree (READ_TREE_RECURSIVE) or skip it (0). diff --git a/checkout.c b/checkout.c index 1588b116ee..d007648f50 100644 --- a/checkout.c +++ b/checkout.c @@ -1,6 +1,9 @@ #define USE_THE_REPOSITORY_VARIABLE #include "git-compat-util.h" +#include "commit.h" +#include "hex.h" +#include "hook.h" #include "object-name.h" #include "remote.h" #include "refspec.h" @@ -8,6 +11,7 @@ #include "checkout.h" #include "config.h" #include "strbuf.h" +#include "strvec.h" struct tracking_name_data { /* const */ char *src_ref; @@ -73,3 +77,21 @@ char *unique_tracking_name(const char *name, struct object_id *oid, } return NULL; } + +int post_checkout_hook(struct commit *old_commit, struct commit *new_commit, + int changed) +{ + struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT_FORCE_SERIAL; + + /* + * "new_commit" can be NULL when checking out from the index before + * a commit exists. + */ + strvec_pushl(&opt.args, + oid_to_hex(old_commit ? &old_commit->object.oid : null_oid(the_hash_algo)), + oid_to_hex(new_commit ? &new_commit->object.oid : null_oid(the_hash_algo)), + changed ? "1" : "0", + NULL); + + return run_hooks_opt(the_repository, "post-checkout", &opt); +} diff --git a/checkout.h b/checkout.h index 55920e7aeb..9c2f2449dc 100644 --- a/checkout.h +++ b/checkout.h @@ -3,6 +3,8 @@ #include "hash.h" +struct commit; + /* * Check if the branch name uniquely matches a branch name on a remote * tracking branch. Return the name of the remote if such a branch @@ -12,4 +14,10 @@ char *unique_tracking_name(const char *name, struct object_id *oid, int *dwim_remotes_matched); +/* + * Run the post-checkout hook. + */ +int post_checkout_hook(struct commit *old_commit, struct commit *new_commit, + int changed); + #endif /* CHECKOUT_H */
-- 2.55.0-884-g76cf8659c2