Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: gclient-new-workdir.py

Issue 1342383002: Add a git-drover. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | git-drover » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2013 The Chromium Authors. All rights reserved. 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 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 # 5 #
6 # Usage: 6 # Usage:
7 # gclient-new-workdir.py <repository> <new_workdir> [<branch>] 7 # gclient-new-workdir.py <repository> <new_workdir> [<branch>]
8 # 8 #
9 9
10 import os 10 import os
11 import shutil 11 import shutil
12 import subprocess 12 import subprocess
13 import sys 13 import sys
14 import textwrap 14 import textwrap
15 15
16 import git_common
17
16 18
17 def print_err(msg): 19 def print_err(msg):
18 print >> sys.stderr, msg 20 print >> sys.stderr, msg
19 21
20 22
21 def usage(msg=None): 23 def usage(msg=None):
22 24
23 if msg is not None: 25 if msg is not None:
24 print_err('\n' + textwrap.dedent(msg) + '\n') 26 print_err('\n' + textwrap.dedent(msg) + '\n')
25 usage_msg = 'Run without arguments to get usage help.' 27 usage_msg = 'Run without arguments to get usage help.'
26 else: 28 else:
27 usage_msg = '''\ 29 usage_msg = '''\
28 usage: %s <repository> <new_workdir> 30 usage: %s <repository> <new_workdir>
29 31
30 Clone an existing gclient directory, taking care of all sub-repositories 32 Clone an existing gclient directory, taking care of all sub-repositories
31 Works similarly to 'git new-workdir'. 33 Works similarly to 'git new-workdir'.
32 34
33 <repository> should contain a .gclient file 35 <repository> should contain a .gclient file
34 <new_workdir> must not exist 36 <new_workdir> must not exist
35 ''' % os.path.basename(sys.argv[0]) 37 '''% os.path.basename(sys.argv[0])
36 38
37 print_err(textwrap.dedent(usage_msg)) 39 print_err(textwrap.dedent(usage_msg))
38 sys.exit(1) 40 sys.exit(1)
39 41
40 42
41 def parse_options(): 43 def parse_options():
42 if sys.platform == 'win32': 44 if sys.platform == 'win32':
43 usage('This script cannot run on Windows because it uses symlinks.') 45 usage('This script cannot run on Windows because it uses symlinks.')
44 46
45 if len(sys.argv) != 3: 47 if len(sys.argv) != 3:
(...skipping 17 matching lines...) Expand all
63 gclient = os.path.join(repository, '.gclient') 65 gclient = os.path.join(repository, '.gclient')
64 if not os.path.exists(gclient): 66 if not os.path.exists(gclient):
65 print_err('No .gclient file: ' + gclient) 67 print_err('No .gclient file: ' + gclient)
66 68
67 os.makedirs(new_workdir) 69 os.makedirs(new_workdir)
68 os.symlink(gclient, os.path.join(new_workdir, '.gclient')) 70 os.symlink(gclient, os.path.join(new_workdir, '.gclient'))
69 71
70 for root, dirs, _ in os.walk(repository): 72 for root, dirs, _ in os.walk(repository):
71 if '.git' in dirs: 73 if '.git' in dirs:
72 workdir = root.replace(repository, new_workdir, 1) 74 workdir = root.replace(repository, new_workdir, 1)
73 make_workdir(os.path.join(root, '.git'), 75 print('Creating: %s' % workdir)
74 os.path.join(workdir, '.git')) 76 git_common.make_workdir(os.path.join(root, '.git'),
75 77 os.path.join(workdir, '.git'))
76 78 subprocess.check_call(['git', 'checkout', '-f'],
77 def make_workdir(repository, new_workdir): 79 cwd=new_workdir.rstrip('.git'))
78 print('Creating: ' + new_workdir)
79 os.makedirs(new_workdir)
80
81 GIT_DIRECTORY_WHITELIST = [
82 'config',
83 'info',
84 'hooks',
85 'logs/refs',
86 'objects',
87 'packed-refs',
88 'refs',
89 'remotes',
90 'rr-cache',
91 'svn'
92 ]
93
94 for entry in GIT_DIRECTORY_WHITELIST:
95 make_symlink(repository, new_workdir, entry)
96
97 shutil.copy2(os.path.join(repository, 'HEAD'),
98 os.path.join(new_workdir, 'HEAD'))
99 subprocess.check_call(['git', 'checkout', '-f'],
100 cwd=new_workdir.rstrip('.git'))
101
102
103 def make_symlink(repository, new_workdir, link):
104 if not os.path.exists(os.path.join(repository, link)):
105 return
106 link_dir = os.path.dirname(os.path.join(new_workdir, link))
107 if not os.path.exists(link_dir):
108 os.makedirs(link_dir)
109 os.symlink(os.path.join(repository, link), os.path.join(new_workdir, link))
110 80
111 81
112 if __name__ == '__main__': 82 if __name__ == '__main__':
113 sys.exit(main()) 83 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | git-drover » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698