Add custom scripts features.

- Allow running custom scripts on different action of git-review.
- Fixes bug 1021870.

Change-Id: I0e6e72322115daf3986e5957d79de0f3402e7841
This commit is contained in:
Chmouel Boudjnah
2013-01-16 14:00:10 +01:00
committed by Chmouel Boudjnah
parent eae8ead205
commit eb4fc7c5c7
2 changed files with 61 additions and 1 deletions

View File

@@ -76,6 +76,30 @@ Optional values: port (default: 29418), defaultbranch (default: master)
* git-review will create a gerrit remote upon first run
Hooks
-----
git-review has a custom hook mechanism to run a script before certain
actions. This is done in the same spirit as the classic hooks in git.
There are two types of hooks, a global one which is stored in
~/.config/git-review/hooks/ and one local to the repository stored in
.git/hooks/ with the other git hook scripts.
__The script needs be executable before getting executed__
The name of the script is $action-review where action can be
:
* pre - run at first before doing anything.
* post - run at the end after the review was sent.
* draft - run when in draft mode.
if the script returns with an exit status different than zero,
git-review will exit with the a custom shell exit code 71.
Installation
------------

View File

@@ -178,6 +178,32 @@ class GitDirectoriesException(CommandFailed):
EXIT_CODE = 70
class CustomScriptException(CommandFailed):
"""Custom script execution failed"""
EXIT_CODE = 71
def run_custom_script(action):
"""Get status and output of .git/hooks/$action-review or/and
~/.config/hooks/$action-review if existing."""
returns = []
script_file = "%s-review" % (action)
(top_dir, git_dir) = git_directories()
paths = [os.path.join(CONFIGDIR, "hooks", script_file),
os.path.join(git_dir, "hooks", script_file)]
for fpath in paths:
if os.path.isfile(fpath) and os.access(fpath, os.X_OK):
status, output = run_command_status(fpath)
returns.append((status, output, fpath))
for (status, output, path) in returns:
if status is not None and status != 0:
raise CustomScriptException(status, output, [path], {})
elif output and VERBOSE:
print("script %s output is:" % (path))
print(output)
class CannotInstallHook(CommandFailed):
"Problems encountered installing commit-msg hook"
EXIT_CODE = 2
@@ -854,7 +880,7 @@ def main():
action=DownloadFlag, metavar="CHANGE",
const="download",
help="Download the contents of an existing gerrit "
"review into a branch")
"review into a branch")
fetch.add_argument("-x", "--cherrypick", dest="changeidentifier",
action=DownloadFlag, metavar="CHANGE",
const="cherrypickcommit",
@@ -890,6 +916,9 @@ def main():
"you are submitting more than one patch")
parser.add_argument("-v", "--verbose", dest="verbose", action="store_true",
help="Output more information about what's going on")
parser.add_argument("--no-custom-script", dest="custom_script",
action="store_false", default=True,
help="Do not run custom scripts.")
parser.add_argument("--license", dest="license", action="store_true",
help="Print the license and exit")
parser.add_argument("--version", action="version",
@@ -941,6 +970,9 @@ def main():
list_reviews(remote)
return
if options.custom_script:
run_custom_script("pre")
have_hook = os.path.exists(hook_file) and os.access(hook_file, os.X_OK)
if not have_hook:
@@ -962,6 +994,8 @@ def main():
if options.draft:
ref = "drafts"
if options.custom_script:
run_custom_script("draft")
elif options.compatible:
ref = "for"
@@ -991,6 +1025,8 @@ def main():
finish_branch(branch)
return
if options.custom_script:
run_custom_script("post")
print_exit_message(status, needs_update)