git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH 1/2] t5403: Refactor
@ 2018-12-20 21:48 orgads
  2018-12-21 16:06 ` Johannes Schindelin
  0 siblings, 1 reply; 12+ messages in thread
From: orgads @ 2018-12-20 21:48 UTC (permalink / raw)
  To: git; +Cc: Orgad Shaneh

From: Orgad Shaneh <orgads@gmail.com>

* Replace multiple clones and commits by test_commits.
* Replace 3 invocations of awk by read.

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
---
 t/t5403-post-checkout-hook.sh | 55 ++++++++++++-----------------------
 1 file changed, 18 insertions(+), 37 deletions(-)

diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index fc898c9eac..7e941537f9 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -7,67 +7,48 @@ test_description='Test the post-checkout hook.'
 . ./test-lib.sh
 
 test_expect_success setup '
-	echo Data for commit0. >a &&
-	echo Data for commit0. >b &&
-	git update-index --add a &&
-	git update-index --add b &&
-	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 new2 &&
-	echo Data for commit1. >clone2/b &&
-	GIT_DIR=clone2/.git git add clone2/b &&
-	GIT_DIR=clone2/.git git commit -m new2
+	test_commit one &&
+    test_commit two &&
+    test_commit three three &&
+    mv .git/hooks-disabled .git/hooks
 '
 
-for clone in 1 2; do
-    cat >clone${clone}/.git/hooks/post-checkout <<'EOF'
+cat >.git/hooks/post-checkout <<'EOF'
 #!/bin/sh
-echo $@ > $GIT_DIR/post-checkout.args
+echo $@ > .git/post-checkout.args
 EOF
-    chmod u+x clone${clone}/.git/hooks/post-checkout
-done
+chmod u+x .git/hooks/post-checkout
 
 test_expect_success 'post-checkout runs as expected ' '
-	GIT_DIR=clone1/.git git checkout master &&
-	test -e clone1/.git/post-checkout.args
+	git checkout master &&
+	test -e .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) &&
-	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
+	read old new flag < .git/post-checkout.args &&
 	test $old = $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout runs as expected ' '
-	GIT_DIR=clone1/.git git checkout master &&
-	test -e clone1/.git/post-checkout.args
+	git checkout master &&
+	test -e .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) &&
-	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
+	git checkout -b new1 &&
+    read old new flag < .git/post-checkout.args &&
 	test $old = $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout receives the right args 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) &&
-	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
+	git checkout two &&
+    read old new flag < .git/post-checkout.args &&
 	test $old != $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout receives the right args when not switching branches ' '
-	GIT_DIR=clone2/.git git checkout master b &&
-	old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
-	new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
-	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
+	git checkout master -- three &&
+    read old new flag < .git/post-checkout.args &&
 	test $old = $new && test $flag = 0
 '
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 1/2] t5403: Refactor
@ 2018-12-20 21:55 orgads
  0 siblings, 0 replies; 12+ messages in thread
From: orgads @ 2018-12-20 21:55 UTC (permalink / raw)
  To: git; +Cc: Orgad Shaneh

From: Orgad Shaneh <orgads@gmail.com>

* Replace multiple clones and commits by test_commits.
* Replace 3 invocations of awk by read.

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
---
 t/t5403-post-checkout-hook.sh | 55 ++++++++++++-----------------------
 1 file changed, 18 insertions(+), 37 deletions(-)

diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index fc898c9eac..868d6f7272 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -7,67 +7,48 @@ test_description='Test the post-checkout hook.'
 . ./test-lib.sh
 
 test_expect_success setup '
-	echo Data for commit0. >a &&
-	echo Data for commit0. >b &&
-	git update-index --add a &&
-	git update-index --add b &&
-	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 new2 &&
-	echo Data for commit1. >clone2/b &&
-	GIT_DIR=clone2/.git git add clone2/b &&
-	GIT_DIR=clone2/.git git commit -m new2
+	test_commit one &&
+	test_commit two &&
+	test_commit three three &&
+	mv .git/hooks-disabled .git/hooks
 '
 
-for clone in 1 2; do
-    cat >clone${clone}/.git/hooks/post-checkout <<'EOF'
+cat >.git/hooks/post-checkout <<'EOF'
 #!/bin/sh
-echo $@ > $GIT_DIR/post-checkout.args
+echo $@ > .git/post-checkout.args
 EOF
-    chmod u+x clone${clone}/.git/hooks/post-checkout
-done
+chmod u+x .git/hooks/post-checkout
 
 test_expect_success 'post-checkout runs as expected ' '
-	GIT_DIR=clone1/.git git checkout master &&
-	test -e clone1/.git/post-checkout.args
+	git checkout master &&
+	test -e .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) &&
-	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
+	read old new flag < .git/post-checkout.args &&
 	test $old = $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout runs as expected ' '
-	GIT_DIR=clone1/.git git checkout master &&
-	test -e clone1/.git/post-checkout.args
+	git checkout master &&
+	test -e .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) &&
-	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
+	git checkout -b new1 &&
+	read old new flag < .git/post-checkout.args &&
 	test $old = $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout receives the right args 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) &&
-	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
+	git checkout two &&
+	read old new flag < .git/post-checkout.args &&
 	test $old != $new && test $flag = 1
 '
 
 test_expect_success 'post-checkout receives the right args when not switching branches ' '
-	GIT_DIR=clone2/.git git checkout master b &&
-	old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
-	new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
-	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
+	git checkout master -- three &&
+	read old new flag < .git/post-checkout.args &&
 	test $old = $new && test $flag = 0
 '
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/2] t5403: Refactor
  2018-12-20 21:48 orgads
@ 2018-12-21 16:06 ` Johannes Schindelin
       [not found]   ` <CAGHpTB+9L55Gvezhb7x6Kb49WS_nfzmKdVvpH3_=6GM7y8YQ_g@mail.gmail.com>
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Schindelin @ 2018-12-21 16:06 UTC (permalink / raw)
  To: Orgad Shaneh; +Cc: git

Hi Orgad,

On Thu, 20 Dec 2018, orgads@gmail.com wrote:

> diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
> index fc898c9eac..7e941537f9 100755
> --- a/t/t5403-post-checkout-hook.sh
> +++ b/t/t5403-post-checkout-hook.sh
> @@ -7,67 +7,48 @@ test_description='Test the post-checkout hook.'
>  . ./test-lib.sh
>  
>  test_expect_success setup '
> -	echo Data for commit0. >a &&
> -	echo Data for commit0. >b &&
> -	git update-index --add a &&
> -	git update-index --add b &&
> -	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 new2 &&
> -	echo Data for commit1. >clone2/b &&
> -	GIT_DIR=clone2/.git git add clone2/b &&
> -	GIT_DIR=clone2/.git git commit -m new2
> +	test_commit one &&
> +    test_commit two &&
> +    test_commit three three &&

A very nice simplification (but please use tabs to indent).

> +    mv .git/hooks-disabled .git/hooks
>  '
>  
> -for clone in 1 2; do
> -    cat >clone${clone}/.git/hooks/post-checkout <<'EOF'
> +cat >.git/hooks/post-checkout <<'EOF'
>  #!/bin/sh
> -echo $@ > $GIT_DIR/post-checkout.args
> +echo $@ > .git/post-checkout.args

While at it, you could lose the space after the redirector that we seem to
no longer prefer:

> +echo $@ >.git/post-checkout.args

And since we are already cleaning up, we could easily move use
write_script instead, *and* move it into the `setup` test case (which
makes it easier to use something like

	sh t5403-post-checkout-hook.sh --run=1,13

The rest looks good (modulo indentation issues). I would have preferred
the separate concerns to be addressed in individual commits (one commit to
replace the `awk` calls, one to avoid the clones, one to simplify by using
`test_commit`, etc), as that would have been easier to review. But others
might disagree (Junio recently made the case of smooshing separate
concerns into single commits, even squashing two of my patches into one
against my wish), so... I guess you don't have to change this.

Thank you,
Johannes

>  EOF
> -    chmod u+x clone${clone}/.git/hooks/post-checkout
> -done
> +chmod u+x .git/hooks/post-checkout
>  
>  test_expect_success 'post-checkout runs as expected ' '
> -	GIT_DIR=clone1/.git git checkout master &&
> -	test -e clone1/.git/post-checkout.args
> +	git checkout master &&
> +	test -e .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) &&
> -	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
> +	read old new flag < .git/post-checkout.args &&
>  	test $old = $new && test $flag = 1
>  '
>  
>  test_expect_success 'post-checkout runs as expected ' '
> -	GIT_DIR=clone1/.git git checkout master &&
> -	test -e clone1/.git/post-checkout.args
> +	git checkout master &&
> +	test -e .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) &&
> -	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
> +	git checkout -b new1 &&
> +    read old new flag < .git/post-checkout.args &&
>  	test $old = $new && test $flag = 1
>  '
>  
>  test_expect_success 'post-checkout receives the right args 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) &&
> -	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
> +	git checkout two &&
> +    read old new flag < .git/post-checkout.args &&
>  	test $old != $new && test $flag = 1
>  '
>  
>  test_expect_success 'post-checkout receives the right args when not switching branches ' '
> -	GIT_DIR=clone2/.git git checkout master b &&
> -	old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
> -	new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
> -	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
> +	git checkout master -- three &&
> +    read old new flag < .git/post-checkout.args &&
>  	test $old = $new && test $flag = 0
>  '
>  
> -- 
> 2.20.1
> 
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/2] t5403: Refactor
       [not found]   ` <CAGHpTB+9L55Gvezhb7x6Kb49WS_nfzmKdVvpH3_=6GM7y8YQ_g@mail.gmail.com>
@ 2018-12-24 20:54     ` Orgad Shaneh
  0 siblings, 0 replies; 12+ messages in thread
From: Orgad Shaneh @ 2018-12-24 20:54 UTC (permalink / raw)
  To: git

Hi Johannes,

Thanks for reviewing this.

On Fri, Dec 21, 2018 at 6:06 PM Johannes Schindelin
<Johannes.Schindelin@gmx.de> wrote:
>
> Hi Orgad,
>
> On Thu, 20 Dec 2018, orgads@gmail.com wrote:
>
> > diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
> > index fc898c9eac..7e941537f9 100755
> > --- a/t/t5403-post-checkout-hook.sh
> > +++ b/t/t5403-post-checkout-hook.sh
> > @@ -7,67 +7,48 @@ test_description='Test the post-checkout hook.'
> >  . ./test-lib.sh
> >
> >  test_expect_success setup '
> > -     echo Data for commit0. >a &&
> > -     echo Data for commit0. >b &&
> > -     git update-index --add a &&
> > -     git update-index --add b &&
> > -     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 new2 &&
> > -     echo Data for commit1. >clone2/b &&
> > -     GIT_DIR=clone2/.git git add clone2/b &&
> > -     GIT_DIR=clone2/.git git commit -m new2
> > +     test_commit one &&
> > +    test_commit two &&
> > +    test_commit three three &&
>
> A very nice simplification (but please use tabs to indent).

Thanks. I already did. I sent these patches twice - first revision had
spaces, and the second one had tabs.

> > +    mv .git/hooks-disabled .git/hooks
> >  '
> >
> > -for clone in 1 2; do
> > -    cat >clone${clone}/.git/hooks/post-checkout <<'EOF'
> > +cat >.git/hooks/post-checkout <<'EOF'
> >  #!/bin/sh
> > -echo $@ > $GIT_DIR/post-checkout.args
> > +echo $@ > .git/post-checkout.args
>
> While at it, you could lose the space after the redirector that we seem to
> no longer prefer:
>
> > +echo $@ >.git/post-checkout.args
>
> And since we are already cleaning up, we could easily move use
> write_script instead, *and* move it into the `setup` test case (which
> makes it easier to use something like
>
>         sh t5403-post-checkout-hook.sh --run=1,13

Done.

> The rest looks good (modulo indentation issues). I would have preferred
> the separate concerns to be addressed in individual commits (one commit to
> replace the `awk` calls, one to avoid the clones, one to simplify by using
> `test_commit`, etc), as that would have been easier to review. But others
> might disagree (Junio recently made the case of smooshing separate
> concerns into single commits, even squashing two of my patches into one
> against my wish), so... I guess you don't have to change this.


I also like commit granularity, but since I'm not familiar with the
workflow in the mailing list, how to amend and resend commits etc. I
try to keep the number of commits low :)

Thanks,
- Orgad

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Rebase: Run post-checkout hook on checkout
@ 2018-12-24 21:24 orgads
  2018-12-24 21:24 ` [PATCH 1/2] t5403: Refactor orgads
  2018-12-24 21:24 ` [PATCH 2/2] Rebase: Run post-checkout hook on checkout orgads
  0 siblings, 2 replies; 12+ messages in thread
From: orgads @ 2018-12-24 21:24 UTC (permalink / raw)
  To: git; +Cc: Orgad Shaneh

From: Orgad Shaneh <orgads@gmail.com>

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
---
 builtin/rebase.c              | 11 +++++++++--
 t/t5403-post-checkout-hook.sh | 20 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/builtin/rebase.c b/builtin/rebase.c
index b5c99ec10c..7f7a2c738e 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -530,6 +530,7 @@ static int run_specific_rebase(struct rebase_options *opts)
 
 #define RESET_HEAD_DETACH (1<<0)
 #define RESET_HEAD_HARD (1<<1)
+#define RESET_HEAD_RUN_HOOK (1<<2)
 
 static int reset_head(struct object_id *oid, const char *action,
 		      const char *switch_to_branch, unsigned flags,
@@ -537,6 +538,7 @@ static int reset_head(struct object_id *oid, const char *action,
 {
 	unsigned detach_head = flags & RESET_HEAD_DETACH;
 	unsigned reset_hard = flags & RESET_HEAD_HARD;
+	unsigned run_hook = flags & RESET_HEAD_RUN_HOOK;
 	struct object_id head_oid;
 	struct tree_desc desc[2] = { { NULL }, { NULL } };
 	struct lock_file lock = LOCK_INIT;
@@ -636,6 +638,10 @@ static int reset_head(struct object_id *oid, const char *action,
 			ret = update_ref(reflog_head, "HEAD", oid, NULL, 0,
 					 UPDATE_REFS_MSG_ON_ERR);
 	}
+	if (run_hook)
+		run_hook_le(NULL, "post-checkout",
+			    oid_to_hex(orig ? orig : &null_oid),
+			    oid_to_hex(oid), "1", NULL);
 
 leave_reset_head:
 	strbuf_release(&msg);
@@ -1465,7 +1471,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 					    getenv(GIT_REFLOG_ACTION_ENVIRONMENT),
 					    options.switch_to);
 				if (reset_head(&oid, "checkout",
-					       options.head_name, 0,
+					       options.head_name,
+					       RESET_HEAD_RUN_HOOK,
 					       NULL, buf.buf) < 0) {
 					ret = !!error(_("could not switch to "
 							"%s"),
@@ -1539,7 +1546,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 	strbuf_addf(&msg, "%s: checkout %s",
 		    getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
 	if (reset_head(&options.onto->object.oid, "checkout", NULL,
-		       RESET_HEAD_DETACH, NULL, msg.buf))
+		       RESET_HEAD_DETACH | RESET_HEAD_RUN_HOOK, NULL, msg.buf))
 		die(_("Could not detach HEAD"));
 	strbuf_release(&msg);
 
diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index 9f9a5163c5..5b4e582caa 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -13,6 +13,8 @@ test_expect_success setup '
 	EOF
 	test_commit one &&
 	test_commit two &&
+	test_commit rebase-on-me &&
+	git reset --hard HEAD^ &&
 	test_commit three three
 '
 
@@ -51,6 +53,24 @@ test_expect_success 'post-checkout receives the right args when not switching br
 	rm -f .git/post-checkout.args
 '
 
+test_expect_success 'post-checkout is triggered on rebase' '
+	git checkout -b rebase-test master &&
+	rm -f .git/post-checkout.args &&
+	git rebase rebase-on-me &&
+	read old new flag < .git/post-checkout.args &&
+	test $old != $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
+'
+
+test_expect_success 'post-checkout is triggered on rebase with fast-forward' '
+	git checkout -b ff-rebase-test rebase-on-me^ &&
+	rm -f .git/post-checkout.args &&
+	git rebase rebase-on-me &&
+	read old new flag < .git/post-checkout.args &&
+	test $old != $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
+'
+
 if test "$(git config --bool core.filemode)" = true; then
 mkdir -p templates/hooks
 write_script templates/hooks/post-checkout <<-\EOF
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 1/2] t5403: Refactor
  2018-12-24 21:24 [PATCH] Rebase: Run post-checkout hook on checkout orgads
@ 2018-12-24 21:24 ` orgads
  2018-12-28 22:34   ` Junio C Hamano
  2018-12-24 21:24 ` [PATCH 2/2] Rebase: Run post-checkout hook on checkout orgads
  1 sibling, 1 reply; 12+ messages in thread
From: orgads @ 2018-12-24 21:24 UTC (permalink / raw)
  To: git; +Cc: Orgad Shaneh

From: Orgad Shaneh <orgads@gmail.com>

* Replace multiple clones and commits by test_commits.
* Replace 3 invocations of awk by read.

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
---
 t/t5403-post-checkout-hook.sh | 80 +++++++++++++----------------------
 1 file changed, 29 insertions(+), 51 deletions(-)

diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index fc898c9eac..9f9a5163c5 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -7,77 +7,55 @@ test_description='Test the post-checkout hook.'
 . ./test-lib.sh
 
 test_expect_success setup '
-	echo Data for commit0. >a &&
-	echo Data for commit0. >b &&
-	git update-index --add a &&
-	git update-index --add b &&
-	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 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
+	mv .git/hooks-disabled .git/hooks &&
+	write_script .git/hooks/post-checkout <<-\EOF &&
+	echo $@ >.git/post-checkout.args
+	EOF
+	test_commit one &&
+	test_commit two &&
+	test_commit three three
 '
 
 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) &&
-	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
-	test $old = $new && test $flag = 1
+	git checkout master &&
+	test -e .git/post-checkout.args &&
+	read old new flag <.git/post-checkout.args &&
+	test $old = $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
 '
 
 test_expect_success 'post-checkout runs as expected ' '
-	GIT_DIR=clone1/.git git checkout master &&
-	test -e clone1/.git/post-checkout.args
+	git checkout master &&
+	test -e .git/post-checkout.args &&
+	rm -f .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) &&
-	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
-	test $old = $new && test $flag = 1
+	git checkout -b new1 &&
+	read old new flag <.git/post-checkout.args &&
+	test $old = $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
 '
 
 test_expect_success 'post-checkout receives the right args 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) &&
-	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
-	test $old != $new && test $flag = 1
+	git checkout two &&
+	read old new flag <.git/post-checkout.args &&
+	test $old != $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
 '
 
 test_expect_success 'post-checkout receives the right args when not switching branches ' '
-	GIT_DIR=clone2/.git git checkout master b &&
-	old=$(awk "{print \$1}" clone2/.git/post-checkout.args) &&
-	new=$(awk "{print \$2}" clone2/.git/post-checkout.args) &&
-	flag=$(awk "{print \$3}" clone2/.git/post-checkout.args) &&
-	test $old = $new && test $flag = 0
+	git checkout master -- three &&
+	read old new flag <.git/post-checkout.args &&
+	test $old = $new && test $flag = 0 &&
+	rm -f .git/post-checkout.args
 '
 
 if test "$(git config --bool core.filemode)" = true; then
 mkdir -p templates/hooks
-cat >templates/hooks/post-checkout <<'EOF'
-#!/bin/sh
-echo $@ > $GIT_DIR/post-checkout.args
+write_script templates/hooks/post-checkout <<-\EOF
+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 &&
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/2] Rebase: Run post-checkout hook on checkout
  2018-12-24 21:24 [PATCH] Rebase: Run post-checkout hook on checkout orgads
  2018-12-24 21:24 ` [PATCH 1/2] t5403: Refactor orgads
@ 2018-12-24 21:24 ` orgads
  2018-12-28 22:53   ` Junio C Hamano
  1 sibling, 1 reply; 12+ messages in thread
From: orgads @ 2018-12-24 21:24 UTC (permalink / raw)
  To: git; +Cc: Orgad Shaneh

From: Orgad Shaneh <orgads@gmail.com>

Signed-off-by: Orgad Shaneh <orgads@gmail.com>
---
 builtin/rebase.c              | 11 +++++++++--
 t/t5403-post-checkout-hook.sh | 20 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/builtin/rebase.c b/builtin/rebase.c
index b5c99ec10c..7f7a2c738e 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -530,6 +530,7 @@ static int run_specific_rebase(struct rebase_options *opts)
 
 #define RESET_HEAD_DETACH (1<<0)
 #define RESET_HEAD_HARD (1<<1)
+#define RESET_HEAD_RUN_HOOK (1<<2)
 
 static int reset_head(struct object_id *oid, const char *action,
 		      const char *switch_to_branch, unsigned flags,
@@ -537,6 +538,7 @@ static int reset_head(struct object_id *oid, const char *action,
 {
 	unsigned detach_head = flags & RESET_HEAD_DETACH;
 	unsigned reset_hard = flags & RESET_HEAD_HARD;
+	unsigned run_hook = flags & RESET_HEAD_RUN_HOOK;
 	struct object_id head_oid;
 	struct tree_desc desc[2] = { { NULL }, { NULL } };
 	struct lock_file lock = LOCK_INIT;
@@ -636,6 +638,10 @@ static int reset_head(struct object_id *oid, const char *action,
 			ret = update_ref(reflog_head, "HEAD", oid, NULL, 0,
 					 UPDATE_REFS_MSG_ON_ERR);
 	}
+	if (run_hook)
+		run_hook_le(NULL, "post-checkout",
+			    oid_to_hex(orig ? orig : &null_oid),
+			    oid_to_hex(oid), "1", NULL);
 
 leave_reset_head:
 	strbuf_release(&msg);
@@ -1465,7 +1471,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 					    getenv(GIT_REFLOG_ACTION_ENVIRONMENT),
 					    options.switch_to);
 				if (reset_head(&oid, "checkout",
-					       options.head_name, 0,
+					       options.head_name,
+					       RESET_HEAD_RUN_HOOK,
 					       NULL, buf.buf) < 0) {
 					ret = !!error(_("could not switch to "
 							"%s"),
@@ -1539,7 +1546,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 	strbuf_addf(&msg, "%s: checkout %s",
 		    getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
 	if (reset_head(&options.onto->object.oid, "checkout", NULL,
-		       RESET_HEAD_DETACH, NULL, msg.buf))
+		       RESET_HEAD_DETACH | RESET_HEAD_RUN_HOOK, NULL, msg.buf))
 		die(_("Could not detach HEAD"));
 	strbuf_release(&msg);
 
diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
index 9f9a5163c5..5b4e582caa 100755
--- a/t/t5403-post-checkout-hook.sh
+++ b/t/t5403-post-checkout-hook.sh
@@ -13,6 +13,8 @@ test_expect_success setup '
 	EOF
 	test_commit one &&
 	test_commit two &&
+	test_commit rebase-on-me &&
+	git reset --hard HEAD^ &&
 	test_commit three three
 '
 
@@ -51,6 +53,24 @@ test_expect_success 'post-checkout receives the right args when not switching br
 	rm -f .git/post-checkout.args
 '
 
+test_expect_success 'post-checkout is triggered on rebase' '
+	git checkout -b rebase-test master &&
+	rm -f .git/post-checkout.args &&
+	git rebase rebase-on-me &&
+	read old new flag < .git/post-checkout.args &&
+	test $old != $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
+'
+
+test_expect_success 'post-checkout is triggered on rebase with fast-forward' '
+	git checkout -b ff-rebase-test rebase-on-me^ &&
+	rm -f .git/post-checkout.args &&
+	git rebase rebase-on-me &&
+	read old new flag < .git/post-checkout.args &&
+	test $old != $new && test $flag = 1 &&
+	rm -f .git/post-checkout.args
+'
+
 if test "$(git config --bool core.filemode)" = true; then
 mkdir -p templates/hooks
 write_script templates/hooks/post-checkout <<-\EOF
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/2] t5403: Refactor
  2018-12-24 21:24 ` [PATCH 1/2] t5403: Refactor orgads
@ 2018-12-28 22:34   ` Junio C Hamano
  2018-12-29  3:06     ` Ramsay Jones
  2018-12-29 21:36     ` Orgad Shaneh
  0 siblings, 2 replies; 12+ messages in thread
From: Junio C Hamano @ 2018-12-28 22:34 UTC (permalink / raw)
  To: orgads; +Cc: git, Ramsay Jones

orgads@gmail.com writes:

> Subject: Re: [PATCH 1/2] t5403: Refactor

Hmph.  "Refactor" alone leaves readers wondering "refactor what?",
"refactor for what?" and "refactor how?".  Given that the overfall
goal this change seeks seems to be to simplify it by losing about 20
lines, how about justifying it like so?

	Subject: t5403: simplify by using a single repository

	There is no strong reason to use separate clones to run
	these tests; just use a single test repository prepared
	with more modern test_commit shell helper function.

	While at it, replace three "awk '{print $N}'" on the same
	file with shell built-in "read" into three variables.

> From: Orgad Shaneh <orgads@gmail.com>
>
> * Replace multiple clones and commits by test_commits.
> * Replace 3 invocations of awk by read.
>
> Signed-off-by: Orgad Shaneh <orgads@gmail.com>
> ---
>  t/t5403-post-checkout-hook.sh | 80 +++++++++++++----------------------
>  1 file changed, 29 insertions(+), 51 deletions(-)
>
> diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
> index fc898c9eac..9f9a5163c5 100755
> --- a/t/t5403-post-checkout-hook.sh
> +++ b/t/t5403-post-checkout-hook.sh
> @@ -7,77 +7,55 @@ test_description='Test the post-checkout hook.'
>  . ./test-lib.sh
>  
>  test_expect_success setup '
> -	echo Data for commit0. >a &&
> -	echo Data for commit0. >b &&
> -	git update-index --add a &&
> -	git update-index --add b &&
> -	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 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
> +	mv .git/hooks-disabled .git/hooks &&

I am not sure why you want to do this---it sends a wrong signal to
readers saying that you want to use whatever hook that are in the
moved-away .git/hooks-disabled/ directory.  I am guessing that the
only reason why you do this is because there must be .git/hooks
directory in order for write_script below to work, so a more
readable approach would be to "mkdir .git/hooks" instead, no?

> +	write_script .git/hooks/post-checkout <<-\EOF &&
> +	echo $@ >.git/post-checkout.args

A dollar-at inside a shell script that is not in a pair of dq always
makes readers wonder if the author forgot dq around it or omitted eq
around it deliberately; avoid it.

In this case, use "$@" (i.e. within dq) would be more friendly to
readers.  The second best is to write it $*, as in this context we
know that $1, $2 and $3 will not contain any $IFS, that echo will
take these three separate arguments and write them on one line
separated by a space in between, which will allow "read A B C" read
them.  Or "$*" to feed such a single line with three arguments
separated by a space in between as a single string to echo for the
same effect.


> +	EOF
> +	test_commit one &&
> +	test_commit two &&
> +	test_commit three three

Makes readers wonder why the last one duplicates.  Is this because
you somehow do not want to use three.t as the pathname in a later
test?  "test_commit X" that creates test file X.t is a quite well
established convention (see "git grep '\.t\>' t/"), by the way.


>  '
>  
>  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) &&
> -	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
> -	test $old = $new && test $flag = 1

> +	git checkout master &&
> +	test -e .git/post-checkout.args &&

Use "test -f", as you do know you'd be creating a file ("-e"
succeeds as long as it _exists_, and does not care if it is a file
or directory or whatever).

> +	read old new flag <.git/post-checkout.args &&

This indeed is much nicer.

> +	test $old = $new && test $flag = 1 &&
> +	rm -f .git/post-checkout.args

The last one is not a test but a clean-up.  If any of the earlier
step failed (e.g. $old and $new were different), the output file
would be left behind, resulting in confusing the next test.

Instead, do it like so:

	test_expect_success 'title of the test' '
        	test_when_finished "rm -f .git/post-checkout.args" &&
		git checkout master &&
		test -f .git/post-checkout.args &&
		read old new flag <.git/post-checkout.args &&
		test $old = $new &&
		test $flag = 1
	'

That is, use test_when_finished() before the step that creates the
file that may be left behind to arrange that it will be cleaned at
the end.

This comment on clean-up applies to _all_ tests in this patch that
has "rm -f .git/post-checkout.args" at the end.

>  '
>  
>  test_expect_success 'post-checkout runs as expected ' '
> -	GIT_DIR=clone1/.git git checkout master &&
> -	test -e clone1/.git/post-checkout.args
> +	git checkout master &&
> +	test -e .git/post-checkout.args &&
> +	rm -f .git/post-checkout.args
>  '

Now that the script got so simplified, this one looks even more
redundant, given that the previous one already checked the same
"checkout 'master' when already at the tip of 'master'" situation.

Do we still need this one, in other words?

>  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) &&
> -	flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
> -	test $old = $new && test $flag = 1
> +	git checkout -b new1 &&
> +	read old new flag <.git/post-checkout.args &&
> +	test $old = $new && test $flag = 1 &&
> +	rm -f .git/post-checkout.args
>  '

This one forgets "did the hook run and create the file" before
"read", unlike the previous tests.  It is not strictly necessary as
"read" will fail if the file is not there, but it'd be better to be
consistent.

>  if test "$(git config --bool core.filemode)" = true; then

This is a tangent but this conditional came from an ancient d42ec126
("disable post-checkout test on Cygwin", 2009-03-17) that says

    disable post-checkout test on Cygwin
    
    It is broken because of the tricks we have to play with
    lstat to get the bearable perfomance out of the call.
    Sadly, it disables access to Cygwin's executable attribute,
    which Windows filesystems do not have at all.

I wonder if this is still relevant these days (Cc'ed Ramsay for
input).  Windows port should be running enabled hooks (and X_OK is
made pretty much no-op in compat/mingw.c IIUC), so the above
conditional is overly broad anyway, even if Cygwin still has issues
with the executable bit.

>  mkdir -p templates/hooks
> -cat >templates/hooks/post-checkout <<'EOF'
> -#!/bin/sh
> -echo $@ > $GIT_DIR/post-checkout.args
> +write_script templates/hooks/post-checkout <<-\EOF
> +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 &&

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] Rebase: Run post-checkout hook on checkout
  2018-12-24 21:24 ` [PATCH 2/2] Rebase: Run post-checkout hook on checkout orgads
@ 2018-12-28 22:53   ` Junio C Hamano
  2018-12-29 21:31     ` Orgad Shaneh
  0 siblings, 1 reply; 12+ messages in thread
From: Junio C Hamano @ 2018-12-28 22:53 UTC (permalink / raw)
  To: orgads; +Cc: git

orgads@gmail.com writes:

> From: Orgad Shaneh <orgads@gmail.com>

> Re: [PATCH 2/2] Rebase: Run post-checkout hook on checkout

There is no explanation here?  

Is this a regression fix (i.e. scripted version of "rebase" used to
run the hook)?  Or a new feature (i.e. no earlier version of
"rebase" run the hook but you think it ought to run it)?

> Signed-off-by: Orgad Shaneh <orgads@gmail.com>
> ---
>  builtin/rebase.c              | 11 +++++++++--
>  t/t5403-post-checkout-hook.sh | 20 ++++++++++++++++++++
>  2 files changed, 29 insertions(+), 2 deletions(-)
>
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> index b5c99ec10c..7f7a2c738e 100644
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@ -530,6 +530,7 @@ static int run_specific_rebase(struct rebase_options *opts)
>  
>  #define RESET_HEAD_DETACH (1<<0)
>  #define RESET_HEAD_HARD (1<<1)
> +#define RESET_HEAD_RUN_HOOK (1<<2)

Would it be plausible that the only possible hook that can be run by
reset_head() function will always be post-checkout and nothing else,
I wonder?  Shouldn't this bit be called *_RUN_POST_CHECKOUT to make
sure it is specific enough?

> @@ -537,6 +538,7 @@ static int reset_head(struct object_id *oid, const char *action,
>  {
>  	unsigned detach_head = flags & RESET_HEAD_DETACH;
>  	unsigned reset_hard = flags & RESET_HEAD_HARD;
> +	unsigned run_hook = flags & RESET_HEAD_RUN_HOOK;
>  	struct object_id head_oid;
>  	struct tree_desc desc[2] = { { NULL }, { NULL } };
>  	struct lock_file lock = LOCK_INIT;
> @@ -636,6 +638,10 @@ static int reset_head(struct object_id *oid, const char *action,
>  			ret = update_ref(reflog_head, "HEAD", oid, NULL, 0,
>  					 UPDATE_REFS_MSG_ON_ERR);
>  	}
> +	if (run_hook)
> +		run_hook_le(NULL, "post-checkout",
> +			    oid_to_hex(orig ? orig : &null_oid),
> +			    oid_to_hex(oid), "1", NULL);
>  

This function is never about checking out paths from tree-ish/index
and is always about checking out a branch, so hardcoded "1" is
justified here.  Good.

> @@ -1465,7 +1471,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>  					    getenv(GIT_REFLOG_ACTION_ENVIRONMENT),
>  					    options.switch_to);
>  				if (reset_head(&oid, "checkout",
> -					       options.head_name, 0,
> +					       options.head_name,
> +					       RESET_HEAD_RUN_HOOK,
>  					       NULL, buf.buf) < 0) {
>  					ret = !!error(_("could not switch to "
>  							"%s"),
> @@ -1539,7 +1546,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>  	strbuf_addf(&msg, "%s: checkout %s",
>  		    getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
>  	if (reset_head(&options.onto->object.oid, "checkout", NULL,
> -		       RESET_HEAD_DETACH, NULL, msg.buf))
> +		       RESET_HEAD_DETACH | RESET_HEAD_RUN_HOOK, NULL, msg.buf))
>  		die(_("Could not detach HEAD"));
>  	strbuf_release(&msg);

So... among 6 callers of reset_head(), these two whose *action is
"checkout" gets the RUN_HOOK bit.  Makes sense.

> diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh
> index 9f9a5163c5..5b4e582caa 100755
> --- a/t/t5403-post-checkout-hook.sh
> +++ b/t/t5403-post-checkout-hook.sh
> @@ -13,6 +13,8 @@ test_expect_success setup '
>  	EOF
>  	test_commit one &&
>  	test_commit two &&
> +	test_commit rebase-on-me &&
> +	git reset --hard HEAD^ &&
>  	test_commit three three
>  '
>  
> @@ -51,6 +53,24 @@ test_expect_success 'post-checkout receives the right args when not switching br
>  	rm -f .git/post-checkout.args
>  '
>  
> +test_expect_success 'post-checkout is triggered on rebase' '
> +	git checkout -b rebase-test master &&
> +	rm -f .git/post-checkout.args &&

Read the title of this whole test script file; it should verify what
is in the file before removing it.

> +	git rebase rebase-on-me &&
> +	read old new flag < .git/post-checkout.args &&

No SP between "<" and ".git/post-checkout.args".

> +	test $old != $new && test $flag = 1 &&
> +	rm -f .git/post-checkout.args
> +'

Regarding the clean-up of this file, see my review on the previous
one.


> +test_expect_success 'post-checkout is triggered on rebase with fast-forward' '

The same comment as above applies to this.


Thanks.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/2] t5403: Refactor
  2018-12-28 22:34   ` Junio C Hamano
@ 2018-12-29  3:06     ` Ramsay Jones
  2018-12-29 21:36     ` Orgad Shaneh
  1 sibling, 0 replies; 12+ messages in thread
From: Ramsay Jones @ 2018-12-29  3:06 UTC (permalink / raw)
  To: Junio C Hamano, orgads; +Cc: git



On 28/12/2018 22:34, Junio C Hamano wrote:
> orgads@gmail.com writes:
> 
>> Subject: Re: [PATCH 1/2] t5403: Refactor
> 
[snip]
>>  if test "$(git config --bool core.filemode)" = true; then
> 
> This is a tangent but this conditional came from an ancient d42ec126
> ("disable post-checkout test on Cygwin", 2009-03-17) that says
> 
>     disable post-checkout test on Cygwin
>     
>     It is broken because of the tricks we have to play with
>     lstat to get the bearable perfomance out of the call.
>     Sadly, it disables access to Cygwin's executable attribute,
>     which Windows filesystems do not have at all.
> 
> I wonder if this is still relevant these days (Cc'ed Ramsay for
> input).  

Ah, no, the 'tricks we have to play with lstat' mentioned in that
commit message are long gone! ;-) If you remove that conditional,
then the test passes just fine.

ATB,
Ramsay Jones

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] Rebase: Run post-checkout hook on checkout
  2018-12-28 22:53   ` Junio C Hamano
@ 2018-12-29 21:31     ` Orgad Shaneh
  0 siblings, 0 replies; 12+ messages in thread
From: Orgad Shaneh @ 2018-12-29 21:31 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On Sat, Dec 29, 2018 at 12:53 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> orgads@gmail.com writes:
>
> > From: Orgad Shaneh <orgads@gmail.com>
>
> > Re: [PATCH 2/2] Rebase: Run post-checkout hook on checkout
>
> There is no explanation here?
>
> Is this a regression fix (i.e. scripted version of "rebase" used to
> run the hook)?  Or a new feature (i.e. no earlier version of
> "rebase" run the hook but you think it ought to run it)?

Added an explanation.

[snip]
>
> > +#define RESET_HEAD_RUN_HOOK (1<<2)
>
> Would it be plausible that the only possible hook that can be run by
> reset_head() function will always be post-checkout and nothing else,
> I wonder?  Shouldn't this bit be called *_RUN_POST_CHECKOUT to make
> sure it is specific enough?

Done

[snip]
>
> > +test_expect_success 'post-checkout is triggered on rebase' '
> > +     git checkout -b rebase-test master &&
> > +     rm -f .git/post-checkout.args &&
>
> Read the title of this whole test script file; it should verify what
> is in the file before removing it.

Why? Other tests already do it. This test is meant for rebase, not
plain checkout.

>
> > +     git rebase rebase-on-me &&
> > +     read old new flag < .git/post-checkout.args &&
>
> No SP between "<" and ".git/post-checkout.args".

Done

> > +     test $old != $new && test $flag = 1 &&
> > +     rm -f .git/post-checkout.args
> > +'
>
> Regarding the clean-up of this file, see my review on the previous
> one.

Done

> > +test_expect_success 'post-checkout is triggered on rebase with fast-forward' '
>
> The same comment as above applies to this.

Done

Thanks,
- Orgad

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/2] t5403: Refactor
  2018-12-28 22:34   ` Junio C Hamano
  2018-12-29  3:06     ` Ramsay Jones
@ 2018-12-29 21:36     ` Orgad Shaneh
  1 sibling, 0 replies; 12+ messages in thread
From: Orgad Shaneh @ 2018-12-29 21:36 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Ramsay Jones

On Sat, Dec 29, 2018 at 12:34 AM Junio C Hamano <gitster@pobox.com> wrote:
>
> orgads@gmail.com writes:
>
> > Subject: Re: [PATCH 1/2] t5403: Refactor
>
> Hmph.  "Refactor" alone leaves readers wondering "refactor what?",
> "refactor for what?" and "refactor how?".  Given that the overfall
> goal this change seeks seems to be to simplify it by losing about 20
> lines, how about justifying it like so?
>
>         Subject: t5403: simplify by using a single repository
>
>         There is no strong reason to use separate clones to run
>         these tests; just use a single test repository prepared
>         with more modern test_commit shell helper function.
>
>         While at it, replace three "awk '{print $N}'" on the same
>         file with shell built-in "read" into three variables.

Done

[snip]
> > +     mv .git/hooks-disabled .git/hooks &&
>
> I am not sure why you want to do this---it sends a wrong signal to
> readers saying that you want to use whatever hook that are in the
> moved-away .git/hooks-disabled/ directory.  I am guessing that the
> only reason why you do this is because there must be .git/hooks
> directory in order for write_script below to work, so a more
> readable approach would be to "mkdir .git/hooks" instead, no?

Agreed. Done.

> > +     write_script .git/hooks/post-checkout <<-\EOF &&
> > +     echo $@ >.git/post-checkout.args
>
> A dollar-at inside a shell script that is not in a pair of dq always
> makes readers wonder if the author forgot dq around it or omitted eq
> around it deliberately; avoid it.
>
> In this case, use "$@" (i.e. within dq) would be more friendly to
> readers.

Done.

[snip]
> > +     EOF
> > +     test_commit one &&
> > +     test_commit two &&
> > +     test_commit three three
>
> Makes readers wonder why the last one duplicates.  Is this because
> you somehow do not want to use three.t as the pathname in a later
> test?  "test_commit X" that creates test file X.t is a quite well
> established convention (see "git grep '\.t\>' t/"), by the way.

Done. I wasn't aware of that.

[snip]
> > +     test -e .git/post-checkout.args &&
>
> Use "test -f", as you do know you'd be creating a file ("-e"
> succeeds as long as it _exists_, and does not care if it is a file
> or directory or whatever).

Just removed these `test -e` lines. read fails anyway if the file doesn't exist.

> > +     read old new flag <.git/post-checkout.args &&
>
> This indeed is much nicer.

Credit goes to Johannes :)

> > +     test $old = $new && test $flag = 1 &&
> > +     rm -f .git/post-checkout.args
>
> The last one is not a test but a clean-up.  If any of the earlier
> step failed (e.g. $old and $new were different), the output file
> would be left behind, resulting in confusing the next test.
>
> Instead, do it like so:
>
>         test_expect_success 'title of the test' '
>                 test_when_finished "rm -f .git/post-checkout.args" &&
>                 git checkout master &&
>                 test -f .git/post-checkout.args &&
>                 read old new flag <.git/post-checkout.args &&
>                 test $old = $new &&
>                 test $flag = 1
>         '
>
> That is, use test_when_finished() before the step that creates the
> file that may be left behind to arrange that it will be cleaned at
> the end.
>
> This comment on clean-up applies to _all_ tests in this patch that
> has "rm -f .git/post-checkout.args" at the end.

Done

> >  test_expect_success 'post-checkout runs as expected ' '
> > -     GIT_DIR=clone1/.git git checkout master &&
> > -     test -e clone1/.git/post-checkout.args
> > +     git checkout master &&
> > +     test -e .git/post-checkout.args &&
> > +     rm -f .git/post-checkout.args
> >  '
>
> Now that the script got so simplified, this one looks even more
> redundant, given that the previous one already checked the same
> "checkout 'master' when already at the tip of 'master'" situation.
>
> Do we still need this one, in other words?

I agree. Removed.

> >  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) &&
> > -     flag=$(awk "{print \$3}" clone1/.git/post-checkout.args) &&
> > -     test $old = $new && test $flag = 1
> > +     git checkout -b new1 &&
> > +     read old new flag <.git/post-checkout.args &&
> > +     test $old = $new && test $flag = 1 &&
> > +     rm -f .git/post-checkout.args
> >  '
>
> This one forgets "did the hook run and create the file" before
> "read", unlike the previous tests.  It is not strictly necessary as
> "read" will fail if the file is not there, but it'd be better to be
> consistent.

Made consistent by removing file existence test, and left only read.

> >  if test "$(git config --bool core.filemode)" = true; then
>
> This is a tangent but this conditional came from an ancient d42ec126
> ("disable post-checkout test on Cygwin", 2009-03-17) that says
>
>     disable post-checkout test on Cygwin
>
>     It is broken because of the tricks we have to play with
>     lstat to get the bearable perfomance out of the call.
>     Sadly, it disables access to Cygwin's executable attribute,
>     which Windows filesystems do not have at all.
>
> I wonder if this is still relevant these days (Cc'ed Ramsay for
> input).  Windows port should be running enabled hooks (and X_OK is
> made pretty much no-op in compat/mingw.c IIUC), so the above
> conditional is overly broad anyway, even if Cygwin still has issues
> with the executable bit.

Reverted.

Thanks,
- Orgad

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-12-29 21:36 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-24 21:24 [PATCH] Rebase: Run post-checkout hook on checkout orgads
2018-12-24 21:24 ` [PATCH 1/2] t5403: Refactor orgads
2018-12-28 22:34   ` Junio C Hamano
2018-12-29  3:06     ` Ramsay Jones
2018-12-29 21:36     ` Orgad Shaneh
2018-12-24 21:24 ` [PATCH 2/2] Rebase: Run post-checkout hook on checkout orgads
2018-12-28 22:53   ` Junio C Hamano
2018-12-29 21:31     ` Orgad Shaneh
  -- strict thread matches above, loose matches on Subject: below --
2018-12-20 21:55 [PATCH 1/2] t5403: Refactor orgads
2018-12-20 21:48 orgads
2018-12-21 16:06 ` Johannes Schindelin
     [not found]   ` <CAGHpTB+9L55Gvezhb7x6Kb49WS_nfzmKdVvpH3_=6GM7y8YQ_g@mail.gmail.com>
2018-12-24 20:54     ` Orgad Shaneh

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).