diff options
author | Adrian Dole <adriandole@google.com> | 2022-08-23 21:52:30 +0000 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-08-25 21:31:05 +0000 |
commit | 0abb0b34ef29c06f20208f7bc28040868169b0c1 (patch) | |
tree | 59464327c55ff38a81f83d625ba3ec8fa74d79f1 | |
parent | c06ff64d26f90e7bb8047358d2d4c6c25619c6d3 (diff) | |
download | toolchain-utils-0abb0b34ef29c06f20208f7bc28040868169b0c1.tar.gz |
toolchain-utils: update manifest when updating LLVM
BUG=b:234635394
TEST=./update_chromeos_llvm_hash_unittest.py
Change-Id: Iff52984a44b41b230a74ebef7b5f8dd25b581237
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/3852368
Tested-by: Adrian Dole <adriandole@google.com>
Commit-Queue: Adrian Dole <adriandole@google.com>
Reviewed-by: Jordan Abrahams-Whitehead <ajordanr@google.com>
Auto-Submit: Adrian Dole <adriandole@google.com>
Reviewed-by: Adrian Dole <adriandole@google.com>
-rwxr-xr-x | llvm_tools/update_chromeos_llvm_hash.py | 121 | ||||
-rwxr-xr-x | llvm_tools/update_chromeos_llvm_hash_unittest.py | 41 |
2 files changed, 110 insertions, 52 deletions
diff --git a/llvm_tools/update_chromeos_llvm_hash.py b/llvm_tools/update_chromeos_llvm_hash.py index 5d5a888f..3a2ce2cf 100755 --- a/llvm_tools/update_chromeos_llvm_hash.py +++ b/llvm_tools/update_chromeos_llvm_hash.py @@ -10,8 +10,6 @@ For each package, a temporary repo is created and the changes are uploaded for review. """ -from __future__ import print_function - import argparse import datetime import enum @@ -37,6 +35,8 @@ DEFAULT_PACKAGES = [ 'sys-libs/llvm-libunwind', ] +DEFAULT_MANIFEST_PACKAGES = ['sys-devel/llvm'] + # Specify which LLVM hash to update class LLVMVariant(enum.Enum): @@ -87,11 +87,15 @@ def GetCommandLineArgs(): help='the path to the chroot (default: %(default)s)') # Add argument for specific builds to uprev and update their llvm-next hash. - parser.add_argument('--update_packages', - default=DEFAULT_PACKAGES, - required=False, - nargs='+', - help='the ebuilds to update their hash for llvm-next ' + parser.add_argument( + '--update_packages', + default=','.join(DEFAULT_PACKAGES), + help='Comma-separated ebuilds to update llvm-next hash for ' + '(default: %(default)s)') + + parser.add_argument('--manifest_packages', + default=','.join(DEFAULT_MANIFEST_PACKAGES), + help='Comma-separated ebuilds to update manifests for ' '(default: %(default)s)') # Add argument for whether to display command contents to `stdout`. @@ -113,7 +117,7 @@ def GetCommandLineArgs(): type=get_llvm_hash.IsSvnOption, required=True, help='which git hash to use. Either a svn revision, or one ' - 'of %s' % sorted(get_llvm_hash.KNOWN_HASH_SOURCES)) + f'of {sorted(get_llvm_hash.KNOWN_HASH_SOURCES)}') # Add argument for the mode of the patch management when handling patches. parser.add_argument( @@ -175,7 +179,7 @@ def GetEbuildPathsFromSymLinkPaths(symlinks): # then add the ebuild path to the dict. for cur_symlink in symlinks: if not os.path.islink(cur_symlink): - raise ValueError('Invalid symlink provided: %s' % cur_symlink) + raise ValueError(f'Invalid symlink provided: {cur_symlink}') # Construct the absolute path to the ebuild. ebuild_path = os.path.realpath(cur_symlink) @@ -211,9 +215,9 @@ def UpdateEbuildLLVMHash(ebuild_path, llvm_variant, git_hash, svn_version): # gets updated to the temporary file. if not os.path.isfile(ebuild_path): - raise ValueError('Invalid ebuild path provided: %s' % ebuild_path) + raise ValueError(f'Invalid ebuild path provided: {ebuild_path}') - temp_ebuild_file = '%s.temp' % ebuild_path + temp_ebuild_file = f'{ebuild_path}.temp' with open(ebuild_path) as ebuild_file: # write updates to a temporary file in case of interrupts @@ -248,15 +252,14 @@ def ReplaceLLVMHash(ebuild_lines, llvm_variant, git_hash, svn_version): for cur_line in ebuild_lines: if not is_updated and llvm_regex.search(cur_line): # Update the git hash and revision number. - cur_line = '%s=\"%s\" # r%d\n' % (llvm_variant.value, git_hash, - svn_version) + cur_line = f'{llvm_variant.value}=\"{git_hash}\" # r{svn_version}\n' is_updated = True yield cur_line if not is_updated: - raise ValueError('Failed to update %s' % llvm_variant.value) + raise ValueError(f'Failed to update {llvm_variant.value}') def UprevEbuildSymlink(symlink): @@ -273,7 +276,7 @@ def UprevEbuildSymlink(symlink): """ if not os.path.islink(symlink): - raise ValueError('Invalid symlink provided: %s' % symlink) + raise ValueError(f'Invalid symlink provided: {symlink}') new_symlink, is_changed = re.subn( r'r([0-9]+).ebuild', @@ -307,7 +310,7 @@ def UprevEbuildToVersion(symlink, svn_version, git_hash): """ if not os.path.islink(symlink): - raise ValueError('Invalid symlink provided: %s' % symlink) + raise ValueError(f'Invalid symlink provided: {symlink}') ebuild = os.path.realpath(symlink) llvm_major_version = get_llvm_hash.GetLLVMMajorVersion(git_hash) @@ -343,7 +346,7 @@ def UprevEbuildToVersion(symlink, svn_version, git_hash): subprocess.check_output(['ln', '-s', '-r', new_ebuild, new_symlink]) if not os.path.islink(new_symlink): - raise ValueError('Invalid symlink name: %s' % new_ebuild[:-len('.ebuild')]) + raise ValueError(f'Invalid symlink name: {new_ebuild[:-len(".ebuild")]}') subprocess.check_output(['git', '-C', symlink_dir, 'add', new_symlink]) @@ -403,8 +406,8 @@ def StagePatchMetadataFileForCommit(patch_metadata_file_path): """ if not os.path.isfile(patch_metadata_file_path): - raise ValueError('Invalid patch metadata file provided: %s' % - patch_metadata_file_path) + raise ValueError( + f'Invalid patch metadata file provided: {patch_metadata_file_path}') # Cmd to stage the patch metadata file for commit. subprocess.check_output([ @@ -435,14 +438,15 @@ def StagePackagesPatchResultsForCommit(package_info_dict, commit_messages): if (patch_info_dict['disabled_patches'] or patch_info_dict['removed_patches'] or patch_info_dict['modified_metadata']): - cur_package_header = '\nFor the package %s:' % package_name + cur_package_header = f'\nFor the package {package_name}:' commit_messages.append(cur_package_header) # Add to the commit message that the patch metadata file was modified. if patch_info_dict['modified_metadata']: patch_metadata_path = patch_info_dict['modified_metadata'] - commit_messages.append('The patch metadata file %s was modified' % - os.path.basename(patch_metadata_path)) + metadata_file_name = os.path.basename(patch_metadata_path) + commit_messages.append( + f'The patch metadata file {metadata_file_name} was modified') StagePatchMetadataFileForCommit(patch_metadata_path) @@ -465,8 +469,25 @@ def StagePackagesPatchResultsForCommit(package_info_dict, commit_messages): return commit_messages -def UpdatePackages(packages, llvm_variant, git_hash, svn_version, - chroot_path: Path, mode, git_hash_source, extra_commit_msg): +def UpdateManifests(packages: List[str], chroot_path: Path): + """Updates manifest files for packages. + + Args: + packages: A list of packages to update manifests for. + chroot_path: The absolute path to the chroot. + + Raises: + CalledProcessError: ebuild failed to update manifest. + """ + manifest_ebuilds = chroot.GetChrootEbuildPaths(chroot_path, packages) + for ebuild_path in manifest_ebuilds: + subprocess_helpers.ChrootRunCommand(chroot_path, + ['ebuild', ebuild_path, 'manifest']) + + +def UpdatePackages(packages, manifest_packages: List[str], llvm_variant, + git_hash, svn_version, chroot_path: Path, mode, + git_hash_source, extra_commit_msg): """Updates an LLVM hash and uprevs the ebuild of the packages. A temporary repo is created for the changes. The changes are @@ -474,6 +495,7 @@ def UpdatePackages(packages, llvm_variant, git_hash, svn_version, Args: packages: A list of all the packages that are going to be updated. + manifest_packages: A list of packages to update manifests for. llvm_variant: The LLVM hash to update. git_hash: The new git hash. svn_version: The SVN-style revision number of git_hash. @@ -505,13 +527,12 @@ def UpdatePackages(packages, llvm_variant, git_hash, svn_version, if llvm_variant == LLVMVariant.next: commit_message_header = 'llvm-next' if git_hash_source in get_llvm_hash.KNOWN_HASH_SOURCES: - commit_message_header += ('/%s: upgrade to %s (r%d)' % - (git_hash_source, git_hash, svn_version)) + commit_message_header += ( + f'/{git_hash_source}: upgrade to {git_hash} (r{svn_version})') else: - commit_message_header += (': upgrade to %s (r%d)' % - (git_hash, svn_version)) + commit_message_header += (f': upgrade to {git_hash} (r{svn_version})') - commit_messages = [ + commit_lines = [ commit_message_header + '\n', 'The following packages have been updated:', ] @@ -538,8 +559,13 @@ def UpdatePackages(packages, llvm_variant, git_hash, svn_version, cur_dir_name = os.path.basename(path_to_ebuild_dir) parent_dir_name = os.path.basename(os.path.dirname(path_to_ebuild_dir)) - packages.append('%s/%s' % (parent_dir_name, cur_dir_name)) - commit_messages.append('%s/%s' % (parent_dir_name, cur_dir_name)) + packages.append(f'{parent_dir_name}/{cur_dir_name}') + commit_lines.append(f'{parent_dir_name}/{cur_dir_name}') + + if manifest_packages: + UpdateManifests(manifest_packages, chroot_path) + commit_lines.append('Updated manifest for:') + commit_lines.extend(manifest_packages) EnsurePackageMaskContains(chroot_path, git_hash) @@ -548,13 +574,13 @@ def UpdatePackages(packages, llvm_variant, git_hash, svn_version, chroot_path, svn_version, packages, mode) # Update the commit message if changes were made to a package's patches. - commit_messages = StagePackagesPatchResultsForCommit( - package_info_dict, commit_messages) + commit_lines = StagePackagesPatchResultsForCommit(package_info_dict, + commit_lines) if extra_commit_msg: - commit_messages.append(extra_commit_msg) + commit_lines.append(extra_commit_msg) - change_list = git.UploadChanges(repo_path, branch, commit_messages) + change_list = git.UploadChanges(repo_path, branch, commit_lines) finally: git.DeleteBranch(repo_path, branch) @@ -580,7 +606,7 @@ def EnsurePackageMaskContains(chroot_path, git_hash): 'profiles/targets/chromeos/package.mask') with open(mask_path, 'r+') as mask_file: mask_contents = mask_file.read() - expected_line = '=sys-devel/llvm-%s.0_pre*\n' % llvm_major_version + expected_line = f'=sys-devel/llvm-{llvm_major_version}.0_pre*\n' if expected_line not in mask_contents: mask_file.write(expected_line) @@ -665,19 +691,22 @@ def main(): git_hash, svn_version = get_llvm_hash.GetLLVMHashAndVersionFromSVNOption( git_hash_source) - change_list = UpdatePackages(args_output.update_packages, - llvm_variant, - git_hash, - svn_version, - args_output.chroot_path, - failure_modes.FailureModes( + packages = args_output.update_packages.split(',') + manifest_packages = args_output.manifest_packages.split(',') + change_list = UpdatePackages(packages=packages, + manifest_packages=manifest_packages, + llvm_variant=llvm_variant, + git_hash=git_hash, + svn_version=svn_version, + chroot_path=args_output.chroot_path, + mode=failure_modes.FailureModes( args_output.failure_mode), - git_hash_source, + git_hash_source=git_hash_source, extra_commit_msg=None) - print('Successfully updated packages to %s (%d)' % (git_hash, svn_version)) - print('Gerrit URL: %s' % change_list.url) - print('Change list number: %d' % change_list.cl_number) + print(f'Successfully updated packages to {git_hash} ({svn_version})') + print(f'Gerrit URL: {change_list.url}') + print(f'Change list number: {change_list.cl_number}') if __name__ == '__main__': diff --git a/llvm_tools/update_chromeos_llvm_hash_unittest.py b/llvm_tools/update_chromeos_llvm_hash_unittest.py index d4fbfb21..9a51b62a 100755 --- a/llvm_tools/update_chromeos_llvm_hash_unittest.py +++ b/llvm_tools/update_chromeos_llvm_hash_unittest.py @@ -20,10 +20,10 @@ import chroot import failure_modes import get_llvm_hash import git +import subprocess_helpers import test_helpers import update_chromeos_llvm_hash - # These are unittests; protected access is OK to a point. # pylint: disable=protected-access @@ -311,6 +311,22 @@ class UpdateLLVMHashTest(unittest.TestCase): self.assertEqual(mock_command_output.call_args_list[3], mock.call(expected_cmd)) + @mock.patch.object(chroot, + 'GetChrootEbuildPaths', + return_value=['/chroot/path/test.ebuild']) + @mock.patch.object(subprocess, 'check_output', return_value='') + def testManifestUpdate(self, mock_subprocess, mock_ebuild_paths): + manifest_packages = ['sys-devel/llvm'] + chroot_path = '/path/to/chroot' + update_chromeos_llvm_hash.UpdateManifests(manifest_packages, chroot_path) + + args = mock_subprocess.call_args[0][-1] + manifest_cmd = [ + 'cros_sdk', '--', 'ebuild', '/chroot/path/test.ebuild', 'manifest' + ] + self.assertEqual(args, manifest_cmd) + mock_ebuild_paths.assert_called_once() + @mock.patch.object(get_llvm_hash, 'GetLLVMMajorVersion') @mock.patch.object(os.path, 'islink', return_value=True) @mock.patch.object(os.path, 'realpath') @@ -662,8 +678,15 @@ class UpdateLLVMHashTest(unittest.TestCase): # the 'try' block by UprevEbuildSymlink function. with self.assertRaises(ValueError) as err: update_chromeos_llvm_hash.UpdatePackages( - packages_to_update, llvm_variant, git_hash, svn_version, chroot_path, - failure_modes.FailureModes.FAIL, git_hash_source, extra_commit_msg) + packages=packages_to_update, + manifest_packages=[], + llvm_variant=llvm_variant, + git_hash=git_hash, + svn_version=svn_version, + chroot_path=chroot_path, + mode=failure_modes.FailureModes.FAIL, + git_hash_source=git_hash_source, + extra_commit_msg=extra_commit_msg) self.assertEqual(str(err.exception), 'Failed to uprev the ebuild.') @@ -790,9 +813,15 @@ class UpdateLLVMHashTest(unittest.TestCase): extra_commit_msg = '\ncommit-message-end' change_list = update_chromeos_llvm_hash.UpdatePackages( - packages_to_update, llvm_variant, git_hash, svn_version, chroot_path, - failure_modes.FailureModes.DISABLE_PATCHES, git_hash_source, - extra_commit_msg) + packages=packages_to_update, + manifest_packages=[], + llvm_variant=llvm_variant, + git_hash=git_hash, + svn_version=svn_version, + chroot_path=chroot_path, + mode=failure_modes.FailureModes.DISABLE_PATCHES, + git_hash_source=git_hash_source, + extra_commit_msg=extra_commit_msg) self.assertEqual(change_list.url, 'https://some_name/path/to/commit/+/12345') |