| #!/usr/bin/env python3 |
| # Copyright 2020 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """ |
| Utility to copy missing files from Chromium tree to Chromium OS libchrome tree |
| based on hard coded rules. |
| |
| This utility is used to diff current HEAD against given commit in Chromium |
| browser master branch, copy missing files after hard-coded filter rules and |
| remove unnecessary files. libchrome original files in hard-coded filter rules |
| will be untounched. |
| """ |
| |
| import argparse |
| import os |
| import os.path |
| import subprocess |
| import sys |
| |
| import filters |
| import utils |
| |
| def main(): |
| # Init args |
| parser = argparse.ArgumentParser( |
| description='Copy file from given commits') |
| parser.add_argument( |
| 'commit_hash', |
| metavar='commit', |
| type=str, |
| nargs=1, |
| help='commit hash to copy files from') |
| parser.add_argument( |
| '--dry_run', |
| dest='dry_run', |
| action='store_const', |
| const=True, |
| default=False) |
| arg = parser.parse_args(sys.argv[1:]) |
| |
| # Read file list from HEAD and upstream commit. |
| upstream_files = utils.get_file_list(arg.commit_hash[0]) |
| our_files = utils.get_file_list('HEAD') |
| |
| # Calculate target file list |
| target_files = filters.filter_file(our_files, upstream_files) |
| |
| # Calculate operations needed |
| ops = utils.gen_op(our_files, target_files) |
| |
| if arg.dry_run: |
| # Print ops only on dry-run mode. |
| print('\n'.join(repr(x) for x in ops)) |
| return |
| for op, f in ops: |
| # Ignore if op is REP because we only want to copy missing files, not to |
| # revert custom Chromium OS libchrome patch. |
| assert type(op) == utils.DiffOperations |
| if op == utils.DiffOperations.DEL: |
| subprocess.check_call(['git', 'rm', f.path]), |
| elif op == utils.DiffOperations.ADD: |
| # Create directory recursively if not exist. |
| os.makedirs(os.path.dirname(f.path), exist_ok=True) |
| # Read file by git cat-file with blob object id to avoid heavy git checkout. |
| with open(f.path, 'wb') as outfile: |
| subprocess.check_call(['git', 'cat-file', 'blob', f.id], |
| stdout=outfile) |
| # Add to git index |
| subprocess.check_call(['git', 'add', f.path]) |
| |
| if __name__ == '__main__': |
| main() |