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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								git-review
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								git-review
									
									
									
									
									
								
							@@ -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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user