Index: gclient-new-workdir.py |
diff --git a/gclient-new-workdir.py b/gclient-new-workdir.py |
index 91ba35b9efbd224ee6995770e1ccc06be0b7cd5f..a9117712286c91e456713e01c3c4b38fdec77ee5 100755 |
--- a/gclient-new-workdir.py |
+++ b/gclient-new-workdir.py |
@@ -11,24 +11,41 @@ import os |
import shutil |
import subprocess |
import sys |
+import textwrap |
+ |
+ |
+def print_err(msg): |
+ print >> sys.stderr, msg |
def parse_options(argv): |
- assert not sys.platform.startswith("win") |
+ if sys.platform == 'win32': |
+ print_err( |
+ 'This script cannot run on Windows because it uses symlinks.') |
+ sys.exit(1) |
if len(argv) != 3: |
- print("usage: gclient-new-workdir.py <repository> <new_workdir>") |
+ usage_msg = '''\ |
+ usage: %s <repository> <new_workdir> |
+ |
+ Clone an existing gclient directory, taking care of all sub-repositories |
+ Works similarly to 'git new-workdir'. |
+ |
+ <repository> must be a absolute path |
+ <new_workdir> must not exist |
+ ''' % os.path.basename(argv[0]) |
+ print(textwrap.dedent(usage_msg)) |
sys.exit(1) |
iannucci
2013/11/13 20:29:10
move this whole if statement body into a usage() f
pgervais
2013/11/13 23:27:54
It depends if execution of usage() is triggered by
|
- repository = argv[1] |
+ repository = os.path.abspath(argv[1]) |
new_workdir = argv[2] |
if not os.path.exists(repository): |
- print("Repository does not exist: " + repository) |
+ print_err('Repository does not exist: ' + repository) |
sys.exit(1) |
iannucci
2013/11/13 20:29:10
then these can become usage(...) calls
|
if os.path.exists(new_workdir): |
- print("New workdir already exists: " + new_workdir) |
+ print_err('New workdir already exists: ' + new_workdir) |
sys.exit(1) |
return repository, new_workdir |
@@ -37,49 +54,44 @@ def parse_options(argv): |
def main(argv): |
repository, new_workdir = parse_options(argv) |
- gclient = os.path.join(repository, ".gclient") |
+ gclient = os.path.join(repository, '.gclient') |
if not os.path.exists(gclient): |
- print("No .gclient file: " + gclient) |
- |
- gclient_entries = os.path.join(repository, ".gclient_entries") |
- if not os.path.exists(gclient_entries): |
- print("No .gclient_entries file: " + gclient_entries) |
+ print_err('No .gclient file: ' + gclient) |
- os.mkdir(new_workdir) |
- os.symlink(gclient, os.path.join(new_workdir, ".gclient")) |
- os.symlink(gclient_entries, os.path.join(new_workdir, ".gclient_entries")) |
+ os.makedirs(new_workdir) |
+ os.symlink(gclient, os.path.join(new_workdir, '.gclient')) |
iannucci
2013/11/13 20:29:10
I'm assuming you tried it out and this does, in fa
pgervais
2013/11/13 23:27:54
Yes it does (on gclient sync at least)
|
for root, dirs, _ in os.walk(repository): |
- if ".git" in dirs: |
+ if '.git' in dirs: |
workdir = root.replace(repository, new_workdir, 1) |
- make_workdir(os.path.join(root, ".git"), |
- os.path.join(workdir, ".git")) |
+ make_workdir(os.path.join(root, '.git'), |
+ os.path.join(workdir, '.git')) |
def make_workdir(repository, new_workdir): |
- print("Creating: " + new_workdir) |
+ print('Creating: ' + new_workdir) |
os.makedirs(new_workdir) |
GIT_DIRECTORY_WHITELIST = [ |
- "config", |
- "info", |
- "hooks", |
- "logs/refs", |
- "objects", |
- "packed-refs", |
- "refs", |
- "remotes", |
- "rr-cache", |
- "svn" |
+ 'config', |
+ 'info', |
+ 'hooks', |
+ 'logs/refs', |
+ 'objects', |
+ 'packed-refs', |
+ 'refs', |
+ 'remotes', |
+ 'rr-cache', |
+ 'svn' |
] |
for entry in GIT_DIRECTORY_WHITELIST: |
make_symlink(repository, new_workdir, entry) |
- shutil.copy2(os.path.join(repository, "HEAD"), |
- os.path.join(new_workdir, "HEAD")) |
- subprocess.check_call(["git", "checkout", "-f"], |
- cwd=new_workdir.rstrip(".git")) |
+ shutil.copy2(os.path.join(repository, 'HEAD'), |
+ os.path.join(new_workdir, 'HEAD')) |
+ subprocess.check_call(['git', 'checkout', '-f'], |
+ cwd=new_workdir.rstrip('.git')) |
def make_symlink(repository, new_workdir, link): |