diff --git a/builtin/checkout.c b/builtin/checkout.c index 9771c848c5..c6e29e9526 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). @@ -718,7 +700,7 @@ static int checkout_paths(const struct checkout_opts *opts, &rev, NULL); head = lookup_commit_reference_gently(the_repository, &rev, 1); - errs |= post_checkout_hook(head, head, 0); + errs |= post_checkout_hook(the_repository, head, head, 0); return errs; } @@ -1273,7 +1255,8 @@ static int switch_branches(const struct checkout_opts *opts, } } - ret = post_checkout_hook(old_branch_info.commit, new_branch_info->commit, 1); + ret = post_checkout_hook(the_repository, + old_branch_info.commit, new_branch_info->commit, 1); branch_info_release(&old_branch_info); strbuf_release(&old_commit_shortname); strbuf_release(&autostash_msg); diff --git a/checkout.c b/checkout.c index 1588b116ee..28c5c18d96 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,27 @@ char *unique_tracking_name(const char *name, struct object_id *oid, } return NULL; } + +int post_checkout_hook(struct repository *repo, + struct commit *old_commit, struct commit *new_commit, + int changed) +{ + struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT_FORCE_SERIAL; + const struct git_hash_algo *hash_algo = repo->hash_algo; + + /* + * "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(hash_algo)), + oid_to_hex(new_commit ? + &new_commit->object.oid + : null_oid(hash_algo)), + changed ? "1" : "0", + NULL); + + return run_hooks_opt(repo, "post-checkout", &opt); +} diff --git a/checkout.h b/checkout.h index 55920e7aeb..6d8d2c2bab 100644 --- a/checkout.h +++ b/checkout.h @@ -3,6 +3,9 @@ #include "hash.h" +struct commit; +struct repository; + /* * 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 +15,11 @@ 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 repository *, + struct commit *old_commit, struct commit *new_commit, + int changed); + #endif /* CHECKOUT_H */