diff --git a/drover.py b/drover.py index 22e9b7d79..945b97e0b 100755 --- a/drover.py +++ b/drover.py @@ -3,6 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import datetime import optparse import os import re @@ -72,15 +73,13 @@ def gclUpload(revision, author): def getSVNInfo(url, revision): info = {} - try: - svn_info = subprocess2.check_output( - ['svn', 'info', '%s@%s' % (url, revision)]).splitlines() - for line in svn_info: - match = re.search(r"(.*?):(.*)", line) - if match: - info[match.group(1).strip()] = match.group(2).strip() - except subprocess2.CalledProcessError: - pass + svn_info = subprocess2.capture( + ['svn', 'info', '--non-interactive', '%s@%s' % (url, revision)], + stderr=subprocess2.VOID).splitlines() + for line in svn_info: + match = re.search(r"(.*?):(.*)", line) + if match: + info[match.group(1).strip()] = match.group(2).strip() return info def isSVNDirty(): @@ -491,6 +490,8 @@ def drover(options, args): # Initialize some variables used below. They can be overwritten by # the drover.properties file. BASE_URL = "svn://svn.chromium.org/chrome" + REVERT_ALT_URLS = ['svn://svn.chromium.org/chrome-internal', + 'svn://svn.chromium.org/native_client'] TRUNK_URL = BASE_URL + "/trunk/src" BRANCH_URL = BASE_URL + "/branches/$branch/src" SKIP_CHECK_WORKING = True @@ -521,11 +522,12 @@ def drover(options, args): file_pattern_ = FILE_PATTERN if options.revert and options.branch: + print 'Note: --branch is usually not needed for reverts.' url = BRANCH_URL.replace("$branch", options.branch) elif options.merge and options.sbranch: url = BRANCH_URL.replace("$branch", options.sbranch) - elif options.revert and options.url: - url = options.url + elif options.revert: + url = options.url or BASE_URL file_pattern_ = r"[ ]+([MADUC])[ ]+((/.*)/(.*))" else: url = TRUNK_URL @@ -541,6 +543,20 @@ def drover(options, args): prompt("Working copy contains uncommitted files. Continue?")): return 1 + if options.revert and not options.no_alt_urls: + for cur_url in [url] + REVERT_ALT_URLS: + try: + commit_date_str = getSVNInfo( + cur_url, options.revert).get('Last Changed Date', 'x').split()[0] + commit_date = datetime.datetime.strptime(commit_date_str, '%Y-%m-%d') + if (datetime.datetime.now() - commit_date).days < 120: + if cur_url != url: + print 'Guessing svn repo: %s.' % cur_url, + print 'Use --no-alt-urls to disable heuristic.' + url = cur_url + break + except ValueError: + pass command = 'svn log ' + url + " -r "+str(revision) + " -v" os.system(command) @@ -572,8 +588,6 @@ def drover(options, args): deleteRevision(url, revision) elif options.revert: action = "Revert" - if options.branch: - url = BRANCH_URL.replace("$branch", options.branch) pop_em = not options.url checkoutRevision(url, revision, url, True, pop_em) revertRevision(url, revision) @@ -672,11 +686,13 @@ def main(): help='svn url to use for the revert') option_parser.add_option('-a', '--auditor', help='overrides the author for reviewer') - option_parser.add_option('', '--revertbot', action='store_true', + option_parser.add_option('--revertbot', action='store_true', default=False) - option_parser.add_option('', '--revertbot-commit', action='store_true', + option_parser.add_option('--no-alt-urls', action='store_true', + help='Disable heuristics used to determine svn url') + option_parser.add_option('--revertbot-commit', action='store_true', default=False) - option_parser.add_option('', '--revertbot-reviewers') + option_parser.add_option('--revertbot-reviewers') options, args = option_parser.parse_args() if not options.merge and not options.revert: