Merge branch 'cb/p4-pre-submit-hook'

"git p4 submit" learns to ask its own pre-submit hook if it should
continue with submitting.

* cb/p4-pre-submit-hook:
  git-p4: add the `p4-pre-submit` hook
This commit is contained in:
Junio C Hamano
2018-08-15 15:08:27 -07:00
4 changed files with 59 additions and 1 deletions

View File

@ -374,6 +374,14 @@ These options can be used to modify 'git p4 submit' behavior.
been submitted. Implies --disable-rebase. Can also be set with been submitted. Implies --disable-rebase. Can also be set with
git-p4.disableP4Sync. Sync with origin/master still goes ahead if possible. git-p4.disableP4Sync. Sync with origin/master still goes ahead if possible.
Hook for submit
~~~~~~~~~~~~~~~
The `p4-pre-submit` hook is executed if it exists and is executable.
The hook takes no parameters and nothing from standard input. Exiting with
non-zero status from this script prevents `git-p4 submit` from launching.
One usage scenario is to run unit tests in the hook.
Rebase options Rebase options
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
These options can be used to modify 'git p4 rebase' behavior. These options can be used to modify 'git p4 rebase' behavior.

View File

@ -485,6 +485,13 @@ 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-pre-submit
~~~~~~~~~~~~~
This hook is invoked by `git-p4 submit`. It takes no parameters and nothing
from standard input. Exiting with non-zero status from this script prevent
`git-p4 submit` from launching. Run `git-p4 submit --help` for details.
GIT GIT
--- ---
Part of the linkgit:git[1] suite Part of the linkgit:git[1] suite

View File

@ -1494,7 +1494,13 @@ 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"),
] ]
self.description = "Submit changes from git to the perforce depot." self.description = """Submit changes from git to the perforce depot.\n
The `p4-pre-submit` hook is executed if it exists and is executable.
The hook takes no parameters and nothing from standard input. Exiting with
non-zero status from this script prevents `git-p4 submit` from launching.
One usage scenario is to run unit tests in the hook."""
self.usage += " [name of git branch to submit into perforce depot]" self.usage += " [name of git branch to submit into perforce depot]"
self.origin = "" self.origin = ""
self.detectRenames = False self.detectRenames = False
@ -2303,6 +2309,14 @@ class P4Submit(Command, P4UserMap):
sys.exit("number of commits (%d) must match number of shelved changelist (%d)" % sys.exit("number of commits (%d) must match number of shelved changelist (%d)" %
(len(commits), num_shelves)) (len(commits), num_shelves))
hooks_path = gitConfig("core.hooksPath")
if len(hooks_path) <= 0:
hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), "hooks")
hook_file = os.path.join(hooks_path, "p4-pre-submit")
if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and subprocess.call([hook_file]) != 0:
sys.exit(1)
# #
# Apply the commits, one at a time. On failure, ask if should # Apply the commits, one at a time. On failure, ask if should
# continue to try the rest of the patches, or quit. # continue to try the rest of the patches, or quit.

View File

@ -261,6 +261,35 @@ test_expect_success 'unresolvable host in P4PORT should display error' '
) )
' '
# Test following scenarios:
# - Without ".git/hooks/p4-pre-submit" , submit should continue
# - With the hook returning 0, submit should continue
# - With the hook returning 1, submit should abort
test_expect_success 'run hook p4-pre-submit before submit' '
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot &&
(
cd "$git" &&
echo "hello world" >hello.txt &&
git add hello.txt &&
git commit -m "add hello.txt" &&
git config git-p4.skipSubmitEdit true &&
git p4 submit --dry-run >out &&
grep "Would apply" out &&
mkdir -p .git/hooks &&
write_script .git/hooks/p4-pre-submit <<-\EOF &&
exit 0
EOF
git p4 submit --dry-run >out &&
grep "Would apply" out &&
write_script .git/hooks/p4-pre-submit <<-\EOF &&
exit 1
EOF
test_must_fail git p4 submit --dry-run >errs 2>&1 &&
! grep "Would apply" errs
)
'
test_expect_success 'submit from detached head' ' test_expect_success 'submit from detached head' '
test_when_finished cleanup_git && test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot && git p4 clone --dest="$git" //depot &&