Index: gclient-new-workdir.py |
diff --git a/gclient-new-workdir.py b/gclient-new-workdir.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..ddd55342865f5646a6032695fa6ede83c2a7a14a |
--- /dev/null |
+++ b/gclient-new-workdir.py |
@@ -0,0 +1,95 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+# |
+# Usage: |
+# gclient-new-workdir.py <repository> <new_workdir> [<branch>] |
+# |
+ |
+import os |
+import shutil |
+import subprocess |
+import sys |
+ |
+ |
+def parse_options(argv): |
+ assert not sys.platform.startswith("win") |
+ |
+ if len(argv) != 3: |
+ print("usage: gclient-new-workdir.py <repository> <new_workdir>") |
+ sys.exit(1) |
+ |
+ repository = argv[1] |
+ new_workdir = argv[2] |
+ |
+ if not os.path.exists(repository): |
+ print("Repository does not exist: " + repository) |
+ sys.exit(1) |
+ |
+ if os.path.exists(new_workdir): |
+ print("New workdir already exists: " + new_workdir) |
+ sys.exit(1) |
+ |
+ return repository, new_workdir |
+ |
+ |
+def main(argv): |
+ repository, new_workdir = parse_options(argv) |
+ |
+ 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) |
+ |
+ os.mkdir(new_workdir) |
+ os.symlink(gclient, os.path.join(new_workdir, ".gclient")) |
+ os.symlink(gclient_entries, os.path.join(new_workdir, ".gclient_entries")) |
+ |
+ for root, dirs, _ in os.walk(repository): |
+ if ".git" in dirs: |
+ workdir = root.replace(repository, new_workdir, 1) |
+ make_workdir(os.path.join(root, ".git"), |
+ os.path.join(workdir, ".git")) |
+ |
+ |
+def make_workdir(repository, 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" |
+ ] |
+ |
+ 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")) |
+ |
+ |
+def make_symlink(repository, new_workdir, link): |
+ if not os.path.exists(os.path.join(repository, link)): |
+ return |
+ link_dir = os.path.dirname(os.path.join(new_workdir, link)) |
+ if not os.path.exists(link_dir): |
+ os.makedirs(link_dir) |
+ os.symlink(os.path.join(repository, link), os.path.join(new_workdir, link)) |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv)) |