|  | #!/usr/bin/env python | 
|  |  | 
|  | from __future__ import print_function | 
|  |  | 
|  | import subprocess | 
|  | import getopt | 
|  | import sys | 
|  |  | 
|  |  | 
|  | SSH_USER = 'bot' | 
|  | SSH_HOST = 'localhost' | 
|  | SSH_PORT = 29418 | 
|  | SSH_COMMAND = 'ssh %s@%s -p %d gerrit approve ' % (SSH_USER, | 
|  | SSH_HOST, | 
|  | SSH_PORT) | 
|  | FAILURE_SCORE = '--code-review=-2' | 
|  | FAILURE_MESSAGE = 'This commit message does not match the standard.' \ | 
|  | + '  Please correct the commit message and upload a replacement patch.' | 
|  | PASS_SCORE = '--code-review=0' | 
|  | PASS_MESSAGE = '' | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | change = None | 
|  | project = None | 
|  | branch = None | 
|  | commit = None | 
|  | patchset = None | 
|  |  | 
|  | try: | 
|  | opts, _args = getopt.getopt(sys.argv[1:], '', | 
|  | ['change=', 'project=', 'branch=', | 
|  | 'commit=', 'patchset=']) | 
|  | except getopt.GetoptError as err: | 
|  | print('Error: %s' % (err)) | 
|  | usage() | 
|  | sys.exit(-1) | 
|  |  | 
|  | for arg, value in opts: | 
|  | if arg == '--change': | 
|  | change = value | 
|  | elif arg == '--project': | 
|  | project = value | 
|  | elif arg == '--branch': | 
|  | branch = value | 
|  | elif arg == '--commit': | 
|  | commit = value | 
|  | elif arg == '--patchset': | 
|  | patchset = value | 
|  | else: | 
|  | print('Error: option %s not recognized' % (arg)) | 
|  | usage() | 
|  | sys.exit(-1) | 
|  |  | 
|  | if any(p is None for p in [change, project, branch, commit, patchset]): | 
|  | usage() | 
|  | sys.exit(-1) | 
|  |  | 
|  | command = 'git cat-file commit %s' % (commit) | 
|  | status, output = subprocess.getstatusoutput(command) | 
|  |  | 
|  | if status != 0: | 
|  | print('Error running \'%s\'. status: %s, output:\n\n%s' % | 
|  | (command, status, output)) | 
|  | sys.exit(-1) | 
|  |  | 
|  | commitMessage = output[(output.find('\n\n')+2):] | 
|  | commitLines = commitMessage.split('\n') | 
|  |  | 
|  | if len(commitLines) > 1 and len(commitLines[1]) != 0: | 
|  | fail(commit, 'Invalid commit summary.  The summary must be ' | 
|  | + 'one line followed by a blank line.') | 
|  |  | 
|  | i = 0 | 
|  | for line in commitLines: | 
|  | i = i + 1 | 
|  | if len(line) > 80: | 
|  | fail(commit, 'Line %d is over 80 characters.' % i) | 
|  |  | 
|  | passes(commit) | 
|  |  | 
|  |  | 
|  | def usage(): | 
|  | print('Usage:\n') | 
|  | print(sys.argv[0] + ' --change <change id> --project <project name> ' | 
|  | + '--branch <branch> --commit <sha1> --patchset <patchset id>') | 
|  |  | 
|  |  | 
|  | def fail(commit, message): | 
|  | command = SSH_COMMAND + FAILURE_SCORE + ' -m \\\"' \ | 
|  | + _shell_escape(FAILURE_MESSAGE + '\n\n' + message) \ | 
|  | + '\\\" ' + commit | 
|  | subprocess.getstatusoutput(command) | 
|  | sys.exit(1) | 
|  |  | 
|  |  | 
|  | def passes(commit): | 
|  | command = SSH_COMMAND + PASS_SCORE + ' -m \\\"' \ | 
|  | + _shell_escape(PASS_MESSAGE) + ' \\\" ' + commit | 
|  | subprocess.getstatusoutput(command) | 
|  |  | 
|  |  | 
|  | def _shell_escape(x): | 
|  | s = '' | 
|  | for c in x: | 
|  | if c in '\n': | 
|  | s = s + '\\\"$\'\\n\'\\\"' | 
|  | else: | 
|  | s = s + c | 
|  | return s | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |