|  | #!/usr/bin/env python | 
|  | # Copyright (c) 2013 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. | 
|  | """Make a symlink and optionally touch a file (to handle dependencies).""" | 
|  | import errno | 
|  | import optparse | 
|  | import os.path | 
|  | import shutil | 
|  | import sys | 
|  | def Main(argv): | 
|  | parser = optparse.OptionParser() | 
|  | parser.add_option('-f', '--force', action='store_true') | 
|  | parser.add_option('--touch') | 
|  | options, args = parser.parse_args(argv[1:]) | 
|  | if len(args) < 2: | 
|  | parser.error('at least two arguments required.') | 
|  | target = args[-1] | 
|  | sources = args[:-1] | 
|  | for s in sources: | 
|  | t = os.path.join(target, os.path.basename(s)) | 
|  | if len(sources) == 1 and not os.path.isdir(target): | 
|  | t = target | 
|  | try: | 
|  | os.symlink(s, t) | 
|  | except OSError, e: | 
|  | if e.errno == errno.EEXIST and options.force: | 
|  | if os.path.isdir(t): | 
|  | shutil.rmtree(t, ignore_errors=True) | 
|  | else: | 
|  | os.remove(t) | 
|  | os.symlink(s, t) | 
|  | else: | 
|  | raise | 
|  | if options.touch: | 
|  | with open(options.touch, 'w') as f: | 
|  | pass | 
|  | if __name__ == '__main__': | 
|  | sys.exit(Main(sys.argv)) |