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>
Ben Keene committedFeb 14, 2020 at 14:44 UTC38ecf75244c4cab93ecb201afff8980c29f56ce8
3 files changed+115-1
Documentation/git-p4.txt
+35
index 362b50eb21..dab9609013 100644--- a/Documentation/git-p4.txt+++ b/Documentation/git-p4.txt@@ -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 ~~~~~~~~~~~~~~
Documentation/githooks.txt
+46
index 8cf6b08b55..8aa9c2176c 100644--- a/Documentation/githooks.txt+++ b/Documentation/githooks.txt@@ -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 ~~~~~~~~~~~~~
git-p4.py
+34-1
index 4ae6aa30f0..8761c70e1c 100755--- a/git-p4.py+++ b/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: