Home | History | Annotate | Download | only in tools
      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
      7 it to Rietveld so that the CL will land automatically if it passes the
      8 commit-queue's checks.
      9 """
     10 
     11 import logging
     12 import optparse
     13 import os
     14 import re
     15 import sys
     16 
     17 import find_depot_tools
     18 import scm
     19 import subprocess2
     20 
     21 
     22 def die_with_error(msg):
     23   print >> sys.stderr, msg
     24   sys.exit(1)
     25 
     26 
     27 def 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 
     45 def 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 
    126 if __name__ == '__main__':
    127   sys.exit(main())
    128