summaryrefslogtreecommitdiffstats
path: root/tools/roll_angle.py
diff options
context:
space:
mode:
authorgeofflang <geofflang@chromium.org>2015-06-09 14:45:37 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-09 21:46:03 +0000
commit44a4fb3ea1b344b993453f9b83f28d32b36b9d20 (patch)
tree33bcefff075fd611d5e1dc755fa2fcf940f73170 /tools/roll_angle.py
parent6b2828ada942b5fab85bc8e1dbc61e63701693f9 (diff)
downloadchromium_src-44a4fb3ea1b344b993453f9b83f28d32b36b9d20.zip
chromium_src-44a4fb3ea1b344b993453f9b83f28d32b36b9d20.tar.gz
chromium_src-44a4fb3ea1b344b993453f9b83f28d32b36b9d20.tar.bz2
Update roll_angle.py to work on Windows.
Also added new features to generate a list of chromium bugs and trigger tryjobs after upload. BUG=489922 Review URL: https://codereview.chromium.org/1163333002 Cr-Commit-Position: refs/heads/master@{#333579}
Diffstat (limited to 'tools/roll_angle.py')
-rwxr-xr-xtools/roll_angle.py67
1 files changed, 50 insertions, 17 deletions
diff --git a/tools/roll_angle.py b/tools/roll_angle.py
index 9589d30..999efc1 100755
--- a/tools/roll_angle.py
+++ b/tools/roll_angle.py
@@ -32,12 +32,16 @@ TRYJOB_STATUS_SLEEP_SECONDS = 30
# Use a shell for subcommands on Windows to get a PATH search.
USE_SHELL = sys.platform.startswith('win')
-ANGLE_PATH = 'third_party/angle'
+ANGLE_PATH = os.path.join('third_party', 'angle')
CommitInfo = collections.namedtuple('CommitInfo', ['git_commit',
'git_repo_url'])
CLInfo = collections.namedtuple('CLInfo', ['issue', 'url', 'rietveld_server'])
+def _PosixPath(path):
+ """Convert a possibly-Windows path to a posix-style path."""
+ (_, path) = os.path.splitdrive(path)
+ return path.replace(os.sep, '/')
def _ParseGitCommitHash(description):
for line in description.splitlines():
@@ -67,25 +71,31 @@ def _ParseDepsDict(deps_content):
return local_scope
-def _GenerateCLDescription(angle_current, angle_new):
- delim = ''
- angle_str = ''
+def _GenerateCLDescriptionCommand(angle_current, angle_new, bugs):
def GetChangeString(current_hash, new_hash):
return '%s..%s' % (current_hash[0:7], new_hash[0:7]);
def GetChangeLogURL(git_repo_url, change_string):
return '%s/+log/%s' % (git_repo_url, change_string)
+ def GetBugString(bugs):
+ bug_str = 'BUG='
+ for bug in bugs:
+ bug_str += str(bug) + ','
+ return bug_str.rstrip(',')
+
if angle_current.git_commit != angle_new.git_commit:
change_str = GetChangeString(angle_current.git_commit,
angle_new.git_commit)
changelog_url = GetChangeLogURL(angle_current.git_repo_url,
change_str)
- description = 'Roll ANGLE ' + change_str + '\n\n'
- description += '%s\n\n' % changelog_url
- description += 'BUG=\nTEST=bots\n'
- return description
+ return [
+ '-m', 'Roll ANGLE ' + change_str,
+ '-m', '%s' % changelog_url,
+ '-m', GetBugString(bugs),
+ '-m', 'TEST=bots',
+ ]
class AutoRoller(object):
@@ -127,7 +137,7 @@ class AutoRoller(object):
return CommitInfo(_ParseGitCommitHash(ret), git_repo_url)
def _GetDepsCommitInfo(self, deps_dict, path_below_src):
- entry = deps_dict['deps']['src/%s' % path_below_src]
+ entry = deps_dict['deps'][_PosixPath('src/%s' % path_below_src)]
at_index = entry.find('@')
git_repo_url = entry[:at_index]
git_hash = entry[at_index + 1:]
@@ -163,6 +173,27 @@ class AutoRoller(object):
logging.debug('Dirty/unversioned files:\n%s', '\n'.join(lines))
return False
+ def _GetBugList(self, path_below_src, angle_current, angle_new):
+ working_dir = os.path.join(self._chromium_src, path_below_src)
+ lines = self._RunCommand(
+ ['git','log',
+ '%s..%s' % (angle_current.git_commit, angle_new.git_commit)],
+ working_dir=working_dir).split('\n')
+ bugs = set()
+ for line in lines:
+ line = line.strip()
+ bug_prefix = 'BUG='
+ if line.startswith(bug_prefix):
+ bugs_strings = line[len(bug_prefix):].split(',')
+ for bug_string in bugs_strings:
+ try:
+ bugs.add(int(bug_string))
+ except:
+ # skip this, it may be a project specific bug such as
+ # "angleproject:X" or an ill-formed BUG= message
+ pass
+ return bugs
+
def _UpdateReadmeFile(self, readme_path, new_revision):
readme = open(os.path.join(self._chromium_src, readme_path), 'r+')
txt = readme.read()
@@ -203,19 +234,25 @@ class AutoRoller(object):
# Find ToT revisions.
angle_latest = self._GetCommitInfo(ANGLE_PATH)
+ # Make sure the roll script doesn't use windows line endings
+ self._RunCommand(['git', 'config', 'core.autocrlf', 'true'])
+
self._UpdateDep(deps_filename, ANGLE_PATH, angle_latest)
if self._IsTreeClean():
logging.debug('Tree is clean - no changes detected.')
self._DeleteRollBranch()
else:
- description = _GenerateCLDescription(angle_current, angle_latest)
+ bugs = self._GetBugList(ANGLE_PATH, angle_current, angle_latest)
+ description = _GenerateCLDescriptionCommand(
+ angle_current, angle_latest, bugs)
logging.debug('Committing changes locally.')
self._RunCommand(['git', 'add', '--update', '.'])
- self._RunCommand(['git', 'commit', '-m', description])
+ self._RunCommand(['git', 'commit'] + description)
logging.debug('Uploading changes...')
- self._RunCommand(['git', 'cl', 'upload', '-m', description],
+ self._RunCommand(['git', 'cl', 'upload'],
extra_env={'EDITOR': 'true'})
+ self._RunCommand(['git', 'cl', 'try'])
cl_info = self._GetCLInfo()
print 'Issue: %d URL: %s' % (cl_info.issue, cl_info.url)
@@ -225,7 +262,7 @@ class AutoRoller(object):
return 0
def _UpdateDep(self, deps_filename, dep_relative_to_src, commit_info):
- dep_name = os.path.join('src', dep_relative_to_src)
+ dep_name = _PosixPath(os.path.join('src', dep_relative_to_src))
# roll_dep_svn.py relies on cwd being the Chromium checkout, so let's
# temporarily change the working directory and then change back.
@@ -276,10 +313,6 @@ class AutoRoller(object):
def main():
- if sys.platform in ('win32', 'cygwin'):
- logging.error('Only Linux and Mac platforms are supported right now.')
- return -1
-
parser = argparse.ArgumentParser(
description='Auto-generates a CL containing an ANGLE roll.')
parser.add_argument('--abort',