aboutsummaryrefslogtreecommitdiff
path: root/llvm_tools/cherrypick_cl.py
diff options
context:
space:
mode:
authorChristopher Di Bella <cjdb@google.com>2021-02-05 23:35:53 +0000
committerManoj Gupta <manojgupta@chromium.org>2021-02-12 16:15:36 +0000
commitf5dbbbe456585460ac20f2eb661b7d0fc436d68b (patch)
tree6af30666dddb4b312ad13f572ec814458a5e747f /llvm_tools/cherrypick_cl.py
parent21929ca0b632ed328920391488eeaae4811eb617 (diff)
downloadtoolchain-utils-f5dbbbe456585460ac20f2eb661b7d0fc436d68b.tar.gz
adds cherry-picking to the nightly revert checker
BUG=chromium:1085465 TEST=nightly_revert_checker_test.py Change-Id: I8069bb3f6ca8d07f54568b85373910a192d11ea5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/2680123 Auto-Submit: Christopher Di Bella <cjdb@google.com> Tested-by: Manoj Gupta <manojgupta@chromium.org> Reviewed-by: George Burgess <gbiv@chromium.org>
Diffstat (limited to 'llvm_tools/cherrypick_cl.py')
-rwxr-xr-xllvm_tools/cherrypick_cl.py198
1 files changed, 124 insertions, 74 deletions
diff --git a/llvm_tools/cherrypick_cl.py b/llvm_tools/cherrypick_cl.py
index 9e306725..ff385f97 100755
--- a/llvm_tools/cherrypick_cl.py
+++ b/llvm_tools/cherrypick_cl.py
@@ -17,6 +17,8 @@ import os
import shlex
import subprocess
import sys
+import typing as t
+from datetime import datetime
import chroot
import get_llvm_hash
@@ -141,6 +143,123 @@ def get_package_names(sha: str, llvm_dir: str) -> list:
return packages
+def add_cherrypicks_for_packages(packages: t.List[str], symlinks: t.List[str],
+ start_rev: git_llvm_rev.Rev,
+ rev: git_llvm_rev.Rev, sha: str,
+ llvm_config: git_llvm_rev.LLVMConfig):
+ """Create a patch and add its metadata for each package"""
+ for package, symlink in zip(packages, symlinks):
+ symlink_dir = os.path.dirname(symlink)
+ patches_json_path = os.path.join(symlink_dir, 'files/PATCHES.json')
+ relative_patches_dir = 'cherry' if package == 'llvm' else ''
+ patches_dir = os.path.join(symlink_dir, 'files', relative_patches_dir)
+ logging.info('Cherrypicking %s (%s) into %s', rev, sha, package)
+ add_cherrypick(patches_json_path, patches_dir, relative_patches_dir,
+ start_rev, llvm_config.dir, rev, sha, package)
+
+
+def make_cl(symlinks_to_uprev: t.List[str], llvm_symlink_dir: str, branch: str,
+ commit_messages: t.List[str], reviewers: t.Optional[t.List[str]],
+ cc: t.Optional[t.List[str]]):
+ symlinks_to_uprev = sorted(set(symlinks_to_uprev))
+ for symlink in symlinks_to_uprev:
+ update_chromeos_llvm_hash.UprevEbuildSymlink(symlink)
+ subprocess.check_output(['git', 'add', '--all'],
+ cwd=os.path.dirname(symlink))
+ git.UploadChanges(llvm_symlink_dir, branch, commit_messages, reviewers, cc)
+ git.DeleteBranch(llvm_symlink_dir, branch)
+
+
+def resolve_symbolic_sha(start_sha: str, llvm_symlink_dir: str) -> str:
+ if start_sha == 'llvm':
+ return parse_ebuild_for_assignment(llvm_symlink_dir, 'LLVM_HASH')
+
+ if start_sha == 'llvm-next':
+ return parse_ebuild_for_assignment(llvm_symlink_dir, 'LLVM_NEXT_HASH')
+
+ return start_sha
+
+
+def find_commits_and_make_cl(chroot_path: str, shas: t.List[str],
+ start_rev: git_llvm_rev.Rev,
+ llvm_config: git_llvm_rev.LLVMConfig,
+ llvm_symlink_dir: str, create_cl: bool,
+ reviewers: t.Optional[t.List[str]],
+ cc: t.Optional[t.List[str]]):
+ if create_cl:
+ branch = f'cherry-pick-{datetime.now().strftime("%Y%m%d%H%M%S%f")}'
+ git.CreateBranch(llvm_symlink_dir, branch)
+ symlinks_to_uprev = []
+ commit_messages = [
+ 'llvm: cherry-pick CLs from upstream\n',
+ ]
+
+ for sha in shas:
+ sha = resolve_llvm_ref(llvm_config.dir, sha)
+ rev = git_llvm_rev.translate_sha_to_rev(llvm_config, sha)
+ # Find out the llvm projects changed in this commit
+ packages = get_package_names(sha, llvm_config.dir)
+ # Find out the ebuild symlinks of the corresponding ChromeOS packages
+ symlinks = chroot.GetChrootEbuildPaths(chroot_path, [
+ 'sys-devel/llvm' if package == 'llvm' else 'sys-libs/' + package
+ for package in packages
+ ])
+ symlinks = chroot.ConvertChrootPathsToAbsolutePaths(chroot_path, symlinks)
+
+ add_cherrypicks_for_packages(packages, symlinks, start_rev, rev, sha,
+ llvm_config)
+ if create_cl:
+ symlinks_to_uprev.extend(symlinks)
+ commit_messages.extend([
+ '\n\nreviews.llvm.org/rG%s\n' % sha,
+ subprocess.check_output(['git', 'log', '-n1', '--oneline', sha],
+ cwd=llvm_config.dir,
+ encoding='utf-8')
+ ])
+
+ if create_cl:
+ make_cl(symlinks_to_uprev, llvm_symlink_dir, branch, commit_messages,
+ reviewers, cc)
+
+
+def do_cherrypick(chroot_path: str,
+ create_cl: bool,
+ start_sha: str,
+ shas: t.List[str],
+ reviewers: t.List[str] = None,
+ cc: t.List[str] = None):
+ llvm_symlink = chroot.ConvertChrootPathsToAbsolutePaths(
+ chroot_path, chroot.GetChrootEbuildPaths(chroot_path,
+ ['sys-devel/llvm']))[0]
+ llvm_symlink_dir = os.path.dirname(llvm_symlink)
+
+ git_status = subprocess.check_output(['git', 'status', '-s'],
+ cwd=llvm_symlink_dir,
+ encoding='utf-8')
+
+ if git_status:
+ error_path = os.path.dirname(os.path.dirname(llvm_symlink_dir))
+ raise ValueError(f'Uncommited changes detected in {error_path}')
+
+ start_sha = resolve_symbolic_sha(start_sha, llvm_symlink_dir)
+ logging.info('Base llvm hash == %s', start_sha)
+
+ llvm_config = git_llvm_rev.LLVMConfig(
+ remote='origin', dir=get_llvm_hash.GetAndUpdateLLVMProjectInLLVMTools())
+ start_sha = resolve_llvm_ref(llvm_config.dir, start_sha)
+
+ find_commits_and_make_cl(
+ chroot_path=chroot_path,
+ shas=shas,
+ start_rev=git_llvm_rev.translate_sha_to_rev(llvm_config, start_sha),
+ llvm_config=llvm_config,
+ llvm_symlink_dir=llvm_symlink_dir,
+ create_cl=create_cl,
+ reviewers=reviewers,
+ cc=cc)
+ logging.info('Complete.')
+
+
def main():
chroot.VerifyOutsideChroot()
logging.basicConfig(
@@ -170,80 +289,11 @@ def main():
help='Automatically create a CL if specified')
args = parser.parse_args()
- llvm_symlink = chroot.ConvertChrootPathsToAbsolutePaths(
- args.chroot_path,
- chroot.GetChrootEbuildPaths(args.chroot_path, ['sys-devel/llvm']))[0]
- llvm_symlink_dir = os.path.dirname(llvm_symlink)
-
- git_status = subprocess.check_output(['git', 'status', '-s'],
- cwd=llvm_symlink_dir,
- encoding='utf-8')
- if git_status:
- raise ValueError('Uncommited changes detected in %s' %
- os.path.dirname(os.path.dirname(llvm_symlink_dir)))
-
- start_sha = args.start_sha
- if start_sha == 'llvm':
- start_sha = parse_ebuild_for_assignment(llvm_symlink_dir, 'LLVM_HASH')
- elif start_sha == 'llvm-next':
- start_sha = parse_ebuild_for_assignment(llvm_symlink_dir, 'LLVM_NEXT_HASH')
- logging.info('Base llvm hash == %s', start_sha)
-
- llvm_config = git_llvm_rev.LLVMConfig(
- remote='origin', dir=get_llvm_hash.GetAndUpdateLLVMProjectInLLVMTools())
-
- start_sha = resolve_llvm_ref(llvm_config.dir, start_sha)
- start_rev = git_llvm_rev.translate_sha_to_rev(llvm_config, start_sha)
-
- if args.create_cl:
- branch = 'cherry-pick'
- git.CreateBranch(llvm_symlink_dir, branch)
- symlinks_to_uprev = []
- commit_messages = [
- 'llvm: cherry-pick CLs from upstream\n',
- ]
-
- for sha in args.sha:
- sha = resolve_llvm_ref(llvm_config.dir, sha)
- rev = git_llvm_rev.translate_sha_to_rev(llvm_config, sha)
- # Find out the llvm projects changed in this commit
- packages = get_package_names(sha, llvm_config.dir)
- # Find out the ebuild symlinks of the corresponding ChromeOS packages
- symlinks = chroot.GetChrootEbuildPaths(args.chroot_path, [
- 'sys-devel/llvm' if package == 'llvm' else 'sys-libs/' + package
- for package in packages
- ])
- symlinks = chroot.ConvertChrootPathsToAbsolutePaths(args.chroot_path,
- symlinks)
-
- # Create a patch and add its metadata for each package
- for package, symlink in zip(packages, symlinks):
- symlink_dir = os.path.dirname(symlink)
- patches_json_path = os.path.join(symlink_dir, 'files/PATCHES.json')
- relative_patches_dir = 'cherry' if package == 'llvm' else ''
- patches_dir = os.path.join(symlink_dir, 'files', relative_patches_dir)
- logging.info('Cherrypicking %s (%s) into %s', rev, sha, package)
-
- add_cherrypick(patches_json_path, patches_dir, relative_patches_dir,
- start_rev, llvm_config.dir, rev, sha, package)
- if args.create_cl:
- symlinks_to_uprev.extend(symlinks)
- commit_messages.extend([
- '\n\nreviews.llvm.org/rG%s\n' % sha,
- subprocess.check_output(['git', 'log', '-n1', '--oneline', sha],
- cwd=llvm_config.dir,
- encoding='utf-8')
- ])
-
- logging.info('Complete.')
-
- if args.create_cl:
- symlinks_to_uprev = list(sorted(set(symlinks_to_uprev)))
- for symlink in symlinks_to_uprev:
- update_chromeos_llvm_hash.UprevEbuildSymlink(symlink)
- subprocess.check_output(['git', 'add', '--all'], cwd=symlink_dir)
- git.UploadChanges(llvm_symlink_dir, branch, commit_messages)
- git.DeleteBranch(llvm_symlink_dir, branch)
+ do_cherrypick(
+ chroot_path=args.chroot_path,
+ create_cl=args.create_cl,
+ start_sha=args.start_sha,
+ shas=args.sha)
if __name__ == '__main__':