1#!/usr/bin/env python 2# Copyright (c) 2012 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6"""Generate a CL to roll Blink to the specified revision number and post 7it to Rietveld so that the CL will land automatically if it passes the 8commit-queue's checks. 9""" 10 11import logging 12import optparse 13import os 14import re 15import sys 16 17import find_depot_tools 18import scm 19import subprocess2 20 21 22def die_with_error(msg): 23 print >> sys.stderr, msg 24 sys.exit(1) 25 26 27def process_deps(path, new_rev, is_dry_run): 28 """Update webkit_revision to |new_issue|. 29 30 A bit hacky, could it be made better? 31 """ 32 content = open(path).read() 33 old_line = r'(\s+)"webkit_revision": "(\d+)",' 34 new_line = r'\1"webkit_revision": "%d",' % new_rev 35 new_content = re.sub(old_line, new_line, content, 1) 36 old_rev = re.search(old_line, content).group(2) 37 if not old_rev or new_content == content: 38 die_with_error('Failed to update the DEPS file') 39 40 if not is_dry_run: 41 open(path, 'w').write(new_content) 42 return old_rev 43 44 45def main(): 46 tool_dir = os.path.dirname(os.path.abspath(__file__)) 47 parser = optparse.OptionParser(usage='%prog [options] <new blink rev>') 48 parser.add_option('-v', '--verbose', action='count', default=0) 49 parser.add_option('--dry-run', action='store_true') 50 parser.add_option('--commit', action='store_true', default=True, 51 help='(default) Put change in commit queue on upload.') 52 parser.add_option('--no-commit', action='store_false', dest='commit', 53 help='Don\'t put change in commit queue on upload.') 54 parser.add_option('-r', '--reviewers', default='', 55 help='Add given users as either reviewers or TBR as' 56 ' appropriate.') 57 parser.add_option('--upstream', default='origin/master', 58 help='(default "%default") Use given start point for change' 59 ' to upload. For instance, if you use the old git workflow,' 60 ' you might set it to "origin/trunk".') 61 parser.add_option('--cc', help='CC email addresses for issue.') 62 63 options, args = parser.parse_args() 64 logging.basicConfig( 65 level= 66 [logging.WARNING, logging.INFO, logging.DEBUG][ 67 min(2, options.verbose)]) 68 if len(args) != 1: 69 parser.print_help() 70 exit(0) 71 72 root_dir = os.path.dirname(tool_dir) 73 os.chdir(root_dir) 74 75 new_rev = int(args[0]) 76 77 # Silence the editor. 78 os.environ['EDITOR'] = 'true' 79 80 old_branch = scm.GIT.GetBranch(root_dir) 81 if old_branch == 'blink_roll': 82 parser.error( 83 'Please delete the branch blink_roll and move to a different branch') 84 85 if not options.dry_run: 86 subprocess2.check_output( 87 ['git', 'checkout', '-b', 'blink_roll', options.upstream]) 88 89 try: 90 old_rev = int(process_deps(os.path.join(root_dir, 'DEPS'), new_rev, 91 options.dry_run)) 92 print 'Blink roll %s:%s' % (old_rev, new_rev) 93 94 review_field = 'TBR' if options.commit else 'R' 95 commit_msg = ('Blink roll %s:%s\n' 96 '\n' 97 'http://build.chromium.org/f/chromium/perf/dashboard/ui/' 98 'changelog_blink.html?url=/trunk&range=%s:%s&mode=html' 99 '\n' 100 '%s=%s\n' % (old_rev, new_rev, 101 old_rev+1, new_rev, 102 review_field, 103 options.reviewers)) 104 105 if options.dry_run: 106 print 'Commit message: ' + commit_msg 107 return 0 108 109 subprocess2.check_output(['git', 'commit', '-m', commit_msg, 'DEPS']) 110 subprocess2.check_call(['git', 'diff', options.upstream]) 111 upload_cmd = ['git', 'cl', 'upload'] 112 if options.commit: 113 upload_cmd.append('--use-commit-queue') 114 if options.reviewers: 115 upload_cmd.append('--send-mail') 116 if options.cc: 117 upload_cmd.extend(['--cc', options.cc]) 118 subprocess2.check_call(upload_cmd) 119 finally: 120 if not options.dry_run: 121 subprocess2.check_output(['git', 'checkout', old_branch]) 122 subprocess2.check_output(['git', 'branch', '-D', 'blink_roll']) 123 return 0 124 125 126if __name__ == '__main__': 127 sys.exit(main()) 128