#!/usr/bin/env python import argparse import imp import os import sys import manifest from . import vcs from .log import get_logger from .tree import GitTree, NoVCSTree here = os.path.dirname(__file__) def update(tests_root, url_base, manifest, ignore_local=False): if vcs.is_git_repo(tests_root): tests_tree = GitTree(tests_root, url_base) remove_missing_local = False else: tests_tree = NoVCSTree(tests_root, url_base) remove_missing_local = not ignore_local if not ignore_local: local_changes = tests_tree.local_changes() else: local_changes = None manifest.update(tests_root, url_base, tests_tree.current_rev(), tests_tree.committed_changes(manifest.rev), local_changes, remove_missing_local=remove_missing_local) def update_from_cli(**kwargs): tests_root = kwargs["tests_root"] path = kwargs["path"] assert tests_root is not None m = None logger = get_logger() if not kwargs.get("rebuild", False): try: m = manifest.load(tests_root, path) except manifest.ManifestVersionMismatch: logger.info("Manifest version changed, rebuilding") m = None else: logger.info("Updating manifest") if m is None: m = manifest.Manifest(None) update(tests_root, kwargs["url_base"], m, ignore_local=kwargs.get("ignore_local", False)) manifest.write(m, path) def abs_path(path): return os.path.abspath(os.path.expanduser(path)) def create_parser(): parser = argparse.ArgumentParser() parser.add_argument( "-p", "--path", type=abs_path, help="Path to manifest file.") parser.add_argument( "--tests-root", type=abs_path, help="Path to root of tests.") parser.add_argument( "-r", "--rebuild", action="store_true", default=False, help="Force a full rebuild of the manifest.") parser.add_argument( "--ignore-local", action="store_true", default=False, help="Don't include uncommitted local changes in the manifest.") parser.add_argument( "--url-base", action="store", default="/", help="Base url to use as the mount point for tests in this manifest.") return parser def find_top_repo(): path = here rv = None while path != "/": if vcs.is_git_repo(path): rv = path path = os.path.abspath(os.path.join(path, os.pardir)) return rv def main(default_tests_root=None): opts = create_parser().parse_args() if opts.tests_root is None: tests_root = None if default_tests_root is not None: tests_root = default_tests_root else: tests_root = find_top_repo() if tests_root is None: print >> sys.stderr, """No git repo found; could not determine test root. Run again with --test-root""" sys.exit(1) opts.tests_root = tests_root if opts.path is None: opts.path = os.path.join(opts.tests_root, "MANIFEST.json") update_from_cli(**vars(opts)) if __name__ == "__main__": main()