Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #!/usr/bin/python2 | |
| 2 | |
| 3 # Copyright 2014 Google Inc. | |
| 4 # | |
| 5 # Use of this source code is governed by a BSD-style license that can be | |
| 6 # found in the LICENSE file. | |
| 7 | |
| 8 """Skia's Chromium DEPS Roll Message Script. | |
| 9 | |
| 10 This script takes a codereview URL as its argument and a (possibly | |
| 11 multi-line) message on stdin. It then calls `git cl upload` to append | |
| 12 the message to the given codereview issue. | |
| 13 | |
| 14 Usage: | |
| 15 echo MESSAGE | %prog -c CHROMIUM_PATH CODEREVIEW_URL | |
| 16 or: | |
| 17 export CHROMIUM_CHECKOUT_PATH="/path/to/chromium/checkout" | |
| 18 %prog CODEREVIEW_URL <<EOF | |
| 19 MESSAGE | |
| 20 EOF | |
| 21 or: | |
| 22 %prog --help | |
| 23 """ | |
| 24 | |
| 25 import collections | |
| 26 import optparse | |
| 27 import os | |
| 28 import sys | |
| 29 | |
| 30 import git_utils | |
| 31 import misc_utils | |
| 32 | |
| 33 | |
| 34 # pylint: disable=I0011,C0103 | |
| 35 # Class-like object. | |
| 36 DepsRollOptions = collections.namedtuple( | |
| 37 'DepsRollOptions', | |
| 38 ['chromium_path', 'skip_cl_upload', 'verbose', | |
| 39 'git_path', 'reviewers', 'cc']) | |
| 40 | |
| 41 | |
| 42 def add_codereview_message(codereview_url, message, options): | |
| 43 """Function that does the meat of the work. | |
|
borenet
2014/01/30 14:36:35
This docstring is not informative...
hal.canary
2014/01/30 20:11:02
Done.
| |
| 44 | |
| 45 Args: | |
| 46 codereview_url: (string) we will extract the issue number from | |
| 47 this url. | |
|
borenet
2014/01/30 14:36:35
Why not just take an issue number? Asking for the
hal.canary
2014/01/30 20:11:02
As the code is written, it will take either. I'll
| |
| 48 message: (string) will be passed to `git cl upload -m $MESSAGE` | |
| 49 options: (object) a duck-typed object with the following fields: | |
| 50 options.skip_cl_upload (boolean): if true, will keep the | |
| 51 temporary branch around. | |
| 52 options.verbose (boolean): print out details useful for debugging. | |
| 53 options.git_path (string): git executable | |
| 54 options.reviewers (string): comma-separated list of reviewers | |
| 55 options.cc (string): comma-separated list of addresses to be | |
| 56 carbon-copied | |
|
borenet
2014/01/30 14:36:35
I'd prefer having these as separate arguments. I t
hal.canary
2014/01/30 20:11:02
Done.
| |
| 57 """ | |
| 58 git = options.git_path | |
| 59 issue = codereview_url.strip('/').split('/')[-1] | |
| 60 vsp = misc_utils.VerboseSubprocess(options.verbose) | |
| 61 branch_name = 'issue_%s' % issue | |
| 62 upstream = 'origin/master' | |
| 63 | |
| 64 with misc_utils.ChangeDir(options.chromium_path, options.verbose): | |
| 65 vsp.check_call([git, 'fetch', '-q', 'origin']) | |
| 66 | |
| 67 with git_utils.ChangeGitBranch( | |
| 68 git, branch_name, upstream, options.verbose): | |
| 69 branch_name = git_utils.git_branch_name(git, options.verbose) | |
| 70 | |
| 71 vsp.check_call([git, 'cl', 'patch', issue]) | |
| 72 git_upload = [ | |
| 73 git, 'cl', 'upload', '-t', 'bot report', '-m', message] | |
| 74 if options.cc: | |
| 75 git_upload.append('--cc=' + options.cc) | |
| 76 if options.reviewers: | |
| 77 git_upload.append('--reviewers=' + options.reviewers) | |
| 78 | |
| 79 if options.skip_cl_upload: | |
| 80 space = ' ' | |
| 81 print 'You should call:' | |
| 82 misc_utils.print_subprocess_args(space, ['cd', os.getcwd()]) | |
| 83 misc_utils.print_subprocess_args( | |
| 84 space, [git, 'checkout', branch_name]) | |
| 85 misc_utils.print_subprocess_args(space, git_upload) | |
| 86 else: | |
| 87 vsp.check_call(git_upload) | |
| 88 print vsp.check_output([git, 'cl', 'issue']) | |
| 89 | |
| 90 if not options.skip_cl_upload: | |
| 91 vsp.check_call([git, 'branch', '-D', branch_name]) | |
| 92 | |
| 93 | |
| 94 DEFAULT_REVIEWERS = ','.join([ | |
| 95 'rmistry@google.com', | |
| 96 'reed@google.com', | |
| 97 'bsalomon@google.com', | |
| 98 'robertphillips@google.com', | |
| 99 ]) | |
| 100 | |
| 101 | |
| 102 DEFAULT_CC_LIST = ','.join([ | |
| 103 'skia-team@google.com', | |
| 104 ]) | |
|
borenet
2014/01/30 14:36:35
I'd prefer these global variables declared before
hal.canary
2014/01/30 20:11:02
Done.
| |
| 105 | |
| 106 | |
| 107 def main(argv): | |
| 108 """main function; see module-level docstring and GetOptionParser help. | |
| 109 | |
| 110 Args: | |
| 111 argv: sys.argv[1:]-type argument list. | |
| 112 """ | |
| 113 option_parser = optparse.OptionParser(usage=__doc__) | |
| 114 option_parser.add_option( | |
| 115 '-c', '--chromium_path', | |
| 116 default=os.environ.get('CHROMIUM_CHECKOUT_PATH'), | |
| 117 help='Path to local Chromium Git repository checkout,' | |
| 118 ' defaults to CHROMIUM_CHECKOUT_PATH if that environment' | |
| 119 ' variable is set.') | |
|
borenet
2014/01/30 14:36:35
Personally, I think that this script could be usef
hal.canary
2014/01/30 20:11:02
Done.
| |
| 120 option_parser.add_option( | |
| 121 '', '--skip_cl_upload', action='store_true', default=False, | |
| 122 help='Skip the cl upload step; useful for testing.') | |
| 123 option_parser.add_option( | |
| 124 '', '--verbose', action='store_true', dest='verbose', default=False, | |
| 125 help='Do not suppress the output from `git cl`.',) | |
| 126 option_parser.add_option( | |
| 127 '', '--git_path', default='git', | |
| 128 help='Git executable, defaults to "git".',) | |
|
borenet
2014/01/30 14:36:35
Now that we have a git_utils module, we could add
hal.canary
2014/01/30 20:11:02
Done. git_utils.git_executable()
| |
| 129 option_parser.add_option( | |
| 130 '', '--reviewers', default=DEFAULT_REVIEWERS, | |
| 131 help=('Comma-separated list of reviewers. Default is "%s".' | |
| 132 % DEFAULT_REVIEWERS)) | |
| 133 option_parser.add_option( | |
| 134 '', '--cc', default=DEFAULT_CC_LIST, | |
| 135 help=('Comma-separated list of addresses to be carbon-copied.' | |
| 136 ' Default is "%s".' % DEFAULT_CC_LIST)) | |
| 137 | |
| 138 options, arguments = option_parser.parse_args(argv) | |
| 139 | |
| 140 if not options.chromium_path: | |
| 141 option_parser.error('Must specify chromium_path.') | |
| 142 if not git_utils.test_git_executable(options.git_path): | |
| 143 option_parser.error('Invalid git executable.') | |
| 144 if len(arguments) > 1: | |
| 145 option_parser.error('Extra arguments.') | |
| 146 if len(arguments) != 1: | |
| 147 option_parser.error('Missing Codereview URL.') | |
| 148 | |
| 149 message = sys.stdin.read() | |
| 150 add_codereview_message(arguments[0], message, options) | |
| 151 | |
| 152 | |
| 153 if __name__ == '__main__': | |
| 154 main(sys.argv[1:]) | |
| 155 | |
| OLD | NEW |