| Index: third_party/mojo/src/mojo/public/tools/dart_pkg.py
|
| diff --git a/third_party/mojo/src/mojo/public/tools/dart_pkg.py b/third_party/mojo/src/mojo/public/tools/dart_pkg.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..58725148d08edd1ece404fe42b609d7df24e37d8
|
| --- /dev/null
|
| +++ b/third_party/mojo/src/mojo/public/tools/dart_pkg.py
|
| @@ -0,0 +1,242 @@
|
| +#!/usr/bin/env python
|
| +#
|
| +# Copyright 2015 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.
|
| +
|
| +"""Utility for dart_pkg and dart_pkg_app rules"""
|
| +
|
| +import argparse
|
| +import errno
|
| +import os
|
| +import shutil
|
| +import sys
|
| +
|
| +# Disable lint check for finding modules:
|
| +# pylint: disable=F0401
|
| +
|
| +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
| + "bindings/pylib"))
|
| +
|
| +from mojom.parse.parser import Parse
|
| +from mojom.parse.translate import Translate
|
| +
|
| +USE_LINKS = sys.platform != "win32"
|
| +
|
| +
|
| +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')
|
| +
|
| +
|
| +def dart_filter(path):
|
| + 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'
|
| +
|
| +
|
| +def ensure_dir_exists(path):
|
| + if not os.path.exists(path):
|
| + os.makedirs(path)
|
| +
|
| +
|
| +def has_pubspec_yaml(paths):
|
| + 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
|
| +
|
| +
|
| +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
|
| +
|
| + 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 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)
|
| +
|
| +
|
| +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)
|
| +
|
| +
|
| +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
|
| +
|
| +
|
| +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)
|
| +
|
| +
|
| +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)
|
| +
|
| +
|
| +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)
|
| +
|
| +
|
| +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=[])
|
| + args = parser.parse_args()
|
| +
|
| + # We must have a pubspec.yaml.
|
| + assert has_pubspec_yaml(args.package_sources)
|
| +
|
| + # Copy or symlink package sources into pkg directory.
|
| + target_dir = os.path.join(args.pkg_directory, args.package_name)
|
| + 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)
|
| +
|
| + lib_path = os.path.join(target_dir, "lib")
|
| + lib_mojom_path = os.path.join(lib_path, "mojom")
|
| +
|
| + # Copy mojom sources
|
| + for mojom_source_path in args.mojom_sources:
|
| + path = mojom_path(mojom_source_path)
|
| + copy(mojom_source_path, os.path.join(lib_mojom_path, path))
|
| +
|
| + # 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
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(main())
|
|
|