Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-08-01 Thread Junio C Hamano
Chen Bin  writes:

> The `p4-pre-submit` hook is executed before git-p4 submits code.
> If the hook exits with non-zero value, submit process won't start.
>
> Signed-off-by: Chen Bin 
> ---

I see that the only difference between this and what has been queued
on 'pu', i.e. 

  https://github.com/gitster/git/commit/fb78b040c5dc5b80a093d028d13f8cd32ade17cd

is that this is missing the update in

  https://public-inbox.org/git/xmqq1sbkfneo@gitster-ct.c.googlers.com/

and also Luke's "Reviewed-by:".

I recall that you had trouble getting "git p4" in the test (not
"git-p4") working for some reason.  Has that been resolved (iow
have you figured out why it was failing?)

Thanks.


[PATCH 1/1] Add the `p4-pre-submit` hook

2018-08-01 Thread Chen Bin
The `p4-pre-submit` hook is executed before git-p4 submits code.
If the hook exits with non-zero value, submit process won't start.

Signed-off-by: Chen Bin 
---
 Documentation/git-p4.txt   |  8 
 Documentation/githooks.txt |  7 +++
 git-p4.py  | 16 +++-
 t/t9800-git-p4-basic.sh| 29 +
 4 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index f0de3b891..a7aac1b92 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -374,6 +374,14 @@ These options can be used to modify 'git p4 submit' 
behavior.
 been submitted. Implies --disable-rebase. Can also be set with
 git-p4.disableP4Sync. Sync with origin/master still goes ahead if possible.
 
+Hook for submit
+~~~
+The `p4-pre-submit` hook is executed if it exists and is executable.
+The hook takes no parameter and nothing from standard input. Exiting with
+non-zero status from this script prevents `git-p4 submit` from launching.
+
+One usage scenario is to run unit tests in the hook.
+
 Rebase options
 ~~
 These options can be used to modify 'git p4 rebase' behavior.
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index e3c283a17..22fcabbe2 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -485,6 +485,13 @@ The exit status determines whether git will use the data 
from the
 hook to limit its search.  On error, it will fall back to verifying
 all files and folders.
 
+p4-pre-submit
+~
+
+This hook is invoked by `git-p4 submit`. It takes no parameter and nothing
+from standard input. Exiting with non-zero status from this script prevent
+`git-p4 submit` from launching. Run `git-p4 submit --help` for details.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/git-p4.py b/git-p4.py
index b449db1cc..879abfd2b 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1494,7 +1494,13 @@ def __init__(self):
 optparse.make_option("--disable-p4sync", 
dest="disable_p4sync", action="store_true",
  help="Skip Perforce sync of p4/master 
after submit or shelve"),
 ]
-self.description = "Submit changes from git to the perforce depot."
+self.description = """Submit changes from git to the perforce depot.\n
+The `p4-pre-submit` hook is executed if it exists and is executable.
+The hook takes no parameter and nothing from standard input. Exiting with
+non-zero status from this script prevents `git-p4 submit` from launching.
+
+One usage scenario is to run unit tests in the hook."""
+
 self.usage += " [name of git branch to submit into perforce depot]"
 self.origin = ""
 self.detectRenames = False
@@ -2303,6 +2309,14 @@ def run(self, args):
 sys.exit("number of commits (%d) must match number of shelved 
changelist (%d)" %
  (len(commits), num_shelves))
 
+hooks_path = gitConfig("core.hooksPath")
+if len(hooks_path) <= 0:
+hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), 
"hooks")
+
+hook_file = os.path.join(hooks_path, "p4-pre-submit")
+if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and 
subprocess.call([hook_file]) != 0:
+sys.exit(1)
+
 #
 # Apply the commits, one at a time.  On failure, ask if should
 # continue to try the rest of the patches, or quit.
diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index 4849edc4e..729cd2577 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -261,6 +261,35 @@ test_expect_success 'unresolvable host in P4PORT should 
display error' '
)
 '
 
+# Test following scenarios:
+#   - Without ".git/hooks/p4-pre-submit" , submit should continue
+#   - With the hook returning 0, submit should continue
+#   - With the hook returning 1, submit should abort
+test_expect_success 'run hook p4-pre-submit before submit' '
+   test_when_finished cleanup_git &&
+   git p4 clone --dest="$git" //depot &&
+   (
+   cd "$git" &&
+   echo "hello world" >hello.txt &&
+   git add hello.txt &&
+   git commit -m "add hello.txt" &&
+   git config git-p4.skipSubmitEdit true &&
+   git p4 submit --dry-run >out &&
+   grep "Would apply" out &&
+   mkdir -p .git/hooks &&
+   write_script .git/hooks/p4-pre-submit <<-\EOF &&
+   exit 0
+   EOF
+   git p4 submit --dry-run >out &&
+   grep "Would apply" out &&
+   write_script .git/hooks/p4-pre-submit <<-\EOF &&
+   exit 1
+   EOF
+   test_must_fail git p4 submit --dry-run >errs 2>&1 &&
+   ! grep "Would apply" errs
+   )
+'
+
 test_expect_success 'submit from detached head' '
   

Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-08-01 Thread Junio C Hamano
chen bin  writes:

> I updated the patch. But for some reason the test keep failing at this line,
> `test_must_fail git p4 submit --dry-run >errs 2>&1 &&`.
>
> If I change this line to `test_must_fail git-p4 submit --dry-run >errs
> 2>&1 &&` the test will pass.

Hmph.  I somehow suspect that the test also will pass if you changed
it like this:

test_must_fail false >errs 2>&1 &&

IOW, my suspicion is that the shell fails to find "git-p4" [*1*] and
that is why your `test_must_fail git-p4 whatever` lets your test
pass, which is different from the way you _want_ your test_must_fail
succeed, i.e. "git p4 submit" is run with the "--dry-run" option and
exit with non-zero status.

Of course, if the shell cannot find "git-p4", `errs` would not have
the string "Would apply" in it, so the next test also would pass.

 On 31 July 2018 at 10:46, SZEDER Gábor  wrote:
>> + test_must_fail git-p4 submit --dry-run >errs 2>&1 &&>
>> + ! grep "Would apply" err



[Footnote]

 *1* As I do not use (nor install) p4, I cannot test "'git p4' works
 but 'git-p4' should not work" myself, but by running t0001 with
 a trial patch like the following, you can see that we do not
 find the dashed form `git-init` on $PATH and the test indeed
 fails.

 t/t0001-init.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 0681300707..8c598a0d84 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -31,7 +31,7 @@ check_config () {
 }
 
 test_expect_success 'plain' '
-   git init plain &&
+   git-init plain &&
check_config plain/.git false unset
 '
 


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-08-01 Thread chen bin
I updated the patch. But for some reason the test keep failing at this line,
`test_must_fail git p4 submit --dry-run >errs 2>&1 &&`.

If I change this line to `test_must_fail git-p4 submit --dry-run >errs
2>&1 &&` the test will pass.

Could you help me to resolve this issue? I'm really confused. I've
already added latest `p4d` and `p4` to $PATH.

The commit is at
https://github.com/redguardtoo/git/commit/b88c38b9ce6cfb1c1fefef15527adfa92d78daf2


On Wed, Aug 1, 2018 at 5:54 AM, Luke Diamand  wrote:
> On 31 July 2018 at 16:40, Junio C Hamano  wrote:
>> Luke Diamand  writes:
>>
>>> I think there is an error in the test harness.
>>>
>>> On 31 July 2018 at 10:46, SZEDER Gábor  wrote:
> + test_must_fail git-p4 submit --dry-run >errs 2>&1 &&>
> + ! grep "Would apply" err
>>>
>>> It writes to the file "errs" but then looks for the message in "err".
>>>
>>> Luke
>>
>> Sigh. Thanks for spotting, both of you.
>>
>> Here is what I'd locally squash in.  If there is anything else, I'd
>> rather see a refreshed final one sent by the author.
>>
>> Thanks.
>>
>>  t/t9800-git-p4-basic.sh | 8 
>>  1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
>> index 2b7baa95d2..729cd25770 100755
>> --- a/t/t9800-git-p4-basic.sh
>> +++ b/t/t9800-git-p4-basic.sh
>> @@ -274,19 +274,19 @@ test_expect_success 'run hook p4-pre-submit before 
>> submit' '
>> git add hello.txt &&
>> git commit -m "add hello.txt" &&
>> git config git-p4.skipSubmitEdit true &&
>> -   git-p4 submit --dry-run >out &&
>> +   git p4 submit --dry-run >out &&
>> grep "Would apply" out &&
>> mkdir -p .git/hooks &&
>> write_script .git/hooks/p4-pre-submit <<-\EOF &&
>> exit 0
>> EOF
>> -   git-p4 submit --dry-run >out &&
>> +   git p4 submit --dry-run >out &&
>> grep "Would apply" out &&
>> write_script .git/hooks/p4-pre-submit <<-\EOF &&
>> exit 1
>> EOF
>> -   test_must_fail git-p4 submit --dry-run >errs 2>&1 &&
>> -   ! grep "Would apply" err
>> +   test_must_fail git p4 submit --dry-run >errs 2>&1 &&
>> +   ! grep "Would apply" errs
>> )
>>  '
>
> That set of deltas works for me.
>
> Sorry, I should have run the tests myself earlier and I would have
> picked up on this.



-- 
help me, help you.


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-31 Thread Luke Diamand
On 31 July 2018 at 16:40, Junio C Hamano  wrote:
> Luke Diamand  writes:
>
>> I think there is an error in the test harness.
>>
>> On 31 July 2018 at 10:46, SZEDER Gábor  wrote:
 + test_must_fail git-p4 submit --dry-run >errs 2>&1 &&>
 + ! grep "Would apply" err
>>
>> It writes to the file "errs" but then looks for the message in "err".
>>
>> Luke
>
> Sigh. Thanks for spotting, both of you.
>
> Here is what I'd locally squash in.  If there is anything else, I'd
> rather see a refreshed final one sent by the author.
>
> Thanks.
>
>  t/t9800-git-p4-basic.sh | 8 
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
> index 2b7baa95d2..729cd25770 100755
> --- a/t/t9800-git-p4-basic.sh
> +++ b/t/t9800-git-p4-basic.sh
> @@ -274,19 +274,19 @@ test_expect_success 'run hook p4-pre-submit before 
> submit' '
> git add hello.txt &&
> git commit -m "add hello.txt" &&
> git config git-p4.skipSubmitEdit true &&
> -   git-p4 submit --dry-run >out &&
> +   git p4 submit --dry-run >out &&
> grep "Would apply" out &&
> mkdir -p .git/hooks &&
> write_script .git/hooks/p4-pre-submit <<-\EOF &&
> exit 0
> EOF
> -   git-p4 submit --dry-run >out &&
> +   git p4 submit --dry-run >out &&
> grep "Would apply" out &&
> write_script .git/hooks/p4-pre-submit <<-\EOF &&
> exit 1
> EOF
> -   test_must_fail git-p4 submit --dry-run >errs 2>&1 &&
> -   ! grep "Would apply" err
> +   test_must_fail git p4 submit --dry-run >errs 2>&1 &&
> +   ! grep "Would apply" errs
> )
>  '

That set of deltas works for me.

Sorry, I should have run the tests myself earlier and I would have
picked up on this.


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-31 Thread Junio C Hamano
Luke Diamand  writes:

> I think there is an error in the test harness.
>
> On 31 July 2018 at 10:46, SZEDER Gábor  wrote:
>>> + test_must_fail git-p4 submit --dry-run >errs 2>&1 &&>
>>> + ! grep "Would apply" err
>
> It writes to the file "errs" but then looks for the message in "err".
>
> Luke

Sigh. Thanks for spotting, both of you.

Here is what I'd locally squash in.  If there is anything else, I'd
rather see a refreshed final one sent by the author.

Thanks.

 t/t9800-git-p4-basic.sh | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index 2b7baa95d2..729cd25770 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -274,19 +274,19 @@ test_expect_success 'run hook p4-pre-submit before 
submit' '
git add hello.txt &&
git commit -m "add hello.txt" &&
git config git-p4.skipSubmitEdit true &&
-   git-p4 submit --dry-run >out &&
+   git p4 submit --dry-run >out &&
grep "Would apply" out &&
mkdir -p .git/hooks &&
write_script .git/hooks/p4-pre-submit <<-\EOF &&
exit 0
EOF
-   git-p4 submit --dry-run >out &&
+   git p4 submit --dry-run >out &&
grep "Would apply" out &&
write_script .git/hooks/p4-pre-submit <<-\EOF &&
exit 1
EOF
-   test_must_fail git-p4 submit --dry-run >errs 2>&1 &&
-   ! grep "Would apply" err
+   test_must_fail git p4 submit --dry-run >errs 2>&1 &&
+   ! grep "Would apply" errs
)
 '
 


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-31 Thread Luke Diamand
I think there is an error in the test harness.

On 31 July 2018 at 10:46, SZEDER Gábor  wrote:
>> + test_must_fail git-p4 submit --dry-run >errs 2>&1 &&>
>> + ! grep "Would apply" err

It writes to the file "errs" but then looks for the message in "err".

Luke


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-31 Thread SZEDER Gábor


> diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
> index 4849edc4e..2b7baa95d 100755
> --- a/t/t9800-git-p4-basic.sh
> +++ b/t/t9800-git-p4-basic.sh
> @@ -261,6 +261,35 @@ test_expect_success 'unresolvable host in P4PORT should 
> display error' '
>   )
>  '
>  
> +# Test following scenarios:
> +#   - Without ".git/hooks/p4-pre-submit" , submit should continue
> +#   - With the hook returning 0, submit should continue
> +#   - With the hook returning 1, submit should abort
> +test_expect_success 'run hook p4-pre-submit before submit' '
> + test_when_finished cleanup_git &&
> + git p4 clone --dest="$git" //depot &&
> + (
> + cd "$git" &&
> + echo "hello world" >hello.txt &&
> + git add hello.txt &&
> + git commit -m "add hello.txt" &&
> + git config git-p4.skipSubmitEdit true &&
> + git-p4 submit --dry-run >out &&

This must be 'git p4 ...', i.e. without dash.

The dashed form causes the test to fail:

  <...>
  +git config git-p4.skipSubmitEdit true
  +git-p4 submit --dry-run
  t9800-git-p4-basic.sh: 12: eval: git-p4: not found
  error: last command exited with $?=127
  not ok 19 - run hook p4-pre-submit before submit


> + grep "Would apply" out &&
> + mkdir -p .git/hooks &&
> + write_script .git/hooks/p4-pre-submit <<-\EOF &&
> + exit 0
> + EOF
> + git-p4 submit --dry-run >out &&

Likewise.

> + grep "Would apply" out &&
> + write_script .git/hooks/p4-pre-submit <<-\EOF &&
> + exit 1
> + EOF
> + test_must_fail git-p4 submit --dry-run >errs 2>&1 &&

Likewise.

> + ! grep "Would apply" err
> + )
> +'
> +
>  test_expect_success 'submit from detached head' '
>   test_when_finished cleanup_git &&
>   git p4 clone --dest="$git" //depot &&
> -- 
> 2.18.0
> 
> 


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-30 Thread Junio C Hamano
Luke Diamand  writes:

> Possibly it should say "it takes no parameters" rather than "it takes
> no parameter"; it is confusing that in English, zero takes the plural
> rather than the singular. There's a PhD in linguistics there for
> someone!

I count three instances.  Will squash in the following while queuing
with your Reviewed-by.

Thanks.

 Documentation/git-p4.txt   | 2 +-
 Documentation/githooks.txt | 2 +-
 git-p4.py  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index a7aac1b920..41780a5aa9 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -377,7 +377,7 @@ These options can be used to modify 'git p4 submit' 
behavior.
 Hook for submit
 ~~~
 The `p4-pre-submit` hook is executed if it exists and is executable.
-The hook takes no parameter and nothing from standard input. Exiting with
+The hook takes no parameters and nothing from standard input. Exiting with
 non-zero status from this script prevents `git-p4 submit` from launching.
 
 One usage scenario is to run unit tests in the hook.
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 22fcabbe21..959044347e 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -488,7 +488,7 @@ all files and folders.
 p4-pre-submit
 ~
 
-This hook is invoked by `git-p4 submit`. It takes no parameter and nothing
+This hook is invoked by `git-p4 submit`. It takes no parameters and nothing
 from standard input. Exiting with non-zero status from this script prevent
 `git-p4 submit` from launching. Run `git-p4 submit --help` for details.
 
diff --git a/git-p4.py b/git-p4.py
index 879abfd2b1..7fab255584 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1496,7 +1496,7 @@ def __init__(self):
 ]
 self.description = """Submit changes from git to the perforce depot.\n
 The `p4-pre-submit` hook is executed if it exists and is executable.
-The hook takes no parameter and nothing from standard input. Exiting with
+The hook takes no parameters and nothing from standard input. Exiting with
 non-zero status from this script prevents `git-p4 submit` from launching.
 
 One usage scenario is to run unit tests in the hook."""


Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-30 Thread Luke Diamand
On 30 July 2018 at 20:07, Junio C Hamano  wrote:
> Chen Bin  writes:
>
>> The `p4-pre-submit` hook is executed before git-p4 submits code.
>> If the hook exits with non-zero value, submit process not start.
>>
>> Signed-off-by: Chen Bin 
>> ---
>
> Luke, does this version look good to you?
>

Yes, I think so, We might find in the future that we do need an
additional hook *after* the change has been applied, but as per Chen's
comment, it sounds like that's not what is needed here; it can easily
be added in the future if necessary.

And there's no directly equivalent existing git-hook which could be
used instead, so this seems like a useful addition.

Possibly it should say "it takes no parameters" rather than "it takes
no parameter"; it is confusing that in English, zero takes the plural
rather than the singular. There's a PhD in linguistics there for
someone!

Luke


> I still think the addition to self.description is a bit too much but
> other than that the incremental since the last one looked sensible
> to my untrained eyes ;-)
>
> Thanks, both.
>
>>  Documentation/git-p4.txt   |  8 
>>  Documentation/githooks.txt |  7 +++
>>  git-p4.py  | 16 +++-
>>  t/t9800-git-p4-basic.sh| 29 +
>>  4 files changed, 59 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
>> index f0de3b891..a7aac1b92 100644
>> --- a/Documentation/git-p4.txt
>> +++ b/Documentation/git-p4.txt
>> @@ -374,6 +374,14 @@ These options can be used to modify 'git p4 submit' 
>> behavior.
>>  been submitted. Implies --disable-rebase. Can also be set with
>>  git-p4.disableP4Sync. Sync with origin/master still goes ahead if 
>> possible.
>>
>> +Hook for submit
>> +~~~
>> +The `p4-pre-submit` hook is executed if it exists and is executable.
>> +The hook takes no parameter and nothing from standard input. Exiting with
>> +non-zero status from this script prevents `git-p4 submit` from launching.
>> +
>> +One usage scenario is to run unit tests in the hook.
>> +
>>  Rebase options
>>  ~~
>>  These options can be used to modify 'git p4 rebase' behavior.
>> diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
>> index e3c283a17..22fcabbe2 100644
>> --- a/Documentation/githooks.txt
>> +++ b/Documentation/githooks.txt
>> @@ -485,6 +485,13 @@ The exit status determines whether git will use the 
>> data from the
>>  hook to limit its search.  On error, it will fall back to verifying
>>  all files and folders.
>>
>> +p4-pre-submit
>> +~
>> +
>> +This hook is invoked by `git-p4 submit`. It takes no parameter and nothing
>> +from standard input. Exiting with non-zero status from this script prevent
>> +`git-p4 submit` from launching. Run `git-p4 submit --help` for details.
>> +
>>  GIT
>>  ---
>>  Part of the linkgit:git[1] suite
>> diff --git a/git-p4.py b/git-p4.py
>> index b449db1cc..879abfd2b 100755
>> --- a/git-p4.py
>> +++ b/git-p4.py
>> @@ -1494,7 +1494,13 @@ def __init__(self):
>>  optparse.make_option("--disable-p4sync", 
>> dest="disable_p4sync", action="store_true",
>>   help="Skip Perforce sync of p4/master 
>> after submit or shelve"),
>>  ]
>> -self.description = "Submit changes from git to the perforce depot."
>> +self.description = """Submit changes from git to the perforce 
>> depot.\n
>> +The `p4-pre-submit` hook is executed if it exists and is executable.
>> +The hook takes no parameter and nothing from standard input. Exiting 
>> with
>> +non-zero status from this script prevents `git-p4 submit` from 
>> launching.
>> +
>> +One usage scenario is to run unit tests in the hook."""
>> +
>>  self.usage += " [name of git branch to submit into perforce depot]"
>>  self.origin = ""
>>  self.detectRenames = False
>> @@ -2303,6 +2309,14 @@ def run(self, args):
>>  sys.exit("number of commits (%d) must match number of shelved 
>> changelist (%d)" %
>>   (len(commits), num_shelves))
>>
>> +hooks_path = gitConfig("core.hooksPath")
>> +if len(hooks_path) <= 0:
>> +hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), 
>> "hooks")
>> +
>> +hook_file = os.path.join(hooks_path, "p4-pre-submit")
>> +if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and 
>> subprocess.call([hook_file]) != 0:
>> +sys.exit(1)
>> +
>>  #
>>  # Apply the commits, one at a time.  On failure, ask if should
>>  # continue to try the rest of the patches, or quit.
>> diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
>> index 4849edc4e..2b7baa95d 100755
>> --- a/t/t9800-git-p4-basic.sh
>> +++ b/t/t9800-git-p4-basic.sh
>> @@ -261,6 +261,35 @@ test_expect_success 'unresolvable host in P4PORT should 
>> display error' '
>>   )
>>  '
>>
>> +# Test 

Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-30 Thread Junio C Hamano
Chen Bin  writes:

> The `p4-pre-submit` hook is executed before git-p4 submits code.
> If the hook exits with non-zero value, submit process not start.
>
> Signed-off-by: Chen Bin 
> ---

Luke, does this version look good to you?

I still think the addition to self.description is a bit too much but
other than that the incremental since the last one looked sensible
to my untrained eyes ;-)

Thanks, both.

>  Documentation/git-p4.txt   |  8 
>  Documentation/githooks.txt |  7 +++
>  git-p4.py  | 16 +++-
>  t/t9800-git-p4-basic.sh| 29 +
>  4 files changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
> index f0de3b891..a7aac1b92 100644
> --- a/Documentation/git-p4.txt
> +++ b/Documentation/git-p4.txt
> @@ -374,6 +374,14 @@ These options can be used to modify 'git p4 submit' 
> behavior.
>  been submitted. Implies --disable-rebase. Can also be set with
>  git-p4.disableP4Sync. Sync with origin/master still goes ahead if 
> possible.
>  
> +Hook for submit
> +~~~
> +The `p4-pre-submit` hook is executed if it exists and is executable.
> +The hook takes no parameter and nothing from standard input. Exiting with
> +non-zero status from this script prevents `git-p4 submit` from launching.
> +
> +One usage scenario is to run unit tests in the hook.
> +
>  Rebase options
>  ~~
>  These options can be used to modify 'git p4 rebase' behavior.
> diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
> index e3c283a17..22fcabbe2 100644
> --- a/Documentation/githooks.txt
> +++ b/Documentation/githooks.txt
> @@ -485,6 +485,13 @@ The exit status determines whether git will use the data 
> from the
>  hook to limit its search.  On error, it will fall back to verifying
>  all files and folders.
>  
> +p4-pre-submit
> +~
> +
> +This hook is invoked by `git-p4 submit`. It takes no parameter and nothing
> +from standard input. Exiting with non-zero status from this script prevent
> +`git-p4 submit` from launching. Run `git-p4 submit --help` for details.
> +
>  GIT
>  ---
>  Part of the linkgit:git[1] suite
> diff --git a/git-p4.py b/git-p4.py
> index b449db1cc..879abfd2b 100755
> --- a/git-p4.py
> +++ b/git-p4.py
> @@ -1494,7 +1494,13 @@ def __init__(self):
>  optparse.make_option("--disable-p4sync", 
> dest="disable_p4sync", action="store_true",
>   help="Skip Perforce sync of p4/master 
> after submit or shelve"),
>  ]
> -self.description = "Submit changes from git to the perforce depot."
> +self.description = """Submit changes from git to the perforce 
> depot.\n
> +The `p4-pre-submit` hook is executed if it exists and is executable.
> +The hook takes no parameter and nothing from standard input. Exiting with
> +non-zero status from this script prevents `git-p4 submit` from launching.
> +
> +One usage scenario is to run unit tests in the hook."""
> +
>  self.usage += " [name of git branch to submit into perforce depot]"
>  self.origin = ""
>  self.detectRenames = False
> @@ -2303,6 +2309,14 @@ def run(self, args):
>  sys.exit("number of commits (%d) must match number of shelved 
> changelist (%d)" %
>   (len(commits), num_shelves))
>  
> +hooks_path = gitConfig("core.hooksPath")
> +if len(hooks_path) <= 0:
> +hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), 
> "hooks")
> +
> +hook_file = os.path.join(hooks_path, "p4-pre-submit")
> +if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and 
> subprocess.call([hook_file]) != 0:
> +sys.exit(1)
> +
>  #
>  # Apply the commits, one at a time.  On failure, ask if should
>  # continue to try the rest of the patches, or quit.
> diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
> index 4849edc4e..2b7baa95d 100755
> --- a/t/t9800-git-p4-basic.sh
> +++ b/t/t9800-git-p4-basic.sh
> @@ -261,6 +261,35 @@ test_expect_success 'unresolvable host in P4PORT should 
> display error' '
>   )
>  '
>  
> +# Test following scenarios:
> +#   - Without ".git/hooks/p4-pre-submit" , submit should continue
> +#   - With the hook returning 0, submit should continue
> +#   - With the hook returning 1, submit should abort
> +test_expect_success 'run hook p4-pre-submit before submit' '
> + test_when_finished cleanup_git &&
> + git p4 clone --dest="$git" //depot &&
> + (
> + cd "$git" &&
> + echo "hello world" >hello.txt &&
> + git add hello.txt &&
> + git commit -m "add hello.txt" &&
> + git config git-p4.skipSubmitEdit true &&
> + git-p4 submit --dry-run >out &&
> + grep "Would apply" out &&
> + mkdir -p .git/hooks &&
> + write_script 

Re: [PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-27 Thread Eric Sunshine
On Fri, Jul 27, 2018 at 7:22 AM Chen Bin  wrote:
> The `p4-pre-submit` hook is executed before git-p4 submits code.
> If the hook exits with non-zero value, submit process not start.
>
> Signed-off-by: Chen Bin 
> ---
> diff --git a/git-p4.py b/git-p4.py
> @@ -1494,7 +1494,13 @@ def __init__(self):
> -self.description = "Submit changes from git to the perforce depot."
> +self.description = """Submit changes from git to the perforce 
> depot.\n

It seemed odd to have an explicit \n within a """...""" string as
opposed to simply using a blank line, but I see there is existing
precedence in git-p4.py when setting (at least one) self.description.
Okay.

> +The `p4-pre-submit` hook is executed if it exists and is executable.
> +The hook takes no parameter and nothing from standard input. Exiting with
> +non-zero status from this script prevents `git-p4 submit` from launching.
> +
> +One usage scenario is to run unit tests in the hook."""


[PATCH 1/1] Add the `p4-pre-submit` hook

2018-07-27 Thread Chen Bin
The `p4-pre-submit` hook is executed before git-p4 submits code.
If the hook exits with non-zero value, submit process not start.

Signed-off-by: Chen Bin 
---
 Documentation/git-p4.txt   |  8 
 Documentation/githooks.txt |  7 +++
 git-p4.py  | 16 +++-
 t/t9800-git-p4-basic.sh| 29 +
 4 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index f0de3b891..a7aac1b92 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -374,6 +374,14 @@ These options can be used to modify 'git p4 submit' 
behavior.
 been submitted. Implies --disable-rebase. Can also be set with
 git-p4.disableP4Sync. Sync with origin/master still goes ahead if possible.
 
+Hook for submit
+~~~
+The `p4-pre-submit` hook is executed if it exists and is executable.
+The hook takes no parameter and nothing from standard input. Exiting with
+non-zero status from this script prevents `git-p4 submit` from launching.
+
+One usage scenario is to run unit tests in the hook.
+
 Rebase options
 ~~
 These options can be used to modify 'git p4 rebase' behavior.
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index e3c283a17..22fcabbe2 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -485,6 +485,13 @@ The exit status determines whether git will use the data 
from the
 hook to limit its search.  On error, it will fall back to verifying
 all files and folders.
 
+p4-pre-submit
+~
+
+This hook is invoked by `git-p4 submit`. It takes no parameter and nothing
+from standard input. Exiting with non-zero status from this script prevent
+`git-p4 submit` from launching. Run `git-p4 submit --help` for details.
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/git-p4.py b/git-p4.py
index b449db1cc..879abfd2b 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1494,7 +1494,13 @@ def __init__(self):
 optparse.make_option("--disable-p4sync", 
dest="disable_p4sync", action="store_true",
  help="Skip Perforce sync of p4/master 
after submit or shelve"),
 ]
-self.description = "Submit changes from git to the perforce depot."
+self.description = """Submit changes from git to the perforce depot.\n
+The `p4-pre-submit` hook is executed if it exists and is executable.
+The hook takes no parameter and nothing from standard input. Exiting with
+non-zero status from this script prevents `git-p4 submit` from launching.
+
+One usage scenario is to run unit tests in the hook."""
+
 self.usage += " [name of git branch to submit into perforce depot]"
 self.origin = ""
 self.detectRenames = False
@@ -2303,6 +2309,14 @@ def run(self, args):
 sys.exit("number of commits (%d) must match number of shelved 
changelist (%d)" %
  (len(commits), num_shelves))
 
+hooks_path = gitConfig("core.hooksPath")
+if len(hooks_path) <= 0:
+hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), 
"hooks")
+
+hook_file = os.path.join(hooks_path, "p4-pre-submit")
+if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and 
subprocess.call([hook_file]) != 0:
+sys.exit(1)
+
 #
 # Apply the commits, one at a time.  On failure, ask if should
 # continue to try the rest of the patches, or quit.
diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index 4849edc4e..2b7baa95d 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -261,6 +261,35 @@ test_expect_success 'unresolvable host in P4PORT should 
display error' '
)
 '
 
+# Test following scenarios:
+#   - Without ".git/hooks/p4-pre-submit" , submit should continue
+#   - With the hook returning 0, submit should continue
+#   - With the hook returning 1, submit should abort
+test_expect_success 'run hook p4-pre-submit before submit' '
+   test_when_finished cleanup_git &&
+   git p4 clone --dest="$git" //depot &&
+   (
+   cd "$git" &&
+   echo "hello world" >hello.txt &&
+   git add hello.txt &&
+   git commit -m "add hello.txt" &&
+   git config git-p4.skipSubmitEdit true &&
+   git-p4 submit --dry-run >out &&
+   grep "Would apply" out &&
+   mkdir -p .git/hooks &&
+   write_script .git/hooks/p4-pre-submit <<-\EOF &&
+   exit 0
+   EOF
+   git-p4 submit --dry-run >out &&
+   grep "Would apply" out &&
+   write_script .git/hooks/p4-pre-submit <<-\EOF &&
+   exit 1
+   EOF
+   test_must_fail git-p4 submit --dry-run >errs 2>&1 &&
+   ! grep "Would apply" err
+   )
+'
+
 test_expect_success 'submit from detached head' '