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:
committed by
Chmouel Boudjnah
parent
eae8ead205
commit
eb4fc7c5c7
24
README.md
24
README.md
@@ -76,6 +76,30 @@ Optional values: port (default: 29418), defaultbranch (default: master)
|
|||||||
|
|
||||||
* git-review will create a gerrit remote upon first run
|
* 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
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|||||||
38
git-review
38
git-review
@@ -178,6 +178,32 @@ class GitDirectoriesException(CommandFailed):
|
|||||||
EXIT_CODE = 70
|
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):
|
class CannotInstallHook(CommandFailed):
|
||||||
"Problems encountered installing commit-msg hook"
|
"Problems encountered installing commit-msg hook"
|
||||||
EXIT_CODE = 2
|
EXIT_CODE = 2
|
||||||
@@ -854,7 +880,7 @@ def main():
|
|||||||
action=DownloadFlag, metavar="CHANGE",
|
action=DownloadFlag, metavar="CHANGE",
|
||||||
const="download",
|
const="download",
|
||||||
help="Download the contents of an existing gerrit "
|
help="Download the contents of an existing gerrit "
|
||||||
"review into a branch")
|
"review into a branch")
|
||||||
fetch.add_argument("-x", "--cherrypick", dest="changeidentifier",
|
fetch.add_argument("-x", "--cherrypick", dest="changeidentifier",
|
||||||
action=DownloadFlag, metavar="CHANGE",
|
action=DownloadFlag, metavar="CHANGE",
|
||||||
const="cherrypickcommit",
|
const="cherrypickcommit",
|
||||||
@@ -890,6 +916,9 @@ def main():
|
|||||||
"you are submitting more than one patch")
|
"you are submitting more than one patch")
|
||||||
parser.add_argument("-v", "--verbose", dest="verbose", action="store_true",
|
parser.add_argument("-v", "--verbose", dest="verbose", action="store_true",
|
||||||
help="Output more information about what's going on")
|
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",
|
parser.add_argument("--license", dest="license", action="store_true",
|
||||||
help="Print the license and exit")
|
help="Print the license and exit")
|
||||||
parser.add_argument("--version", action="version",
|
parser.add_argument("--version", action="version",
|
||||||
@@ -941,6 +970,9 @@ def main():
|
|||||||
list_reviews(remote)
|
list_reviews(remote)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if options.custom_script:
|
||||||
|
run_custom_script("pre")
|
||||||
|
|
||||||
have_hook = os.path.exists(hook_file) and os.access(hook_file, os.X_OK)
|
have_hook = os.path.exists(hook_file) and os.access(hook_file, os.X_OK)
|
||||||
|
|
||||||
if not have_hook:
|
if not have_hook:
|
||||||
@@ -962,6 +994,8 @@ def main():
|
|||||||
|
|
||||||
if options.draft:
|
if options.draft:
|
||||||
ref = "drafts"
|
ref = "drafts"
|
||||||
|
if options.custom_script:
|
||||||
|
run_custom_script("draft")
|
||||||
elif options.compatible:
|
elif options.compatible:
|
||||||
ref = "for"
|
ref = "for"
|
||||||
|
|
||||||
@@ -991,6 +1025,8 @@ def main():
|
|||||||
finish_branch(branch)
|
finish_branch(branch)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if options.custom_script:
|
||||||
|
run_custom_script("post")
|
||||||
print_exit_message(status, needs_update)
|
print_exit_message(status, needs_update)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user