Junk. Sorry about the address. My mailer went retarded.
-JE
On Fri, 2007-09-21 at 14:27 -0600, root wrote:
Show 109 quoted lines
> Signed-off-by: Josh England <jjengla@sandia.gov>
> ---
> Documentation/hooks.txt | 10 +++++++
> git-checkout.sh | 5 +++
> t/t5403-post-checkout-hook.sh | 61 +++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 76 insertions(+), 0 deletions(-)
> create mode 100755 t/t5403-post-checkout-hook.sh
>
> diff --git a/Documentation/hooks.txt b/Documentation/hooks.txt
> index c39edc5..e78f91a 100644
> --- a/Documentation/hooks.txt
> +++ b/Documentation/hooks.txt
> @@ -87,6 +87,16 @@ parameter, and is invoked after a commit is made.
> This hook is meant primarily for notification, and cannot affect
> the outcome of `git-commit`.
>
> +post-checkout
> +-----------
> +
> +This hook is invoked when a `git-checkout` is run on a local repository.
> +The hook is given two parameters: the ref of the previous HEAD, and the ref of
> +the new HEAD. 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, or set working dir metadata properties.
> +
> [[pre-receive]]
> pre-receive
> -----------
> diff --git a/git-checkout.sh b/git-checkout.sh
> index 17f4392..0cff36c 100755
> --- a/git-checkout.sh
> +++ b/git-checkout.sh
> @@ -284,3 +284,8 @@ if [ "$?" -eq 0 ]; then
> else
> exit 1
> fi
> +
> +# Run a post-checkout hook
> +if test -x "$GIT_DIR"/hooks/post-checkout; then
> + "$GIT_DIR"/hooks/post-checkout $old $new
> +fi
> diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
> new file mode 100755
> index 0000000..aa0216a
> --- /dev/null
> +++ b/t/t5403-post-checkout-hook.sh
> @@ -0,0 +1,61 @@
> +#!/bin/sh
> +#
> +# Copyright (c) 2006 Josh England
> +#
> +
> +test_description='Test the post-checkout hook.'
> +. ./test-lib.sh
> +
> +test_expect_success setup '
> + echo Data for commit0. >a &&
> + git update-index --add a &&
> + tree0=$(git write-tree) &&
> + commit0=$(echo setup | git commit-tree $tree0) &&
> + git update-ref refs/heads/master $commit0 &&
> + git-clone ./. clone1 &&
> + git-clone ./. clone2 &&
> + GIT_DIR=clone2/.git git branch -a new2 &&
> + echo Data for commit1. >clone2/b &&
> + GIT_DIR=clone2/.git git add clone2/b &&
> + GIT_DIR=clone2/.git git commit -m new2
> +'
> +
> +for clone in 1 2; do
> + cat >clone${clone}/.git/hooks/post-checkout <<'EOF'
> +#!/bin/sh
> +echo $@ > $GIT_DIR/post-checkout.args
> +EOF
> + chmod u+x clone${clone}/.git/hooks/post-checkout
> +done
> +
> +test_expect_success 'post-checkout runs as expected ' '
> + GIT_DIR=clone1/.git git checkout master &&
> + test -e clone1/.git/post-checkout.args
> +'
> +
> +test_expect_success 'post-checkout receives the right arguments with HEAD unchanged ' '
> + old=$(awk "{print \$1}" clone1/.git/post-checkout.args) &&
> + new=$(awk "{print \$2}" clone1/.git/post-checkout.args) &&
> + test $old = $new
> +'
> +
> +test_expect_success 'post-checkout runs as expected ' '
> + GIT_DIR=clone1/.git git checkout master &&
> + test -e clone1/.git/post-checkout.args
> +'
> +
> +test_expect_success 'post-checkout args are correct with git checkout -b ' '
> + GIT_DIR=clone1/.git git checkout -b new1 &&
> + old=$(awk "{print \$1}" clone1/.git/post-checkout.args) &&
> + new=$(awk "{print \$2}" clone1/.git/post-checkout.args) &&
> + test $old = $new
> +'
> +
> +test_expect_success 'post-checkout receives the right arguments with HEAD changed ' '
> + GIT_DIR=clone2/.git git checkout new2 &&
> + old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
> + new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
> + test $old != $new
> +'
> +
> +test_done