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: |
| 7 | # gclient-new-workdir.py <repository> <new_workdir> [<branch>] |
| 8 | # |
| 9 | |
| 10 | import os |
| 11 | import shutil |
| 12 | import subprocess |
| 13 | import sys |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 14 | import textwrap |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 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 print_err(msg): |
| 20 | print >> sys.stderr, msg |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 21 | |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 22 | |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 23 | def usage(msg=None): |
| 24 | |
| 25 | if msg is not None: |
| 26 | print_err('\n' + textwrap.dedent(msg) + '\n') |
| 27 | usage_msg = 'Run without arguments to get usage help.' |
| 28 | else: |
| 29 | usage_msg = '''\ |
| 30 | usage: %s <repository> <new_workdir> |
| 31 | |
| 32 | Clone an existing gclient directory, taking care of all sub-repositories |
| 33 | Works similarly to 'git new-workdir'. |
| 34 | |
| 35 | <repository> should contain a .gclient file |
| 36 | <new_workdir> must not exist |
sammc@chromium.org | 900a33f | 2015-09-29 06:57:09 +0000 | [diff] [blame] | 37 | '''% os.path.basename(sys.argv[0]) |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 38 | |
| 39 | print_err(textwrap.dedent(usage_msg)) |
| 40 | sys.exit(1) |
| 41 | |
| 42 | |
| 43 | def parse_options(): |
| 44 | if sys.platform == 'win32': |
| 45 | usage('This script cannot run on Windows because it uses symlinks.') |
| 46 | |
| 47 | if len(sys.argv) != 3: |
| 48 | usage() |
| 49 | |
| 50 | repository = os.path.abspath(sys.argv[1]) |
| 51 | new_workdir = sys.argv[2] |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 52 | |
| 53 | if not os.path.exists(repository): |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 54 | usage('Repository does not exist: ' + repository) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 55 | |
| 56 | if os.path.exists(new_workdir): |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 57 | usage('New workdir already exists: ' + new_workdir) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 58 | |
| 59 | return repository, new_workdir |
| 60 | |
| 61 | |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 62 | def main(): |
| 63 | repository, new_workdir = parse_options() |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 64 | |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 65 | gclient = os.path.join(repository, '.gclient') |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 66 | if not os.path.exists(gclient): |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 67 | print_err('No .gclient file: ' + gclient) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 68 | |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 69 | os.makedirs(new_workdir) |
| 70 | os.symlink(gclient, os.path.join(new_workdir, '.gclient')) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 71 | |
| 72 | for root, dirs, _ in os.walk(repository): |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 73 | if '.git' in dirs: |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 74 | workdir = root.replace(repository, new_workdir, 1) |
sammc@chromium.org | 900a33f | 2015-09-29 06:57:09 +0000 | [diff] [blame] | 75 | print('Creating: %s' % workdir) |
| 76 | git_common.make_workdir(os.path.join(root, '.git'), |
| 77 | os.path.join(workdir, '.git')) |
agrieve@chromium.org | bb54dd4 | 2015-11-20 01:07:50 +0000 | [diff] [blame^] | 78 | subprocess.check_call(['git', 'checkout', '-f'], cwd=workdir) |
adam.treat@samsung.com | 62d817c | 2013-11-05 15:18:13 +0000 | [diff] [blame] | 79 | |
| 80 | |
| 81 | if __name__ == '__main__': |
pgervais@chromium.org | f13c205 | 2013-11-15 20:09:23 +0000 | [diff] [blame] | 82 | sys.exit(main()) |