Skip to content

Commit

Permalink
git-p4: add p4 submit hooks
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
seraphire authored and gitster committed Feb 14, 2020
1 parent cd1e0dc commit 38ecf75
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 1 deletion.
35 changes: 35 additions & 0 deletions Documentation/git-p4.txt
Expand Up @@ -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
~~~~~~~~~~~~~~
Expand Down
46 changes: 46 additions & 0 deletions Documentation/githooks.txt
Expand Up @@ -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
~~~~~~~~~~~~~

Expand Down
35 changes: 34 additions & 1 deletion git-p4.py
Expand Up @@ -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
Expand All @@ -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]"
Expand Down Expand Up @@ -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:
#
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 38ecf75

Please sign in to comment.