1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-04 05:26:13 +02:00

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:
Ben Keene 2020-02-14 14:44:45 +00:00 committed by Junio C Hamano
parent cd1e0dc47a
commit 38ecf75244
3 changed files with 115 additions and 1 deletions

View File

@ -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
~~~~~~~~~~~~~~

View File

@ -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
~~~~~~~~~~~~~

View File

@ -1589,7 +1589,7 @@ 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"),
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 @@ def __init__(self):
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 @@ def applyCommit(self, id):
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 @@ def applyCommit(self, id):
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 @@ def applyCommit(self, id):
submitted = True
run_git_hook("p4-post-changelist")
finally:
# Revert changes if we skip this patch
if not submitted or self.shelve: