| #!src/build/run_python |
| |
| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Automates rebasing our patched files against upstream Android code.""" |
| |
| import argparse |
| import sys |
| |
| from src.build.util.rebase import constants |
| from src.build.util.rebase import mod as rebase_mod |
| |
| _EPILOG = r""" |
| This script performs the following operations: |
| |
| 1. Locate the base code being modified, for both the old version and the |
| current (newer) version. |
| |
| 2. Validate that the modification is correct for the old version of the base |
| code. |
| |
| 3. If necessary, "git mv" the modification to the new location. |
| |
| 4. Perform a three way merge of the mod, the old base code, and the new base |
| code to generate a new mod (rebase the mod). |
| |
| 5. Validate that the new modification is correct for the new version of the |
| base code. |
| |
| Note that the newly rebased modification still needs to be compiled and |
| tested. Everything might merge and verify cleanly only for there to be some |
| other error (such as a variable being renamed in the base code). |
| |
| Usage Examples: |
| |
| 1. Rebase BootAnimation.cpp in place, upgrading from android-5.0.0_r7 to the |
| current version. |
| |
| %(prog)s --from android-5.0.0_r7 \ |
| mods/frameworks/base/cmds/bootanimation/BootAnimation.cpp |
| |
| 2. Rebase the modification to Surface.h, moving it to a new subdirectory to |
| match the base file being moved as well from android-4.4_r1 to the current |
| version. |
| |
| %(prog)s --from android-4.4_r1 \ |
| mods/frameworks/native/include/gui/Surface.h \ |
| mods/frameworks/base/include/surfaceflinger/Surface.h |
| """.strip() |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description=__doc__, epilog=_EPILOG, |
| formatter_class=argparse.RawTextHelpFormatter) |
| |
| parser.add_argument('--from', dest='old_revision', required=True, |
| help='The old Android revision tag.') |
| parser.add_argument('old_path') |
| parser.add_argument('new_path', nargs='?') |
| args = parser.parse_args() |
| |
| mod = rebase_mod.get_arc_android_mod(args.old_path) |
| mod.rebase(args.old_revision, force_new_mod_path=args.new_path) |
| |
| if mod.status == constants.RESULT_OK: |
| print 'Merged files automatically, no manual work needed' |
| elif mod.status == constants.RESULT_MOD_INCORRECT_FOR_OLD_VERSION: |
| sys.exit( |
| 'analyze_diffs reported errors for "%s". The old version you specified ' |
| 'may not match the version of the code the modification is actually ' |
| 'supposed to track.' % ( |
| args.old_path)) |
| elif mod.status == ( |
| constants.RESULT_MOD_ANDROID_SUBMODULE_NOT_IDENTIFIED): |
| sys.exit( |
| 'The tracked source code appears to have moved, and the new location ' |
| 'for the base code modified by "%s" was not identified.' % ( |
| mod.new_mod_path)) |
| elif mod.status == constants.RESULT_MOD_EXISTS_AT_NEW_LOCATION: |
| sys.exit( |
| 'A file exists at the new location for the mod "%s".' % ( |
| mod.new_mod_path)) |
| elif mod.status == constants.RESULT_REBASE_RESULT_NO_UPSTREAM: |
| sys.exit( |
| 'The original source file for %s was unable to be located. You will ' |
| 'need to manually move the mod or otherwise fix it up to identify the ' |
| 'correct file.' % ( |
| args.old_path)) |
| elif mod.status == constants.RESULT_NO_CLEAN_MERGE: |
| sys.exit( |
| 'The merge of "%s" did not complete cleanly. You will need to manually ' |
| 'edit it to fix it.' % ( |
| mod.new_mod_path)) |
| elif mod.status == constants.RESULT_DIFFS_AFTER_MERGE: |
| sys.exit( |
| 'The merge of "%s" completed cleanly, but analyze_diffs reported ' |
| 'errors.' % ( |
| mod.new_mod_path)) |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |