Teach autoroller to roll variables like fuchsia_version.

By making this change, we ensure that these variables are not outdated.
Also, remove unnecessary list calls to python generators.

Bug: None
Change-Id: I53babe03da1cb78cf5dc127b7e1f753b63be20de
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/292620
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
Cr-Commit-Position: refs/heads/main@{#39267}
This commit is contained in:
Byoungchan Lee 2023-02-08 08:59:11 +09:00 committed by WebRTC LUCI CQ
parent b459deaf38
commit e8ac5af787
4 changed files with 55 additions and 17 deletions

View File

@ -85,8 +85,11 @@ DepsEntry = collections.namedtuple('DepsEntry', 'path url revision')
ChangedDep = collections.namedtuple('ChangedDep',
'path url current_rev new_rev')
CipdDepsEntry = collections.namedtuple('CipdDepsEntry', 'path packages')
VersionEntry = collections.namedtuple('VersionEntry', 'version')
ChangedCipdPackage = collections.namedtuple(
'ChangedCipdPackage', 'path package current_version new_version')
ChangedVersionEntry = collections.namedtuple(
'ChangedVersionEntry', 'path current_version new_version')
ChromiumRevisionUpdate = collections.namedtuple('ChromiumRevisionUpdate',
('current_chromium_rev '
@ -148,7 +151,7 @@ def _RunCommand(command,
logging.debug('CMD: %s CWD: %s', ' '.join(command), working_dir)
env = os.environ.copy()
if extra_env:
assert all(isinstance(value, str) for value in list(extra_env.values()))
assert all(isinstance(value, str) for value in extra_env.values())
logging.debug('extra env: %s', extra_env)
env.update(extra_env)
p = subprocess.Popen(command,
@ -247,7 +250,7 @@ def GetMatchingDepsEntries(depsentry_dict, dir_path):
A list of DepsEntry objects.
"""
result = []
for path, depsentry in list(depsentry_dict.items()):
for path, depsentry in depsentry_dict.items():
if path == dir_path:
result.append(depsentry)
else:
@ -262,7 +265,7 @@ def BuildDepsentryDict(deps_dict):
result = {}
def AddDepsEntries(deps_subdict):
for path, dep in list(deps_subdict.items()):
for path, dep in deps_subdict.items():
if path in result:
continue
if not isinstance(dep, dict):
@ -275,9 +278,19 @@ def BuildDepsentryDict(deps_dict):
url, revision = dep['url'].split('@')
result[path] = DepsEntry(path, url, revision)
def AddVersionEntry(vars_subdict):
for key, value in vars_subdict.items():
if key in result:
continue
if not key.endswith('_version'):
continue
key = re.sub('_version$', '', key)
result[key] = VersionEntry(value)
AddDepsEntries(deps_dict['deps'])
for deps_os in ['win', 'mac', 'unix', 'android', 'ios', 'unix']:
AddDepsEntries(deps_dict.get('deps_os', {}).get(deps_os, {}))
AddVersionEntry(deps_dict.get('vars', {}))
return result
@ -305,6 +318,12 @@ def _FindChangedCipdPackages(path, old_pkgs, new_pkgs):
new_version)
def _FindChangedVars(name, old_version, new_version):
if old_version != new_version:
logging.debug('Roll dependency %s to %s', name, new_version)
yield ChangedVersionEntry(name, old_version, new_version)
def _FindNewDeps(old, new):
""" Gather dependencies only in `new` and return corresponding paths. """
old_entries = set(BuildDepsentryDict(old))
@ -400,7 +419,7 @@ def CalculateChangedDeps(webrtc_deps, new_cr_deps):
result = []
webrtc_entries = BuildDepsentryDict(webrtc_deps)
new_cr_entries = BuildDepsentryDict(new_cr_deps)
for path, webrtc_deps_entry in list(webrtc_entries.items()):
for path, webrtc_deps_entry in webrtc_entries.items():
if path in DONT_AUTOROLL_THESE:
continue
cr_deps_entry = new_cr_entries.get(path)
@ -413,6 +432,12 @@ def CalculateChangedDeps(webrtc_deps, new_cr_deps):
cr_deps_entry.packages))
continue
if isinstance(cr_deps_entry, VersionEntry):
result.extend(
_FindChangedVars(path, webrtc_deps_entry.version,
cr_deps_entry.version))
continue
# Use the revision from Chromium's DEPS file.
new_rev = cr_deps_entry.revision
assert webrtc_deps_entry.url == cr_deps_entry.url, (
@ -488,6 +513,9 @@ def GenerateCommitMessage(
if isinstance(c, ChangedCipdPackage):
commit_msg.append('* %s: %s..%s' %
(c.path, c.current_version, c.new_version))
elif isinstance(c, ChangedVersionEntry):
commit_msg.append('* %s_vesion: %s..%s' %
(c.path, c.current_version, c.new_version))
else:
commit_msg.append('* %s: %s/+log/%s..%s' %
(c.path, c.url, c.current_rev[0:10], c.new_rev[0:10]))
@ -547,6 +575,9 @@ def UpdateDepsFile(deps_filename, rev_update, changed_deps, new_cr_content):
# Update each individual DEPS entry.
for dep in changed_deps:
if isinstance(dep, ChangedVersionEntry):
deps_content = deps_content.replace(dep.current_version, dep.new_version)
continue
local_dep_dir = os.path.join(CHECKOUT_ROOT_DIR, dep.path)
if not os.path.isdir(local_dep_dir):
raise RollError(

View File

@ -195,20 +195,24 @@ class TestRollChromiumRevision(unittest.TestCase):
BUILD_NEW_REV)
changed_deps = CalculateChangedDeps(webrtc_deps, new_cr_deps)
self.assertEqual(len(changed_deps), 3)
self.assertEqual(changed_deps[0].path, 'src/build')
self.assertEqual(changed_deps[0].current_rev, BUILD_OLD_REV)
self.assertEqual(changed_deps[0].new_rev, BUILD_NEW_REV)
self.assertEqual(len(changed_deps), 4)
self.assertEqual(changed_deps[0].path, 'fuchsia')
self.assertEqual(changed_deps[0].current_version, 'version:10.20221201.3.1')
self.assertEqual(changed_deps[0].new_version, 'version:11.20230207.1.1')
self.assertEqual(changed_deps[1].path, 'src/buildtools/linux64')
self.assertEqual(changed_deps[1].package, 'gn/gn/linux-amd64')
self.assertEqual(changed_deps[1].current_version,
self.assertEqual(changed_deps[1].path, 'src/build')
self.assertEqual(changed_deps[1].current_rev, BUILD_OLD_REV)
self.assertEqual(changed_deps[1].new_rev, BUILD_NEW_REV)
self.assertEqual(changed_deps[2].path, 'src/buildtools/linux64')
self.assertEqual(changed_deps[2].package, 'gn/gn/linux-amd64')
self.assertEqual(changed_deps[2].current_version,
'git_revision:69ec4fca1fa69ddadae13f9e6b7507efa0675263')
self.assertEqual(changed_deps[1].new_version, 'git_revision:new-revision')
self.assertEqual(changed_deps[2].new_version, 'git_revision:new-revision')
self.assertEqual(changed_deps[2].path, 'src/third_party/depot_tools')
self.assertEqual(changed_deps[2].current_rev, DEPOTTOOLS_OLD_REV)
self.assertEqual(changed_deps[2].new_rev, DEPOTTOOLS_NEW_REV)
self.assertEqual(changed_deps[3].path, 'src/third_party/depot_tools')
self.assertEqual(changed_deps[3].current_rev, DEPOTTOOLS_OLD_REV)
self.assertEqual(changed_deps[3].new_rev, DEPOTTOOLS_NEW_REV)
def testWithDistinctDeps(self):
"""Check CalculateChangedDeps works when deps are added/removed."""
@ -252,8 +256,9 @@ class TestRollChromiumRevision(unittest.TestCase):
webrtc_deps = ParseLocalDepsFile(self._webrtc_depsfile)
new_cr_deps = ParseLocalDepsFile(self._new_cr_depsfile_android)
_, other_paths = FindRemovedDeps(webrtc_deps, new_cr_deps)
self.assertEqual(other_paths,
['src/buildtools/linux64', 'src/third_party/depot_tools'])
self.assertEqual(
other_paths,
['fuchsia', 'src/buildtools/linux64', 'src/third_party/depot_tools'])
def testExpectedDepsIsNotReportedMissing(self):
"""Some deps musn't be seen as missing, even if absent from Chromium."""

View File

@ -3,6 +3,7 @@
vars = {
'chromium_git': 'https://chromium.googlesource.com',
'chromium_revision': '1b9c098a08e40114e44b6c1ec33ddf95c40b901d',
'fuchsia_version': 'version:10.20221201.3.1',
}
deps = {

View File

@ -5,6 +5,7 @@ vars = {
# This is updated compared to the DEPS file.
'depot_tools_revision': '1206a353e40abb70d8454eb9af53db0ad10b713c',
'fuchsia_version': 'version:11.20230207.1.1',
}
deps = {