diff options
author | Christopher Di Bella <cjdb@google.com> | 2021-11-01 17:36:00 +0000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-11-04 23:33:12 +0000 |
commit | 58a779e703fff9d349b33de2bd2bfe25c6423729 (patch) | |
tree | 957b889077d7db0004ddcf17257c1630716153e8 /llvm_tools | |
parent | 28d6cbe1b03d7276fca88f1ab6d90e7914092d65 (diff) | |
download | toolchain-utils-58a779e703fff9d349b33de2bd2bfe25c6423729.tar.gz |
llvm_tools: adds a way to skip dependencies when pulling from Phab
Phabricator has a way to list dependencies, which Arcanist will
pull in succession to make sure the patch is correct. This is
fine until some of the patches land in main: Arcanist then gets
confused and doesn't always correctly apply the patches.
This patch makes it possible to skip dependencies by adding a new flag
to our upstream patch getter.
The current design is only going to permit `--skip_dependencies` when
there's exactly one `--differential` patch, since `--skip_dependencies`
is a global option. If we're finding this to be a common nuisance,
then we can look at redesigning the feature to allow lists of
differentials with skipped dependencies.
```
./get_upstream_patch.py --differential D12345 --skip_dependencies
./get_upstream_patch.py --cl 12345 --differential D45678 --skip_dependencies
./get_upstream_patch.py --cl 12345 --skip-dependencies
./get_upstream_patch.py --differential D12345 \
--differential D45678 \
--skip_dependencies
```
BUG=b:204779256
TEST=Tested locally
Change-Id: I89032cba82c17c9f844bfac3cba330d173826ffd
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/3255665
Commit-Queue: Christopher Di Bella <cjdb@google.com>
Tested-by: Christopher Di Bella <cjdb@google.com>
Auto-Submit: Christopher Di Bella <cjdb@google.com>
Reviewed-by: Manoj Gupta <manojgupta@chromium.org>
Reviewed-by: George Burgess <gbiv@chromium.org>
Diffstat (limited to 'llvm_tools')
-rwxr-xr-x | llvm_tools/get_upstream_patch.py | 89 |
1 files changed, 51 insertions, 38 deletions
diff --git a/llvm_tools/get_upstream_patch.py b/llvm_tools/get_upstream_patch.py index 77783d41..cc5505db 100755 --- a/llvm_tools/get_upstream_patch.py +++ b/llvm_tools/get_upstream_patch.py @@ -31,8 +31,8 @@ class CherrypickError(ValueError): def add_patch(patches_json_path: str, patches_dir: str, relative_patches_dir: str, start_version: git_llvm_rev.Rev, - llvm_dir: str, rev: t.Union[git_llvm_rev.Rev, str], sha: str, - package: str): + llvm_dir: str, rev: t.Union[git_llvm_rev.Rev, + str], sha: str, package: str): """Gets the start and end intervals in 'json_file'. Args: @@ -85,7 +85,9 @@ def add_patch(patches_json_path: str, patches_dir: str, subprocess.check_call(cmd, stdout=f, cwd=llvm_dir) commit_subject = subprocess.check_output( - ['git', 'log', '-n1', '--format=%s', sha], cwd=llvm_dir, encoding='utf-8') + ['git', 'log', '-n1', '--format=%s', sha], + cwd=llvm_dir, + encoding='utf-8') patch_metadata = { 'comment': commit_subject.strip(), @@ -177,8 +179,8 @@ def get_package_names(sha: str, llvm_dir: str) -> list: def create_patch_for_packages(packages: t.List[str], symlinks: t.List[str], start_rev: git_llvm_rev.Rev, - rev: t.Union[git_llvm_rev.Rev, str], sha: str, - llvm_dir: str): + rev: t.Union[git_llvm_rev.Rev, + str], sha: str, llvm_dir: str): """Create a patch and add its metadata for each package""" for package, symlink in zip(packages, symlinks): symlink_dir = os.path.dirname(symlink) @@ -212,12 +214,11 @@ def resolve_symbolic_sha(start_sha: str, llvm_symlink_dir: str) -> str: return start_sha -def find_patches_and_make_cl(chroot_path: str, patches: 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]]): +def find_patches_and_make_cl( + chroot_path: str, patches: t.List[str], start_rev: git_llvm_rev.Rev, + llvm_config: git_llvm_rev.LLVMConfig, llvm_symlink_dir: str, + create_cl: bool, skip_dependencies: bool, + reviewers: t.Optional[t.List[str]], cc: t.Optional[t.List[str]]): if create_cl: branch = f'get-upstream-{datetime.now().strftime("%Y%m%d%H%M%S%f")}' git.CreateBranch(llvm_symlink_dir, branch) @@ -231,7 +232,11 @@ def find_patches_and_make_cl(chroot_path: str, patches: t.List[str], is_differential = patch.startswith('D') if is_differential: subprocess.check_output( - ['arc', 'patch', '--nobranch', '--revision', patch], + [ + 'arc', 'patch', '--nobranch', + '--skip-dependencies' if skip_dependencies else '--revision', + patch + ], cwd=llvm_config.dir, ) sha = resolve_llvm_ref(llvm_config.dir, 'HEAD') @@ -275,6 +280,7 @@ def find_patches_and_make_cl(chroot_path: str, patches: t.List[str], def get_from_upstream(chroot_path: str, create_cl: bool, + skip_dependencies: bool, start_sha: str, patches: t.List[str], reviewers: t.List[str] = None, @@ -299,15 +305,16 @@ def get_from_upstream(chroot_path: str, remote='origin', dir=get_llvm_hash.GetAndUpdateLLVMProjectInLLVMTools()) start_sha = resolve_llvm_ref(llvm_config.dir, start_sha) - find_patches_and_make_cl( - chroot_path=chroot_path, - patches=patches, - 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) + find_patches_and_make_cl(chroot_path=chroot_path, + patches=patches, + 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, + skip_dependencies=skip_dependencies, + reviewers=reviewers, + cc=cc) logging.info('Complete.') @@ -319,40 +326,46 @@ def main(): ) parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument( - '--chroot_path', - default=os.path.join(os.path.expanduser('~'), 'chromiumos'), - help='the path to the chroot (default: %(default)s)') + parser.add_argument('--chroot_path', + default=os.path.join(os.path.expanduser('~'), + 'chromiumos'), + help='the path to the chroot (default: %(default)s)') parser.add_argument( '--start_sha', default='llvm-next', help='LLVM SHA that the patch should start applying at. You can specify ' '"llvm" or "llvm-next", as well. Defaults to %(default)s.') - parser.add_argument( - '--sha', - action='append', - default=[], - help='The LLVM git SHA to cherry-pick.') + parser.add_argument('--sha', + action='append', + default=[], + help='The LLVM git SHA to cherry-pick.') parser.add_argument( '--differential', action='append', default=[], help='The LLVM differential revision to apply. Example: D1234') + parser.add_argument('--create_cl', + action='store_true', + help='Automatically create a CL if specified') parser.add_argument( - '--create_cl', - default=False, + '--skip_dependencies', action='store_true', - help='Automatically create a CL if specified') + help="Skips a LLVM differential revision's dependencies. Only valid " + 'when --differential appears exactly once.') args = parser.parse_args() if not (args.sha or args.differential): parser.error('--sha or --differential required') - get_from_upstream( - chroot_path=args.chroot_path, - create_cl=args.create_cl, - start_sha=args.start_sha, - patches=args.sha + args.differential) + if args.skip_dependencies and len(args.differential) != 1: + parser.error("--skip_dependencies is only valid when there's exactly one " + 'supplied differential') + + get_from_upstream(chroot_path=args.chroot_path, + create_cl=args.create_cl, + skip_dependencies=args.skip_dependencies, + start_sha=args.start_sha, + patches=args.sha + args.differential) if __name__ == '__main__': |