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.
|
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
|
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
|
hook to limit its search. On error, it will fall back to verifying
|
||||||
all files and folders.
|
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
|
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",
|
optparse.make_option("--disable-p4sync", dest="disable_p4sync", action="store_true",
|
||||||
help="Skip Perforce sync of p4/master after submit or shelve"),
|
help="Skip Perforce sync of p4/master after submit or shelve"),
|
||||||
optparse.make_option("--no-verify", dest="no_verify", action="store_true",
|
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
|
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
|
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.
|
from this script prevents `git-p4 submit` from launching.
|
||||||
|
|
||||||
One usage scenario is to run unit tests in the hook.
|
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]"
|
self.usage += " [name of git branch to submit into perforce depot]"
|
||||||
@ -2105,6 +2127,10 @@ class P4Submit(Command, P4UserMap):
|
|||||||
submitted = False
|
submitted = False
|
||||||
|
|
||||||
try:
|
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:
|
if self.prepare_p4_only:
|
||||||
#
|
#
|
||||||
@ -2144,6 +2170,12 @@ class P4Submit(Command, P4UserMap):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
if self.edit_template(fileName):
|
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
|
# read the edited message and submit
|
||||||
tmpFile = open(fileName, "rb")
|
tmpFile = open(fileName, "rb")
|
||||||
message = tmpFile.read()
|
message = tmpFile.read()
|
||||||
@ -2181,6 +2213,7 @@ class P4Submit(Command, P4UserMap):
|
|||||||
|
|
||||||
submitted = True
|
submitted = True
|
||||||
|
|
||||||
|
run_git_hook("p4-post-changelist")
|
||||||
finally:
|
finally:
|
||||||
# Revert changes if we skip this patch
|
# Revert changes if we skip this patch
|
||||||
if not submitted or self.shelve:
|
if not submitted or self.shelve:
|
||||||
|
Loading…
Reference in New Issue
Block a user