adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | # |
| 6 | # Usage: |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 7 | # gclient-new-workdir.py [options] <repository> <new_workdir> |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 8 | # |
| 9 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 10 | import argparse |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 11 | import os |
| 12 | import shutil |
| 13 | import subprocess |
| 14 | import sys |
| 15 | |
sammc@chromium.org | 900a33f | 2015-09-29 06:57:09 +0000 | [diff] [blame] | 16 | import git_common |
| 17 | |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 18 | |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 19 | def parse_options(): |
| 20 | if sys.platform == 'win32': |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 21 | print('ERROR: This script cannot run on Windows because it uses symlinks.') |
| 22 | sys.exit(1) |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 23 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 24 | parser = argparse.ArgumentParser(description='''\ |
| 25 | Clone an existing gclient directory, taking care of all sub-repositories. |
| 26 | Works similarly to 'git new-workdir'.''') |
| 27 | parser.add_argument('repository', type=os.path.abspath, |
| 28 | help='should contain a .gclient file') |
| 29 | parser.add_argument('new_workdir', help='must not exist') |
| 30 | args = parser.parse_args() |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 31 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 32 | if not os.path.exists(args.repository): |
| 33 | parser.error('Repository "%s" does not exist.' % args.repository) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 34 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 35 | gclient = os.path.join(args.repository, '.gclient') |
| 36 | if not os.path.exists(gclient): |
| 37 | parser.error('No .gclient file at "%s".' % gclient) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 38 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 39 | if os.path.exists(args.new_workdir): |
| 40 | parser.error('New workdir "%s" already exists.' % args.new_workdir) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 41 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 42 | return args |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 43 | |
| 44 | |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 45 | def main(): |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 46 | args = parse_options() |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 47 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 48 | gclient = os.path.join(args.repository, '.gclient') |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 49 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 50 | os.makedirs(args.new_workdir) |
| 51 | os.symlink(gclient, os.path.join(args.new_workdir, '.gclient')) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 52 | |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 53 | for root, dirs, _ in os.walk(args.repository): |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 54 | if '.git' in dirs: |
Wei-Yin Chen (陳威尹) | 0520349 | 2017-05-11 00:07:53 -0700 | [diff] [blame^] | 55 | workdir = root.replace(args.repository, args.new_workdir, 1) |
sammc@chromium.org | 900a33f | 2015-09-29 06:57:09 +0000 | [diff] [blame] | 56 | print('Creating: %s' % workdir) |
| 57 | git_common.make_workdir(os.path.join(root, '.git'), |
| 58 | os.path.join(workdir, '.git')) |
agrieve@chromium.org | bb54dd4 | 2015-11-20 01:07:50 +0000 | [diff] [blame] | 59 | subprocess.check_call(['git', 'checkout', '-f'], cwd=workdir) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 60 | |
| 61 | |
| 62 | if __name__ == '__main__': |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 63 | sys.exit(main()) |