| #!/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 change == None or project == None or branch == None \ |
| or commit == None or patchset == None: |
| 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() |
| |