Commit 0f33d01e by Yuly Novikov Committed by Commit Bot

Adjust roll_chromium_deps.py to work with autoroller.

Add --autoroll option which expects an existing git commit by the autoroller, which updates chromium_revision. roll_chromium_deps.py then updates other ANGLE dependencies to the revision of their Chromium counterparts and amends autoroller's commit. Bug: skia:10572 Change-Id: Iddb9296bd1470f4a2113563c5ed3a1c27e16f128 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2363212 Commit-Queue: Yuly Novikov <ynovikov@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent b8c32424
...@@ -71,10 +71,12 @@ ANDROID_DEPS_PATH = 'src/third_party/android_deps/' ...@@ -71,10 +71,12 @@ ANDROID_DEPS_PATH = 'src/third_party/android_deps/'
# TODO(jmadill): Update this with ANGLE wrangler. http://anglebug.com/4059 # TODO(jmadill): Update this with ANGLE wrangler. http://anglebug.com/4059
NOTIFY_EMAIL = 'jmadill@chromium.org' NOTIFY_EMAIL = 'jmadill@chromium.org'
sys.path.append(os.path.join(CHECKOUT_SRC_DIR, 'build'))
import find_depot_tools
find_depot_tools.add_depot_tools_to_path() def add_depot_tools_to_path():
sys.path.append(os.path.join(CHECKOUT_SRC_DIR, 'build'))
import find_depot_tools
find_depot_tools.add_depot_tools_to_path()
CLANG_UPDATE_SCRIPT_URL_PATH = 'tools/clang/scripts/update.py' CLANG_UPDATE_SCRIPT_URL_PATH = 'tools/clang/scripts/update.py'
CLANG_UPDATE_SCRIPT_LOCAL_PATH = os.path.join(CHECKOUT_SRC_DIR, 'tools', 'clang', 'scripts', CLANG_UPDATE_SCRIPT_LOCAL_PATH = os.path.join(CHECKOUT_SRC_DIR, 'tools', 'clang', 'scripts',
...@@ -345,7 +347,7 @@ def CalculateChangedDeps(angle_deps, new_cr_deps): ...@@ -345,7 +347,7 @@ def CalculateChangedDeps(angle_deps, new_cr_deps):
return sorted(result) return sorted(result)
def CalculateChangedClang(new_cr_rev): def CalculateChangedClang(cur_cr_rev, new_cr_rev, autoroll):
def GetClangRev(lines): def GetClangRev(lines):
for line in lines: for line in lines:
...@@ -354,9 +356,15 @@ def CalculateChangedClang(new_cr_rev): ...@@ -354,9 +356,15 @@ def CalculateChangedClang(new_cr_rev):
return match.group(1) return match.group(1)
raise RollError('Could not parse Clang revision!') raise RollError('Could not parse Clang revision!')
# We don't have locally sync'ed deps on autoroller
if not autoroll:
with open(CLANG_UPDATE_SCRIPT_LOCAL_PATH, 'rb') as f: with open(CLANG_UPDATE_SCRIPT_LOCAL_PATH, 'rb') as f:
current_lines = f.readlines() current_lines = f.readlines()
current_rev = GetClangRev(current_lines) current_rev = GetClangRev(current_lines)
else:
cur_clang_update_py = ReadRemoteCrFile(CLANG_UPDATE_SCRIPT_URL_PATH,
cur_cr_rev).splitlines()
current_rev = GetClangRev(cur_clang_update_py)
new_clang_update_py = ReadRemoteCrFile(CLANG_UPDATE_SCRIPT_URL_PATH, new_cr_rev).splitlines() new_clang_update_py = ReadRemoteCrFile(CLANG_UPDATE_SCRIPT_URL_PATH, new_cr_rev).splitlines()
new_rev = GetClangRev(new_clang_update_py) new_rev = GetClangRev(new_clang_update_py)
...@@ -368,6 +376,7 @@ def GenerateCommitMessage( ...@@ -368,6 +376,7 @@ def GenerateCommitMessage(
current_commit_pos, current_commit_pos,
new_commit_pos, new_commit_pos,
changed_deps_list, changed_deps_list,
autoroll,
clang_change=None, clang_change=None,
): ):
current_cr_rev = rev_update.current_chromium_rev[0:10] current_cr_rev = rev_update.current_chromium_rev[0:10]
...@@ -375,11 +384,14 @@ def GenerateCommitMessage( ...@@ -375,11 +384,14 @@ def GenerateCommitMessage(
rev_interval = '%s..%s' % (current_cr_rev, new_cr_rev) rev_interval = '%s..%s' % (current_cr_rev, new_cr_rev)
git_number_interval = '%s:%s' % (current_commit_pos, new_commit_pos) git_number_interval = '%s:%s' % (current_commit_pos, new_commit_pos)
commit_msg = [ commit_msg = []
# Autoroll already adds chromium_revision changes to commit message
if not autoroll:
commit_msg.append([
'Roll chromium_revision %s (%s)\n' % (rev_interval, git_number_interval), 'Roll chromium_revision %s (%s)\n' % (rev_interval, git_number_interval),
'Change log: %s' % (CHROMIUM_LOG_TEMPLATE % rev_interval), 'Change log: %s' % (CHROMIUM_LOG_TEMPLATE % rev_interval),
'Full diff: %s\n' % (CHROMIUM_COMMIT_TEMPLATE % rev_interval) 'Full diff: %s\n' % (CHROMIUM_COMMIT_TEMPLATE % rev_interval)
] ])
def Section(adjective, deps): def Section(adjective, deps):
noun = 'dependency' if len(deps) == 1 else 'dependencies' noun = 'dependency' if len(deps) == 1 else 'dependencies'
...@@ -397,6 +409,9 @@ def GenerateCommitMessage( ...@@ -397,6 +409,9 @@ def GenerateCommitMessage(
(c.path, c.url, c.current_rev[0:10], c.new_rev[0:10])) (c.path, c.url, c.current_rev[0:10], c.new_rev[0:10]))
if changed_deps_list: if changed_deps_list:
# rev_interval is empty for autoroll, since we are starting from a state
# in which chromium_revision is already modified in DEPS
if not autoroll:
change_url = CHROMIUM_FILE_TEMPLATE % (rev_interval, 'DEPS') change_url = CHROMIUM_FILE_TEMPLATE % (rev_interval, 'DEPS')
commit_msg.append('DEPS diff: %s\n' % change_url) commit_msg.append('DEPS diff: %s\n' % change_url)
else: else:
...@@ -410,6 +425,8 @@ def GenerateCommitMessage( ...@@ -410,6 +425,8 @@ def GenerateCommitMessage(
else: else:
commit_msg.append('No update to Clang.\n') commit_msg.append('No update to Clang.\n')
# Autoroll takes care of BUG and TBR in commit message
if not autoroll:
# TBR needs to be non-empty for Gerrit to process it. # TBR needs to be non-empty for Gerrit to process it.
git_author = _RunCommand(['git', 'config', 'user.email'], git_author = _RunCommand(['git', 'config', 'user.email'],
working_dir=CHECKOUT_SRC_DIR)[0].splitlines()[0] working_dir=CHECKOUT_SRC_DIR)[0].splitlines()[0]
...@@ -417,12 +434,15 @@ def GenerateCommitMessage( ...@@ -417,12 +434,15 @@ def GenerateCommitMessage(
commit_msg.append('TBR=%s' % tbr_authors) commit_msg.append('TBR=%s' % tbr_authors)
commit_msg.append('BUG=None') commit_msg.append('BUG=None')
return '\n'.join(commit_msg) return '\n'.join(commit_msg)
def UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content): def UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content, autoroll):
"""Update the DEPS file with the new revision.""" """Update the DEPS file with the new revision."""
# Autoroll take care of updating chromium_revision
if not autoroll:
with open(deps_filename, 'rb') as deps_file: with open(deps_filename, 'rb') as deps_file:
deps_content = deps_file.read() deps_content = deps_file.read()
...@@ -435,6 +455,8 @@ def UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content): ...@@ -435,6 +455,8 @@ def UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content):
# Update each individual DEPS entry. # Update each individual DEPS entry.
for dep in changed_deps: for dep in changed_deps:
# We don't sync deps on autoroller, so ignore missing local deps
if not autoroll:
local_dep_dir = os.path.join(CHECKOUT_ROOT_DIR, dep.path) local_dep_dir = os.path.join(CHECKOUT_ROOT_DIR, dep.path)
if not os.path.isdir(local_dep_dir): if not os.path.isdir(local_dep_dir):
raise RollError('Cannot find local directory %s. Either run\n' raise RollError('Cannot find local directory %s. Either run\n'
...@@ -498,6 +520,22 @@ def _LocalCommit(commit_msg, dry_run): ...@@ -498,6 +520,22 @@ def _LocalCommit(commit_msg, dry_run):
_RunCommand(['git', 'commit', '-m', commit_msg]) _RunCommand(['git', 'commit', '-m', commit_msg])
def _LocalCommitAmend(commit_msg, dry_run):
logging.info('Amending changes to local commit.')
if not dry_run:
old_commit_msg = _RunCommand(['git', 'log', '-1', '--pretty=%B'])[0].strip()
logging.debug('Existing commit message:\n%s\n', old_commit_msg)
bug_index = old_commit_msg.rfind('Bug:')
if bug_index == -1:
logging.error('"Bug:" not found in commit message.')
if not dry_run:
sys.exit(-1)
new_commit_msg = old_commit_msg[:bug_index] + commit_msg + '\n' + old_commit_msg[bug_index:]
_RunCommand(['git', 'commit', '-a', '--amend', '-m', new_commit_msg])
def ChooseCQMode(skip_cq, cq_over, current_commit_pos, new_commit_pos): def ChooseCQMode(skip_cq, cq_over, current_commit_pos, new_commit_pos):
if skip_cq: if skip_cq:
return 0 return 0
...@@ -580,6 +618,12 @@ def main(): ...@@ -580,6 +618,12 @@ def main():
default=1, default=1,
help=('Commit queue dry run if the revision difference ' help=('Commit queue dry run if the revision difference '
'is below this number (default: %(default)s)')) 'is below this number (default: %(default)s)'))
grp.add_argument(
'--autoroll',
action='store_true',
default=False,
help='Autoroller mode - amend existing commit, '
'do not create nor upload a CL (default: %(default)s)')
p.add_argument( p.add_argument(
'-v', '-v',
'--verbose', '--verbose',
...@@ -593,6 +637,11 @@ def main(): ...@@ -593,6 +637,11 @@ def main():
else: else:
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
# We don't have locally sync'ed deps on autoroller,
# so trust it to have depot_tools in path
if not opts.autoroll:
add_depot_tools_to_path()
if not opts.ignore_unclean_workdir and not _IsTreeClean(): if not opts.ignore_unclean_workdir and not _IsTreeClean():
logging.error('Please clean your local checkout first.') logging.error('Please clean your local checkout first.')
return 1 return 1
...@@ -614,14 +663,27 @@ def main(): ...@@ -614,14 +663,27 @@ def main():
new_cr_content = ReadRemoteCrFile('DEPS', rev_update.new_chromium_rev) new_cr_content = ReadRemoteCrFile('DEPS', rev_update.new_chromium_rev)
new_cr_deps = ParseDepsDict(new_cr_content) new_cr_deps = ParseDepsDict(new_cr_content)
changed_deps = CalculateChangedDeps(angle_deps, new_cr_deps) changed_deps = CalculateChangedDeps(angle_deps, new_cr_deps)
clang_change = CalculateChangedClang(rev_update.new_chromium_rev) clang_change = CalculateChangedClang(rev_update.current_chromium_rev,
rev_update.new_chromium_rev, opts.autoroll)
commit_msg = GenerateCommitMessage( commit_msg = GenerateCommitMessage(
rev_update, current_commit_pos, new_commit_pos, changed_deps, clang_change=clang_change) rev_update,
current_commit_pos,
new_commit_pos,
changed_deps,
opts.autoroll,
clang_change=clang_change)
logging.debug('Commit message:\n%s', commit_msg) logging.debug('Commit message:\n%s', commit_msg)
# We are updating a commit that autoroll has created, using existing branch
if not opts.autoroll:
_CreateRollBranch(opts.dry_run) _CreateRollBranch(opts.dry_run)
if not opts.dry_run: if not opts.dry_run:
UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content) UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content, opts.autoroll)
if opts.autoroll:
_LocalCommitAmend(commit_msg, opts.dry_run)
else:
if _IsTreeClean(): if _IsTreeClean():
logging.info("No DEPS changes detected, skipping CL creation.") logging.info("No DEPS changes detected, skipping CL creation.")
else: else:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment