git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] clone: run post-checkout hook when checking out

From
Jeff King <peff@peff.net>
Date
Mar 3, 2009, 05:37 UTC
Message-ID
<20090303053750.GA30201@coredump.intra.peff.net>
In-Reply-To
<23978.1236056549@relay.known.net>

The mental model for clone is that the branch is "checked out" (and it even says this in Documentation/git-clone.txt: "...creates and checks out an initial branch"). Therefore it is reasonable for users to expect that any post-checkout hook would be run.

Signed-off-by: Jeff King <peff@peff.net>
---
On Mon, Mar 02, 2009 at 09:02:29PM -0800, layer wrote:
Show 5 quoted lines
> The hook in question was in /usr/share/git-core/templates/hooks/, so
> it would get setup on clone.  That works fine.  If I immediately
> switch branches, the hook gets called.  It's just the `post-clone'
> (when I assume something like `checkout' is done), the hook doesn't
> get called.
This should fix it.

Junio, I'm not sure what you want to do with this. It is definitely a behavior change; we have never respected post-checkout hooks in shell git-clone.sh or in the builtin version. However, it seems like an omission rather than an intentional behavior, so I consider this a bugfix.

 builtin-clone.c               |    7 ++++++-
 t/t5403-post-checkout-hook.sh |   12 ++++++++++++
 2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/builtin-clone.c b/builtin-clone.c
index 3146ca8..ceffecb 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -21,6 +21,7 @@
 #include "pack-refs.h"
 #include "sigchain.h"
 #include "remote.h"
+#include "run-command.h"
 
 /*
  * Overall FIXMEs:
@@ -341,6 +342,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT;
 	struct transport *transport = NULL;
 	char *src_ref_prefix = "refs/heads/";
+	int err = 0;
 
 	struct refspec refspec;
 
@@ -596,6 +598,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 		if (write_cache(fd, active_cache, active_nr) ||
 		    commit_locked_index(lock_file))
 			die("unable to write new index file");
+
+		err |= run_hook(NULL, "post-checkout", sha1_to_hex(null_sha1),
+				sha1_to_hex(remote_head->old_sha1), "1", NULL);
 	}
 
 	strbuf_release(&reflog_msg);
@@ -603,5 +608,5 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	strbuf_release(&key);
 	strbuf_release(&value);
 	junk_pid = 0;
-	return 0;
+	return err;
 }
diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index 9b2e1a9..4fdb418 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -71,4 +71,16 @@ test_expect_success 'post-checkout receives the right args when not switching br
         test $old = $new -a $flag = 0
 '
 
+mkdir -p templates/hooks
+cat >templates/hooks/post-checkout <<'EOF'
+#!/bin/sh
+echo $@ > $GIT_DIR/post-checkout.args
+EOF
+chmod +x templates/hooks/post-checkout
+
+test_expect_success 'post-checkout hook is triggered by clone' '
+	git clone --template=templates . clone3 &&
+	test -f clone3/.git/post-checkout.args
+'
+
 test_done
-- 
1.6.2.rc2.313.gce9b3.dirty
Previous: Jeff KingNext: Junio C Hamano
Message 5 of 11 in “post-checkout hook not run on clone”
  1. layerMar 2, 2009
  2. Jeff KingMar 3, 2009
  3. layerMar 3, 2009
  4. Jeff KingMar 3, 2009
  5. clone: run post-checkout hook when checking outJeff King, Mar 3, 2009
  6. Junio C HamanoMar 3, 2009
  7. Jay SoffianMar 3, 2009
  8. Nanako ShiraishiMar 3, 2009
  9. Jeff KingMar 3, 2009
  10. layerMar 4, 2009
  11. Shawn O. PearceMar 3, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.