You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.3 KiB
70 lines
2.3 KiB
#!/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 apply diffs between given two upstream commit hashes to current
|
|
workspace.
|
|
|
|
This utility diffs files between old_commit and new_commit, with hard-coded
|
|
filter rules, and apply the diff to current HEAD with 3-way-merge supported.
|
|
|
|
This can be used to uprev a libchrome directory when this is not git history for
|
|
git merge to work.
|
|
"""
|
|
|
|
import argparse
|
|
import subprocess
|
|
import sys
|
|
|
|
import filters
|
|
import utils
|
|
|
|
def main():
|
|
# Init args
|
|
parser = argparse.ArgumentParser(
|
|
description='Copy file from given commits')
|
|
parser.add_argument(
|
|
'old_commit', metavar='old_commit', type=str, nargs=1,
|
|
help='commit hash in upstream branch or browser repository '
|
|
'we want to uprev from')
|
|
parser.add_argument(
|
|
'new_commit', metavar='new_commit', type=str, nargs=1,
|
|
help='commit hash in upstream branch or browser repository '
|
|
'we want ot uprev to')
|
|
parser.add_argument(
|
|
'--dry_run', dest='dry_run', action='store_const', const=True, default=False)
|
|
parser.add_argument(
|
|
'--is_browser', dest='is_browser', action='store_const', const=True, default=False,
|
|
help='is the commit hash in browser repository')
|
|
arg = parser.parse_args(sys.argv[1:])
|
|
|
|
# Get old and new files.
|
|
old_files = utils.get_file_list(arg.old_commit[0])
|
|
new_files = utils.get_file_list(arg.new_commit[0])
|
|
|
|
if arg.is_browser:
|
|
old_files = filters.filter_file([], old_files)
|
|
new_files = filters.filter_file([], new_files)
|
|
assert filters.filter_file(old_files, []) == []
|
|
assert filters.filter_file(new_files, []) == []
|
|
|
|
# Generate a tree object for new files.
|
|
old_tree = utils.git_mktree(old_files)
|
|
new_tree = utils.git_mktree(new_files)
|
|
newroot = utils.git_commit(old_tree, [])
|
|
squashed = utils.git_commit(new_tree, [newroot])
|
|
|
|
# Generate patch for git am
|
|
patch = subprocess.check_output(['git', 'format-patch', '--stdout', newroot+b'..'+squashed])
|
|
|
|
if arg.dry_run:
|
|
print(patch.decode('utf-8'))
|
|
else:
|
|
subprocess.run(['git', 'am', '-3'], input=patch)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|