Git development
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH v2 8/8] checkout: move post_checkout_hook() to checkout.c
Date: Sun, 30 Aug 2026 13:48:35 -0700	[thread overview]
Message-ID: <20260830204835.1040408-9-gitster@pobox.com> (raw)
In-Reply-To: <20260830204835.1040408-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.

Remove the dependency on 'the_repository'.  While OK when the helper
was in builtin/checkout.c as an integral part of 'git checkout' (and
'git restore'), this is no longer true for a common utility
function.  Have it take a pointer to 'struct repository' and use its
associated hash algorithm.

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 | 23 +++--------------------
 checkout.c         | 28 ++++++++++++++++++++++++++++
 checkout.h         | 10 ++++++++++
 3 files changed, 41 insertions(+), 20 deletions(-)

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 */
-- 
2.55.0-884-g76cf8659c2


  parent reply	other threads:[~2026-08-30 20:48 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-27 18:29 [PATCH] builtin: replace the_repository parameter in is_bare_repository() Hardik Kumar
2026-08-27 19:09 ` Junio C Hamano
2026-08-27 19:51   ` Junio C Hamano
2026-08-27 20:09     ` Hardik Kumar
2026-08-27 20:28       ` Junio C Hamano
2026-08-27 21:12         ` Ben Knoble
2026-08-27 21:39           ` Junio C Hamano
2026-08-28 11:41             ` D. Ben Knoble
2026-08-28 22:51               ` Junio C Hamano
2026-08-28 22:51                 ` [PATCH 0/8] More sensible checkout/switch/restore code refactoring Junio C Hamano
2026-08-28 22:51                   ` [PATCH 1/8] checkout: pass cb_option explicitly to branch name parsers Junio C Hamano
2026-08-28 22:52                   ` [PATCH 2/8] checkout: validate new branch name in checkout_branch() Junio C Hamano
2026-08-28 22:52                   ` [PATCH 3/8] checkout: validate stage and merge option compatibility in checkout_paths() Junio C Hamano
2026-08-28 22:52                   ` [PATCH 4/8] checkout: extract option validation and pathspec helpers Junio C Hamano
2026-08-28 22:52                   ` [PATCH 5/8] checkout: extract branch setup and tracking helpers Junio C Hamano
2026-08-28 22:52                   ` [PATCH 6/8] checkout: restructure switch, restore, and checkout entrypoints Junio C Hamano
2026-08-28 22:52                   ` [PATCH 7/8] checkout: wrap overly long lines Junio C Hamano
2026-08-28 22:55                     ` Junio C Hamano
2026-08-29  2:06                       ` Junio C Hamano
2026-08-28 22:52                   ` [PATCH 8/8] checkout: move post_checkout_hook() to checkout.c Junio C Hamano
2026-08-28 22:57                     ` Junio C Hamano
2026-08-29  2:05                       ` Junio C Hamano
2026-08-30 20:48                   ` [PATCH v2 0/8] More sensible checkout/switch/restore code refactoring Junio C Hamano
2026-08-30 20:48                     ` [PATCH v2 1/8] checkout: pass cb_option explicitly to branch name parsers Junio C Hamano
2026-09-01 11:31                       ` Karthik Nayak
2026-08-30 20:48                     ` [PATCH v2 2/8] checkout: validate new branch name in checkout_branch() Junio C Hamano
2026-09-01 11:36                       ` Karthik Nayak
2026-08-30 20:48                     ` [PATCH v2 3/8] checkout: validate stage and merge option compatibility in checkout_paths() Junio C Hamano
2026-09-01 11:53                       ` Karthik Nayak
2026-09-01 17:47                         ` Junio C Hamano
2026-09-02 11:20                           ` Karthik Nayak
2026-09-02 22:40                             ` Junio C Hamano
2026-09-03  9:21                               ` Karthik Nayak
2026-08-30 20:48                     ` [PATCH v2 4/8] checkout: extract option validation and pathspec helpers Junio C Hamano
2026-08-30 20:48                     ` [PATCH v2 5/8] checkout: extract branch setup and tracking helpers Junio C Hamano
2026-08-30 20:48                     ` [PATCH v2 6/8] checkout: restructure switch, restore, and checkout entrypoints Junio C Hamano
2026-09-01 14:14                       ` Karthik Nayak
2026-09-01 23:25                         ` Junio C Hamano
2026-09-02 11:02                           ` Karthik Nayak
2026-08-30 20:48                     ` [PATCH v2 7/8] checkout: wrap overly long lines Junio C Hamano
2026-08-30 20:48                     ` Junio C Hamano [this message]
2026-08-29 13:24                 ` [PATCH] builtin: replace the_repository parameter in is_bare_repository() D. Ben Knoble
2026-08-27 21:35         ` [PATCH] do not pass "repo" to builtin commmand implementations Junio C Hamano
2026-08-28  9:05           ` Hardik Kumar
2026-08-28 20:59             ` Junio C Hamano
2026-08-28  4:01         ` [PATCH] builtin: replace the_repository parameter in is_bare_repository() Hardik Kumar
2026-08-27 19:56   ` Hardik Kumar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260830204835.1040408-9-gitster@pobox.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox