mirror of
https://github.com/dart-lang/sdk
synced 2024-09-21 05:51:28 +00:00
9ae1265ff5
Tracking bug: https://github.com/dart-lang/sdk/issues/24731 Note, dartium build changes are in a separate CL: https://codereview.chromium.org/1453413006/ Some tests had to be disabled for want of mockito in the SDK; tracking their reimplementation is here: https://github.com/dart-lang/sdk/issues/24994 BUG=24731 R=whesse@google.com Review URL: https://codereview.chromium.org/1459683003 .
129 lines
4 KiB
Python
129 lines
4 KiB
Python
#!/usr/bin/env python
|
|
# Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
|
|
|
|
"""Tool for creating symlinks from SOURCES to TARGET.
|
|
|
|
For each SOURCE in SOURCES create a link from SOURCE to TARGET. If a
|
|
SOURCE ends with .../lib, the lib suffix is ignored when determining
|
|
the name of the target link.
|
|
|
|
If a SOURCE contains ":", the left side is the path and the right side is the
|
|
name of the package symlink.
|
|
|
|
Before creating any links, the old entries of the TARGET directory will be
|
|
removed.
|
|
|
|
Usage:
|
|
python tools/make_links.py OPTIONS TARGET SOURCES...
|
|
|
|
"""
|
|
|
|
import optparse
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import utils
|
|
|
|
# Useful messages when we find orphaned checkouts.
|
|
old_directories = {
|
|
'package_config': 'Please remove third_party/pkg/package_config.',
|
|
'analyzer_cli': 'Please remove third_party/pkg/analyzer_cli.'}
|
|
|
|
def get_options():
|
|
result = optparse.OptionParser()
|
|
result.add_option("--timestamp_file", "",
|
|
help='Create a timestamp file when done creating the links.',
|
|
default='')
|
|
return result.parse_args()
|
|
|
|
def make_link(source, target, orig_source):
|
|
if os.path.islink(target):
|
|
print 'Removing %s' % target
|
|
sys.stdout.flush()
|
|
os.unlink(target)
|
|
|
|
if os.path.isdir(target):
|
|
print 'Removing %s' % target
|
|
sys.stdout.flush()
|
|
os.rmdir(target)
|
|
|
|
if os.path.isfile(orig_source):
|
|
print 'Copying file from %s to %s' % (orig_source, target)
|
|
sys.stdout.flush()
|
|
shutil.copyfile(orig_source, target)
|
|
return 0
|
|
else:
|
|
print 'Creating link from %s to %s' % (source, target)
|
|
sys.stdout.flush()
|
|
|
|
if utils.GuessOS() == 'win32':
|
|
return subprocess.call(['mklink', '/j', target, source], shell=True)
|
|
else:
|
|
return subprocess.call(['ln', '-s', source, target])
|
|
|
|
def create_timestamp_file(options):
|
|
if options.timestamp_file != '':
|
|
dir_name = os.path.dirname(options.timestamp_file)
|
|
if not os.path.exists(dir_name):
|
|
os.mkdir(dir_name)
|
|
open(options.timestamp_file, 'w').close()
|
|
|
|
|
|
def main(argv):
|
|
(options, args) = get_options()
|
|
target = os.path.relpath(args[0])
|
|
if os.path.exists(target):
|
|
# If the packages directory already exists, delete the current links inside
|
|
# it. This is necessary, otherwise we can end up having links in there
|
|
# pointing to directories which no longer exist (on incremental builds).
|
|
for link in os.listdir(target):
|
|
full_link = os.path.join(target, link)
|
|
if os.path.isdir(full_link) and utils.IsWindows():
|
|
# It seems like python on Windows is treating pseudo symlinks to
|
|
# directories as directories.
|
|
os.rmdir(full_link)
|
|
else:
|
|
os.remove(full_link)
|
|
else:
|
|
os.makedirs(target)
|
|
linked_names = {};
|
|
for source in args[1:]:
|
|
# Assume the source directory is named ".../NAME/lib".
|
|
split = source.split(':')
|
|
name = None
|
|
if len(split) == 2: (source, name) = split
|
|
|
|
(path, lib) = os.path.split(source)
|
|
if lib != 'lib':
|
|
path = source
|
|
# Remove any additional path components preceding NAME, if one wasn't
|
|
# specified explicitly.
|
|
if not name: (_, name) = os.path.split(path)
|
|
# We have an issue with left-behind checkouts in third_party/pkg and
|
|
# third_party/pkg_tested when we move entries in DEPS. This reports them.
|
|
if name in linked_names:
|
|
print 'Duplicate directory %s is linked to both %s and %s.' % (
|
|
name, linked_names[name], path)
|
|
if name in old_directories:
|
|
print old_directories[name]
|
|
return 1
|
|
linked_names[name] = path
|
|
orig_source = source
|
|
if utils.GuessOS() == 'win32':
|
|
source = os.path.relpath(source)
|
|
else:
|
|
source = os.path.relpath(source, start=target)
|
|
exit_code = make_link(source, os.path.join(target, name), orig_source)
|
|
if exit_code != 0:
|
|
return exit_code
|
|
create_timestamp_file(options)
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv))
|