blob: 5e663b363d156a1c7e29f359501699fce1e78b8c [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:
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -07007# gclient-new-workdir.py [options] <repository> <new_workdir>
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +00008#
9
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070010import argparse
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000011import os
12import shutil
13import subprocess
14import sys
15
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 parse_options():
20 if sys.platform == 'win32':
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070021 print('ERROR: This script cannot run on Windows because it uses symlinks.')
22 sys.exit(1)
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000023
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070024 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.orgf13c2052013-11-15 20:09:23 +000031
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070032 if not os.path.exists(args.repository):
33 parser.error('Repository "%s" does not exist.' % args.repository)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000034
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070035 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.com62d817c2013-11-05 15:18:13 +000038
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070039 if os.path.exists(args.new_workdir):
40 parser.error('New workdir "%s" already exists.' % args.new_workdir)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000041
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070042 return args
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000043
44
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000045def main():
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070046 args = parse_options()
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000047
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070048 gclient = os.path.join(args.repository, '.gclient')
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000049
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070050 os.makedirs(args.new_workdir)
51 os.symlink(gclient, os.path.join(args.new_workdir, '.gclient'))
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000052
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070053 for root, dirs, _ in os.walk(args.repository):
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000054 if '.git' in dirs:
Wei-Yin Chen (陳威尹)05203492017-05-11 00:07:53 -070055 workdir = root.replace(args.repository, args.new_workdir, 1)
sammc@chromium.org900a33f2015-09-29 06:57:09 +000056 print('Creating: %s' % workdir)
57 git_common.make_workdir(os.path.join(root, '.git'),
58 os.path.join(workdir, '.git'))
agrieve@chromium.orgbb54dd42015-11-20 01:07:50 +000059 subprocess.check_call(['git', 'checkout', '-f'], cwd=workdir)
adam.treat@samsung.com62d817c2013-11-05 15:18:13 +000060
61
62if __name__ == '__main__':
pgervais@chromium.orgf13c2052013-11-15 20:09:23 +000063 sys.exit(main())