| #!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. |
| |
| import argparse |
| import os |
| import shutil |
| import subprocess |
| import sys |
| import tempfile |
| |
| from src.build import build_common |
| from src.build.util import file_util |
| |
| |
| _USER = os.getenv('USER', 'default') |
| _STASH_DIR = os.path.join(tempfile.gettempdir(), |
| 'arc-ninja-stash-' + _USER) |
| _CURRENT_DIR = os.path.join(tempfile.gettempdir(), |
| 'arc-ninja-current-' + _USER) |
| |
| |
| def _copy_off(where): |
| if os.path.exists(where): |
| file_util.rmtree(where) |
| root = build_common.get_arc_root() |
| generated_ninja_dir = os.path.join(root, build_common.OUT_DIR, |
| 'generated_ninja') |
| top_level_ninja = os.path.join(root, 'build.ninja') |
| if (not os.path.exists(top_level_ninja) or |
| not os.path.exists(generated_ninja_dir)): |
| sys.exit('You must run configure first') |
| |
| shutil.copytree(generated_ninja_dir, where) |
| shutil.copy(top_level_ninja, where) |
| |
| |
| def _handle_stash(extra_args=None): |
| _copy_off(_STASH_DIR) |
| return 0 |
| |
| |
| def _handle_diff_common_setup(extra_args=None): |
| if not os.path.exists(_STASH_DIR): |
| sys.exit('No stash directory found - run with stash parameter') |
| _copy_off(_CURRENT_DIR) |
| |
| |
| def _handle_diff(extra_args=None, stdout=None): |
| if extra_args is None: |
| extra_args = [] |
| |
| _handle_diff_common_setup() |
| return subprocess.call(['diff', _STASH_DIR, _CURRENT_DIR] + extra_args, |
| stdout=stdout) |
| |
| |
| def _handle_meld(extra_args=None): |
| with open(os.devnull, 'w') as devnull: |
| if _handle_diff(['-q'], stdout=devnull): |
| return subprocess.call(['meld', _STASH_DIR, _CURRENT_DIR]) |
| return 0 |
| |
| |
| def main(): |
| description = """ |
| Helper script for viewing differences in the ninja build scripts that may be |
| introduced when changing the ninja-generator scripts.""" |
| |
| epilog = """ |
| Typical usage: |
| |
| 1) Save a copy of the current ninja build scripts. |
| |
| $ %(prog)s stash |
| |
| 2) Make changes to the ninja-generator scripts or switch back to the changed |
| branch from a previous version. |
| |
| 3) Check the current scripts against the stashed copy using diff. |
| |
| $ %(prog)s diff |
| |
| If you have meld installed, you can also use it for a nicer interactive diff: |
| |
| $ %(prog)s meld""" |
| |
| parser = argparse.ArgumentParser( |
| description=description, |
| epilog=epilog, |
| formatter_class=argparse.RawDescriptionHelpFormatter) |
| parser.add_argument('command', choices=['stash', 'diff', 'meld']) |
| args, extra_args = parser.parse_known_args() |
| |
| return dict(stash=_handle_stash, |
| diff=_handle_diff, |
| meld=_handle_meld)[args.command](extra_args) |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |