From: Sam Vilain <sam.vilain@catalyst.net.nz>
To: git@vger.kernel.org
Cc: elliot@catalyst.net.nz, Sam Vilain <sam.vilain@catalyst.net.nz>
Subject: [PATCH] checkout: add 'pre-checkout' hook
Date: Wed, 14 Oct 2009 17:45:25 +1300 [thread overview]
Message-ID: <1255495525-11254-1-git-send-email-sam.vilain@catalyst.net.nz> (raw)
Add a simple hook that will run before checkouts.
Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz>
---
Documentation/githooks.txt | 20 +++++++++++++++-----
builtin-checkout.c | 25 ++++++++++++++++++++++---
2 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 06e0f31..8dc3fbf 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -143,21 +143,31 @@ pre-rebase
This hook is called by 'git-rebase' and can be used to prevent a branch
from getting rebased.
+pre-checkout
+-----------
-post-checkout
-~~~~~~~~~~~~~
-
-This hook is invoked when a 'git-checkout' is run after having updated the
+This hook is invoked when a 'git-checkout' is run after before updating the
worktree. The hook is given three parameters: the ref of the previous HEAD,
the ref of the new HEAD (which may or may not have changed), and a flag
indicating whether the checkout was a branch checkout (changing branches,
flag=1) or a file checkout (retrieving a file from the index, flag=0).
-This hook cannot affect the outcome of 'git-checkout'.
+This hook can prevent the checkout from proceeding by exiting with an
+error code.
It is also run after 'git-clone', unless the --no-checkout (-n) option is
used. The first parameter given to the hook is the null-ref, the second the
ref of the new HEAD and the flag is always 1.
+This hook can be used to perform any clean-up deemed necessary before
+checking out the new branch/files.
+
+post-checkout
+-----------
+
+This hook is invoked when a 'git-checkout' is run after having updated the
+worktree. It takes the same arguments as the 'pre-checkout' hook.
+This hook cannot affect the outcome of 'git-checkout'.
+
This hook can be used to perform repository validity checks, auto-display
differences from the previous HEAD if different, or set working dir metadata
properties.
diff --git a/builtin-checkout.c b/builtin-checkout.c
index d050c37..b72a3cb 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -36,6 +36,17 @@ struct checkout_opts {
enum branch_track track;
};
+static int pre_checkout_hook(struct commit *old, struct commit *new,
+ int changed)
+{
+ return run_hook(NULL, "pre-checkout",
+ sha1_to_hex(old ? old->object.sha1 : null_sha1),
+ sha1_to_hex(new ? new->object.sha1 : null_sha1),
+ changed ? "1" : "0", NULL);
+ /* "new" can be NULL when checking out from the index before
+ a commit exists. */
+}
+
static int post_checkout_hook(struct commit *old, struct commit *new,
int changed)
{
@@ -256,6 +267,13 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec,
if (errs)
return 1;
+ /* Run the pre-checkout hook */
+ resolve_ref("HEAD", rev, 0, &flag);
+ head = lookup_commit_reference_gently(rev, 1);
+ errs = pre_checkout_hook(head, head, 0);
+ if (errs)
+ return 1;
+
/* Now we are committed to check them out */
memset(&state, 0, sizeof(state));
state.force = 1;
@@ -279,9 +297,6 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec,
commit_locked_index(lock_file))
die("unable to write new index file");
- resolve_ref("HEAD", rev, 0, &flag);
- head = lookup_commit_reference_gently(rev, 1);
-
errs |= post_checkout_hook(head, head, 0);
return errs;
}
@@ -543,6 +558,10 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
parse_commit(new->commit);
}
+ ret = pre_checkout_hook(old.commit, new->commit, 1);
+ if (ret)
+ return ret;
+
ret = merge_working_tree(opts, &old, new);
if (ret)
return ret;
--
1.6.3.3
next reply other threads:[~2009-10-14 5:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-14 4:45 Sam Vilain [this message]
2009-10-14 5:13 ` [PATCH] checkout: add 'pre-checkout' hook Jeff King
2009-10-14 5:25 ` Sam Vilain
2009-10-14 5:13 ` Junio C Hamano
2009-10-14 5:22 ` Sam Vilain
2009-10-14 5:25 ` Jeff King
2009-10-14 6:49 ` Bert Wesarg
2009-10-14 6:50 ` Sam Vilain
2009-10-14 7:04 ` Bert Wesarg
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=1255495525-11254-1-git-send-email-sam.vilain@catalyst.net.nz \
--to=sam.vilain@catalyst.net.nz \
--cc=elliot@catalyst.net.nz \
--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;
as well as URLs for NNTP newsgroup(s).