git-p4: add p4 submit hooks
The git command "commit" supports a number of hooks that support changing the behavior of the commit command. The git-p4.py program only has one existing hook, "p4-pre-submit". This command occurs early in the process. There are no hooks in the process flow for modifying the P4 changelist text programmatically. Adds 3 new hooks to git-p4.py to the submit option. The new hooks are: * p4-prepare-changelist - Execute this hook after the changelist file has been created. The hook will be executed even if the --prepare-p4-only option is set. This hook ignores the --no-verify option in keeping with the existing behavior of git commit. * p4-changelist - Execute this hook after the user has edited the changelist. Do not execute this hook if the user has selected the --prepare-p4-only option. This hook will honor the --no-verify, following the conventions of git commit. * p4-post-changelist - Execute this hook after the P4 submission process has completed successfully. This hook takes no parameters and is executed regardless of the --no-verify option. It's return value will not be checked. The calls to the new hooks: p4-prepare-changelist, p4-changelist, and p4-post-changelist should all be called inside the try-finally block. Signed-off-by: Ben Keene <seraphire@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
cd1e0dc47a
commit
38ecf75244
@ -387,6 +387,41 @@ It can be bypassed with the `--no-verify` command line option.
|
||||
|
||||
One usage scenario is to run unit tests in the hook.
|
||||
|
||||
p4-prepare-changelist
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The `p4-prepare-changelist` hook is executed right after preparing
|
||||
the default changelist message and before the editor is started.
|
||||
It takes one parameter, the name of the file that contains the
|
||||
changelist text. Exiting with a non-zero status from the script
|
||||
will abort the process.
|
||||
|
||||
The purpose of the hook is to edit the message file in place,
|
||||
and it is not supressed by the `--no-verify` option. This hook
|
||||
is called even if `--prepare-p4-only` is set.
|
||||
|
||||
p4-changelist
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The `p4-changelist` hook is executed after the changelist
|
||||
message has been edited by the user. It can be bypassed with the
|
||||
`--no-verify` option. It takes a single parameter, the name
|
||||
of the file that holds the proposed changelist text. Exiting
|
||||
with a non-zero status causes the command to abort.
|
||||
|
||||
The hook is allowed to edit the changelist file and can be used
|
||||
to normalize the text into some project standard format. It can
|
||||
also be used to refuse the Submit after inspect the message file.
|
||||
|
||||
p4-post-changelist
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The `p4-post-changelist` hook is invoked after the submit has
|
||||
successfully occured in P4. It takes no parameters and is meant
|
||||
primarily for notification and cannot affect the outcome of the
|
||||
git p4 submit action.
|
||||
|
||||
|
||||
|
||||
Rebase options
|
||||
~~~~~~~~~~~~~~
|
||||
|
@ -515,6 +515,52 @@ 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-changelist
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
This hook is invoked by `git-p4 submit`.
|
||||
|
||||
The `p4-changelist` hook is executed after the changelist
|
||||
message has been edited by the user. It can be bypassed with the
|
||||
`--no-verify` option. It takes a single parameter, the name
|
||||
of the file that holds the proposed changelist text. Exiting
|
||||
with a non-zero status causes the command to abort.
|
||||
|
||||
The hook is allowed to edit the changelist file and can be used
|
||||
to normalize the text into some project standard format. It can
|
||||
also be used to refuse the Submit after inspect the message file.
|
||||
|
||||
Run `git-p4 submit --help` for details.
|
||||
|
||||
p4-prepare-changelist
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This hook is invoked by `git-p4 submit`.
|
||||
|
||||
The `p4-prepare-changelist` hook is executed right after preparing
|
||||
the default changelist message and before the editor is started.
|
||||
It takes one parameter, the name of the file that contains the
|
||||
changelist text. Exiting with a non-zero status from the script
|
||||
will abort the process.
|
||||
|
||||
The purpose of the hook is to edit the message file in place,
|
||||
and it is not supressed by the `--no-verify` option. This hook
|
||||
is called even if `--prepare-p4-only` is set.
|
||||
|
||||
Run `git-p4 submit --help` for details.
|
||||
|
||||
p4-post-changelist
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This hook is invoked by `git-p4 submit`.
|
||||
|
||||
The `p4-post-changelist` hook is invoked after the submit has
|
||||
successfully occured in P4. It takes no parameters and is meant
|
||||
primarily for notification and cannot affect the outcome of the
|
||||
git p4 submit action.
|
||||
|
||||
Run `git-p4 submit --help` for details.
|
||||
|
||||
p4-pre-submit
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
|
35
git-p4.py
35
git-p4.py
@ -1589,7 +1589,7 @@ class P4Submit(Command, P4UserMap):
|
||||
optparse.make_option("--disable-p4sync", dest="disable_p4sync", action="store_true",
|
||||
help="Skip Perforce sync of p4/master after submit or shelve"),
|
||||
optparse.make_option("--no-verify", dest="no_verify", action="store_true",
|
||||
help="Bypass p4-pre-submit"),
|
||||
help="Bypass p4-pre-submit and p4-changelist hooks"),
|
||||
]
|
||||
self.description = """Submit changes from git to the perforce depot.\n
|
||||
The `p4-pre-submit` hook is executed if it exists and is executable. It
|
||||
@ -1598,6 +1598,28 @@ class P4Submit(Command, P4UserMap):
|
||||
from this script prevents `git-p4 submit` from launching.
|
||||
|
||||
One usage scenario is to run unit tests in the hook.
|
||||
|
||||
The `p4-prepare-changelist` hook is executed right after preparing the default
|
||||
changelist message and before the editor is started. It takes one parameter,
|
||||
the name of the file that contains the changelist text. Exiting with a non-zero
|
||||
status from the script will abort the process.
|
||||
|
||||
The purpose of the hook is to edit the message file in place, and it is not
|
||||
supressed by the `--no-verify` option. This hook is called even if
|
||||
`--prepare-p4-only` is set.
|
||||
|
||||
The `p4-changelist` hook is executed after the changelist message has been
|
||||
edited by the user. It can be bypassed with the `--no-verify` option. It
|
||||
takes a single parameter, the name of the file that holds the proposed
|
||||
changelist text. Exiting with a non-zero status causes the command to abort.
|
||||
|
||||
The hook is allowed to edit the changelist file and can be used to normalize
|
||||
the text into some project standard format. It can also be used to refuse the
|
||||
Submit after inspect the message file.
|
||||
|
||||
The `p4-post-changelist` hook is invoked after the submit has successfully
|
||||
occured in P4. It takes no parameters and is meant primarily for notification
|
||||
and cannot affect the outcome of the git p4 submit action.
|
||||
"""
|
||||
|
||||
self.usage += " [name of git branch to submit into perforce depot]"
|
||||
@ -2105,6 +2127,10 @@ class P4Submit(Command, P4UserMap):
|
||||
submitted = False
|
||||
|
||||
try:
|
||||
# Allow the hook to edit the changelist text before presenting it
|
||||
# to the user.
|
||||
if not run_git_hook("p4-prepare-changelist", [fileName]):
|
||||
return False
|
||||
|
||||
if self.prepare_p4_only:
|
||||
#
|
||||
@ -2144,6 +2170,12 @@ class P4Submit(Command, P4UserMap):
|
||||
return True
|
||||
|
||||
if self.edit_template(fileName):
|
||||
if not self.no_verify:
|
||||
if not run_git_hook("p4-changelist", [fileName]):
|
||||
print("The p4-changelist hook failed.")
|
||||
sys.stdout.flush()
|
||||
return False
|
||||
|
||||
# read the edited message and submit
|
||||
tmpFile = open(fileName, "rb")
|
||||
message = tmpFile.read()
|
||||
@ -2181,6 +2213,7 @@ class P4Submit(Command, P4UserMap):
|
||||
|
||||
submitted = True
|
||||
|
||||
run_git_hook("p4-post-changelist")
|
||||
finally:
|
||||
# Revert changes if we skip this patch
|
||||
if not submitted or self.shelve:
|
||||
|
Loading…
Reference in New Issue
Block a user