Chromium Code Reviews| Index: mojo/public/tools/dart_pkg.py |
| diff --git a/mojo/public/tools/dart_pkg.py b/mojo/public/tools/dart_pkg.py |
| index 86ae5d5b83c36ad3eeed10bdbbf916daa853cd27..7128dc4b6a27feccd06450a896c93110c938a337 100755 |
| --- a/mojo/public/tools/dart_pkg.py |
| +++ b/mojo/public/tools/dart_pkg.py |
| @@ -11,6 +11,7 @@ import errno |
| import json |
| import os |
| import shutil |
| +import subprocess |
| import sys |
| # Disable lint check for finding modules: |
| @@ -24,253 +25,313 @@ from mojom.parse.translate import Translate |
| USE_LINKS = sys.platform != "win32" |
| +DART_ANALYZE = os.path.join(os.path.dirname(os.path.abspath(__file__)), |
| + "dart_analyze.py") |
| def mojom_dart_filter(path): |
| - if os.path.isdir(path): |
| - return True |
| - # Don't include all .dart, just .mojom.dart. |
| - return path.endswith('.mojom.dart') |
| + if os.path.isdir(path): |
| + return True |
| + # Don't include all .dart, just .mojom.dart. |
| + return path.endswith('.mojom.dart') |
| def dart_filter(path): |
| - if os.path.isdir(path): |
| - return True |
| - _, ext = os.path.splitext(path) |
| - # .dart includes '.mojom.dart' |
| - return ext == '.dart' |
| + if os.path.isdir(path): |
| + return True |
| + _, ext = os.path.splitext(path) |
| + # .dart includes '.mojom.dart' |
| + return ext == '.dart' |
| def mojom_filter(path): |
| - if os.path.isdir(path): |
| - return True |
| - _, ext = os.path.splitext(path) |
| - return ext == '.mojom' |
| + if os.path.isdir(path): |
| + return True |
| + _, ext = os.path.splitext(path) |
| + return ext == '.mojom' |
| def ensure_dir_exists(path): |
| - abspath = os.path.abspath(path) |
| - if not os.path.exists(abspath): |
| - os.makedirs(abspath) |
| + abspath = os.path.abspath(path) |
| + if not os.path.exists(abspath): |
| + os.makedirs(abspath) |
| def has_pubspec_yaml(paths): |
| - for path in paths: |
| - _, filename = os.path.split(path) |
| - if 'pubspec.yaml' == filename: |
| - return True |
| - return False |
| + for path in paths: |
| + _, filename = os.path.split(path) |
| + if 'pubspec.yaml' == filename: |
| + return True |
| + return False |
| def link(from_root, to_root): |
| - ensure_dir_exists(os.path.dirname(to_root)) |
| - if os.path.exists(to_root): |
| - os.unlink(to_root) |
| - try: |
| - os.symlink(from_root, to_root) |
| - except OSError as e: |
| - if e.errno == errno.EEXIST: |
| - pass |
| + ensure_dir_exists(os.path.dirname(to_root)) |
| + if os.path.exists(to_root): |
| + os.unlink(to_root) |
| + try: |
| + os.symlink(from_root, to_root) |
| + except OSError as e: |
| + if e.errno == errno.EEXIST: |
| + pass |
| def copy(from_root, to_root, filter_func=None): |
| - if not os.path.exists(from_root): |
| - return |
| - if os.path.isfile(from_root): |
| - ensure_dir_exists(os.path.dirname(to_root)) |
| - shutil.copy(from_root, to_root) |
| - return |
| + if not os.path.exists(from_root): |
| + return |
| + if os.path.isfile(from_root): |
| + ensure_dir_exists(os.path.dirname(to_root)) |
| + shutil.copy(from_root, to_root) |
| + return |
| - ensure_dir_exists(to_root) |
| + ensure_dir_exists(to_root) |
| - for root, dirs, files in os.walk(from_root): |
| - # filter_func expects paths not names, so wrap it to make them absolute. |
| - wrapped_filter = None |
| - if filter_func: |
| - wrapped_filter = lambda name: filter_func(os.path.join(root, name)) |
| + for root, dirs, files in os.walk(from_root): |
| + # filter_func expects paths not names, so wrap it to make them absolute. |
| + wrapped_filter = None |
| + if filter_func: |
| + wrapped_filter = lambda name: filter_func(os.path.join(root, name)) |
| - for name in filter(wrapped_filter, files): |
| - from_path = os.path.join(root, name) |
| - root_rel_path = os.path.relpath(from_path, from_root) |
| - to_path = os.path.join(to_root, root_rel_path) |
| - to_dir = os.path.dirname(to_path) |
| - if not os.path.exists(to_dir): |
| - os.makedirs(to_dir) |
| - shutil.copy(from_path, to_path) |
| + for name in filter(wrapped_filter, files): |
| + from_path = os.path.join(root, name) |
| + root_rel_path = os.path.relpath(from_path, from_root) |
| + to_path = os.path.join(to_root, root_rel_path) |
| + to_dir = os.path.dirname(to_path) |
| + if not os.path.exists(to_dir): |
| + os.makedirs(to_dir) |
| + shutil.copy(from_path, to_path) |
| - dirs[:] = filter(wrapped_filter, dirs) |
| + dirs[:] = filter(wrapped_filter, dirs) |
| def copy_or_link(from_root, to_root, filter_func=None): |
| - if USE_LINKS: |
| - link(from_root, to_root) |
| - else: |
| - copy(from_root, to_root, filter_func) |
| + if USE_LINKS: |
| + link(from_root, to_root) |
| + else: |
| + copy(from_root, to_root, filter_func) |
| def remove_if_exists(path): |
| - try: |
| - os.remove(path) |
| - except OSError as e: |
| - if e.errno != errno.ENOENT: |
| - raise |
| + try: |
| + os.remove(path) |
| + except OSError as e: |
| + if e.errno != errno.ENOENT: |
| + raise |
| def list_files(from_root, filter_func=None): |
| - file_list = [] |
| - for root, dirs, files in os.walk(from_root): |
| - # filter_func expects paths not names, so wrap it to make them absolute. |
| - wrapped_filter = None |
| - if filter_func: |
| - wrapped_filter = lambda name: filter_func(os.path.join(root, name)) |
| - for name in filter(wrapped_filter, files): |
| - path = os.path.join(root, name) |
| - file_list.append(path) |
| - dirs[:] = filter(wrapped_filter, dirs) |
| - return file_list |
| + file_list = [] |
| + for root, dirs, files in os.walk(from_root): |
| + # filter_func expects paths not names, so wrap it to make them absolute. |
| + wrapped_filter = None |
| + if filter_func: |
| + wrapped_filter = lambda name: filter_func(os.path.join(root, name)) |
| + for name in filter(wrapped_filter, files): |
| + path = os.path.join(root, name) |
| + file_list.append(path) |
| + dirs[:] = filter(wrapped_filter, dirs) |
| + return file_list |
| def remove_broken_symlink(path): |
| - try: |
| - link_path = os.readlink(path) |
| - except OSError as e: |
| - # Path was not a symlink. |
| - if e.errno == errno.EINVAL: |
| - pass |
| - else: |
| - if not os.path.exists(link_path): |
| - os.unlink(path) |
| + try: |
| + link_path = os.readlink(path) |
| + except OSError as e: |
| + # Path was not a symlink. |
| + if e.errno == errno.EINVAL: |
| + pass |
| + else: |
| + if not os.path.exists(link_path): |
| + os.unlink(path) |
| def remove_broken_symlinks(root_dir): |
| - for current_dir, _, child_files in os.walk(root_dir): |
| - for filename in child_files: |
| - path = os.path.join(current_dir, filename) |
| - remove_broken_symlink(path) |
| + for current_dir, _, child_files in os.walk(root_dir): |
| + for filename in child_files: |
| + path = os.path.join(current_dir, filename) |
| + remove_broken_symlink(path) |
| def mojom_path(filename): |
| - with open(filename) as f: |
| - source = f.read() |
| - tree = Parse(source, filename) |
| - _, name = os.path.split(filename) |
| - mojom = Translate(tree, name) |
| - elements = mojom['namespace'].split('.') |
| - elements.append("%s" % mojom['name']) |
| - return os.path.join(*elements) |
| + with open(filename) as f: |
| + source = f.read() |
| + tree = Parse(source, filename) |
| + _, name = os.path.split(filename) |
| + mojom = Translate(tree, name) |
| + elements = mojom['namespace'].split('.') |
| + elements.append("%s" % mojom['name']) |
| + return os.path.join(*elements) |
| + |
| + |
| +def analyze_entrypoints(dart_sdk, package_root, entrypoints): |
|
zra
2015/07/27 16:27:46
New function for invoking dart_analyze.py
|
| + cmd = [ "python", DART_ANALYZE ] |
| + cmd.append("--dart-sdk") |
| + cmd.append(dart_sdk) |
| + cmd.append("--entrypoints") |
| + cmd.extend(entrypoints) |
| + cmd.append("--package-root") |
| + cmd.append(package_root) |
| + cmd.append("--no-hints") |
| + try: |
| + subprocess.check_call(cmd) |
| + except subprocess.CalledProcessError as e: |
| + return e.returncode |
| + return 0 |
| def main(): |
| - parser = argparse.ArgumentParser(description='Generate a dart-pkg') |
| - parser.add_argument('--package-name', |
| - action='store', |
| - type=str, |
| - metavar='package_name', |
| - help='Name of package', |
| - required=True) |
| - parser.add_argument('--gen-directory', |
| - metavar='gen_directory', |
| - help="dart-gen directory", |
| - required=True) |
| - parser.add_argument('--pkg-directory', |
| - metavar='pkg_directory', |
| - help='Directory where dart_pkg should go', |
| - required=True) |
| - parser.add_argument('--package-root', |
| - metavar='package_root', |
| - help='packages/ directory', |
| - required=True) |
| - parser.add_argument('--stamp-file', |
| - metavar='stamp_file', |
| - help='timestamp file', |
| - required=True) |
| - parser.add_argument('--package-sources', |
| - metavar='package_sources', |
| - help='Package sources', |
| - nargs='+') |
| - parser.add_argument('--mojom-sources', |
| - metavar='mojom_sources', |
| - help='.mojom and .mojom.dart sources', |
| - nargs='*', |
| - default=[]) |
| - parser.add_argument('--sdk-ext-directories', |
| - metavar='sdk_ext_directories', |
| - help='Directory containing .dart sources', |
| - nargs='*', |
| - default=[]) |
| - parser.add_argument('--sdk-ext-files', |
| - metavar='sdk_ext_files', |
| - help='List of .dart files that are part of of sdk_ext.', |
| - nargs='*', |
| - default=[]) |
| - parser.add_argument('--sdk-ext-mappings', |
| - metavar='sdk_ext_mappings', |
| - help='Mappings for SDK extension libraries.', |
| - nargs='*', |
| - default=[]) |
| - args = parser.parse_args() |
| - |
| - # We must have a pubspec.yaml. |
| - assert has_pubspec_yaml(args.package_sources) |
| - |
| - target_dir = os.path.join(args.pkg_directory, args.package_name) |
| - lib_path = os.path.join(target_dir, "lib") |
| - |
| - mappings = {} |
| - for mapping in args.sdk_ext_mappings: |
| - library, path = mapping.split(',', 1) |
| - mappings[library] = '../sdk_ext/%s' % path |
| - |
| - sdkext_path = os.path.join(lib_path, '_sdkext') |
| - if mappings: |
| - ensure_dir_exists(lib_path) |
| - with open(sdkext_path, 'w') as stream: |
| - json.dump(mappings, stream, sort_keys=True, |
| - indent=2, separators=(',', ': ')) |
| - else: |
| - remove_if_exists(sdkext_path) |
| - |
| - # Copy or symlink package sources into pkg directory. |
| - common_source_prefix = os.path.commonprefix(args.package_sources) |
| - for source in args.package_sources: |
| - relative_source = os.path.relpath(source, common_source_prefix) |
| - target = os.path.join(target_dir, relative_source) |
| - copy_or_link(source, target) |
| - |
| - # Copy sdk-ext sources into pkg directory |
| - sdk_ext_dir = os.path.join(target_dir, 'sdk_ext') |
| - for directory in args.sdk_ext_directories: |
| - sdk_ext_sources = list_files(directory, dart_filter) |
| - common_prefix = os.path.commonprefix(sdk_ext_sources) |
| - for source in sdk_ext_sources: |
| - relative_source = os.path.relpath(source, common_prefix) |
| - target = os.path.join(sdk_ext_dir, relative_source) |
| - copy_or_link(source, target) |
| - for source in args.sdk_ext_files: |
| - common_prefix = os.path.commonprefix(args.sdk_ext_files) |
| - relative_source = os.path.relpath(source, common_prefix) |
| - target = os.path.join(sdk_ext_dir, relative_source) |
| - copy_or_link(source, target) |
| - |
| - lib_mojom_path = os.path.join(lib_path, "mojom") |
| - |
| - # Copy generated mojom.dart files. |
| - generated_mojom_lib_path = os.path.join(args.gen_directory, "mojom/lib") |
| - for mojom_source_path in args.mojom_sources: |
| - path = mojom_path(mojom_source_path) |
| - source_path = '%s.dart' % os.path.join(generated_mojom_lib_path, path) |
| - target_path = '%s.dart' % os.path.join(lib_mojom_path, path) |
| - copy(source_path, target_path) |
| - |
| - # Symlink packages/ |
| - package_path = os.path.join(args.package_root, args.package_name) |
| - link(lib_path, package_path) |
| - |
| - # Remove any broken symlinks in target_dir and package root. |
| - remove_broken_symlinks(target_dir) |
| - remove_broken_symlinks(args.package_root) |
| - |
| - # Write stamp file. |
| - with open(args.stamp_file, 'w'): |
| - pass |
| + parser = argparse.ArgumentParser(description='Generate a dart-pkg') |
| + parser.add_argument('--dart-sdk', |
|
zra
2015/07/27 16:27:46
New option for Dart SDK location.
|
| + action='store', |
| + metavar='dart_sdk', |
| + help='Path to the Dart SDK.') |
| + parser.add_argument('--package-name', |
| + action='store', |
| + metavar='package_name', |
| + help='Name of package', |
| + required=True) |
| + parser.add_argument('--gen-directory', |
| + metavar='gen_directory', |
| + help="dart-gen directory", |
| + required=True) |
| + parser.add_argument('--pkg-directory', |
| + metavar='pkg_directory', |
| + help='Directory where dart_pkg should go', |
| + required=True) |
| + parser.add_argument('--package-root', |
| + metavar='package_root', |
| + help='packages/ directory', |
| + required=True) |
| + parser.add_argument('--stamp-file', |
| + metavar='stamp_file', |
| + help='timestamp file', |
| + required=True) |
| + parser.add_argument('--package-sources', |
| + metavar='package_sources', |
| + help='Package sources', |
| + nargs='+') |
| + parser.add_argument('--package-entrypoints', |
|
zra
2015/07/27 16:27:46
New option for entrypoints.
|
| + metavar='package_entrypoints', |
| + help='Package entry points for analyzer', |
| + nargs='*', |
| + default=[]) |
| + parser.add_argument('--mojom-sources', |
| + metavar='mojom_sources', |
| + help='.mojom and .mojom.dart sources', |
| + nargs='*', |
| + default=[]) |
| + parser.add_argument('--sdk-ext-directories', |
| + metavar='sdk_ext_directories', |
| + help='Directory containing .dart sources', |
| + nargs='*', |
| + default=[]) |
| + parser.add_argument('--sdk-ext-files', |
| + metavar='sdk_ext_files', |
| + help='List of .dart files that are part of of sdk_ext.', |
| + nargs='*', |
| + default=[]) |
| + parser.add_argument('--sdk-ext-mappings', |
| + metavar='sdk_ext_mappings', |
| + help='Mappings for SDK extension libraries.', |
| + nargs='*', |
| + default=[]) |
| + args = parser.parse_args() |
| + |
| + # We must have a pubspec.yaml. |
| + assert has_pubspec_yaml(args.package_sources) |
| + |
| + target_dir = os.path.join(args.pkg_directory, args.package_name) |
| + lib_path = os.path.join(target_dir, "lib") |
| + |
| + mappings = {} |
| + for mapping in args.sdk_ext_mappings: |
| + library, path = mapping.split(',', 1) |
| + mappings[library] = '../sdk_ext/%s' % path |
| + |
| + sdkext_path = os.path.join(lib_path, '_sdkext') |
| + if mappings: |
| + ensure_dir_exists(lib_path) |
| + with open(sdkext_path, 'w') as stream: |
| + json.dump(mappings, stream, sort_keys=True, |
| + indent=2, separators=(',', ': ')) |
| + else: |
| + remove_if_exists(sdkext_path) |
| + |
| + # Copy or symlink package sources into pkg directory. |
| + common_source_prefix = os.path.dirname(os.path.commonprefix( |
| + args.package_sources)) |
| + for source in args.package_sources: |
| + relative_source = os.path.relpath(source, common_source_prefix) |
| + target = os.path.join(target_dir, relative_source) |
| + copy_or_link(source, target) |
| + |
| + entrypoint_targets = [] |
| + for source in args.package_entrypoints: |
| + relative_source = os.path.relpath(source, common_source_prefix) |
| + target = os.path.join(target_dir, relative_source) |
| + copy_or_link(source, target) |
| + entrypoint_targets.append(target) |
| + |
| + # Copy sdk-ext sources into pkg directory |
| + sdk_ext_dir = os.path.join(target_dir, 'sdk_ext') |
| + for directory in args.sdk_ext_directories: |
| + sdk_ext_sources = list_files(directory, dart_filter) |
| + common_prefix = os.path.commonprefix(sdk_ext_sources) |
| + for source in sdk_ext_sources: |
| + relative_source = os.path.relpath(source, common_prefix) |
| + target = os.path.join(sdk_ext_dir, relative_source) |
| + copy_or_link(source, target) |
| + for source in args.sdk_ext_files: |
| + common_prefix = os.path.commonprefix(args.sdk_ext_files) |
| + relative_source = os.path.relpath(source, common_prefix) |
| + target = os.path.join(sdk_ext_dir, relative_source) |
| + copy_or_link(source, target) |
| + |
| + lib_mojom_path = os.path.join(lib_path, "mojom") |
| + |
| + # Copy generated mojom.dart files. |
| + generated_mojom_lib_path = os.path.join(args.gen_directory, "mojom/lib") |
| + for mojom_source_path in args.mojom_sources: |
| + path = mojom_path(mojom_source_path) |
| + source_path = '%s.dart' % os.path.join(generated_mojom_lib_path, path) |
| + target_path = '%s.dart' % os.path.join(lib_mojom_path, path) |
| + copy(source_path, target_path) |
| + |
| + # Symlink packages/ |
| + package_path = os.path.join(args.package_root, args.package_name) |
| + link(lib_path, package_path) |
| + |
| + # Symlink non-dart-pkg dependent packages |
|
zra
2015/07/27 16:27:46
New code to symlink dependent packages not already
|
| + dep_packages = os.path.join(common_source_prefix, 'packages') |
| + if os.path.exists(dep_packages): |
| + for package in os.listdir(dep_packages): |
| + source = os.path.join(dep_packages, package) |
| + target = os.path.join(args.package_root, package) |
| + if not os.path.exists(target): |
| + link(source, target) |
| + |
| + # Remove any broken symlinks in target_dir and package root. |
| + remove_broken_symlinks(target_dir) |
| + remove_broken_symlinks(args.package_root) |
| + |
| + # If any entrypoints are defined, invoke the analyzer on them. |
| + if entrypoint_targets != []: |
|
zra
2015/07/27 16:27:46
New code to analyze entrypoints.
|
| + # Make sure we have a Dart SDK. |
| + dart_sdk = args.dart_sdk |
| + if dart_sdk is None: |
| + dart_sdk = os.environ.get('DART_SDK') |
| + if dart_sdk is None: |
| + print "Pass --dart-sdk, or define the DART_SDK environment variable" |
| + return 1 |
| + |
| + result = analyze_entrypoints(dart_sdk, args.package_root, |
| + entrypoint_targets) |
| + if result != 0: |
| + return result |
| + |
| + # Write stamp file. |
| + with open(args.stamp_file, 'w'): |
| + pass |
| + |
| + return 0 |
| if __name__ == '__main__': |
| - sys.exit(main()) |
| + sys.exit(main()) |