blob: 5062053256e326e9c06f9ae97bcd1f7b4adb22aa [file] [log] [blame]
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +00001#!/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
10import os
11import shutil
12import subprocess
13import sys
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000014import textwrap
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000015
sammc@chromium.org900a33f2015-09-29 06:57:09 +000016import git_common
17
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000018
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000019def print_err(msg):
20 print >> sys.stderr, msg
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000021
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000022
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000023def 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.org900a33f2015-09-29 06:57:09 +000037 '''% os.path.basename(sys.argv[0])
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000038
39 print_err(textwrap.dedent(usage_msg))
40 sys.exit(1)
41
42
43def 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.com62d817c2013-11-05 15:18:13 +000052
53 if not os.path.exists(repository):
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000054 usage('Repository does not exist: ' + repository)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000055
56 if os.path.exists(new_workdir):
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000057 usage('New workdir already exists: ' + new_workdir)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000058
59 return repository, new_workdir
60
61
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000062def main():
63 repository, new_workdir = parse_options()
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000064
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000065 gclient = os.path.join(repository, '.gclient')
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000066 if not os.path.exists(gclient):
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000067 print_err('No .gclient file: ' + gclient)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000068
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000069 os.makedirs(new_workdir)
70 os.symlink(gclient, os.path.join(new_workdir, '.gclient'))
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000071
72 for root, dirs, _ in os.walk(repository):
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000073 if '.git' in dirs:
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000074 workdir = root.replace(repository, new_workdir, 1)
sammc@chromium.org900a33f2015-09-29 06:57:09 +000075 print('Creating: %s' % workdir)
76 git_common.make_workdir(os.path.join(root, '.git'),
77 os.path.join(workdir, '.git'))
agrieve@chromium.orgbb54dd42015-11-20 01:07:50 +000078 subprocess.check_call(['git', 'checkout', '-f'], cwd=workdir)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000079
80
81if __name__ == '__main__':
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000082 sys.exit(main())