Procházet zdrojové kódy

Add a new gclient-new-workdir script which clones an existing gclient working directory much like git-new-workdir, but takes into account all sub projects as well.

BUG=none

Review URL: https://codereview.chromium.org/52663008

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@232992 0039d316-1c4b-4281-b951-d872f2087c98
adam.treat@samsung.com před 11 roky
rodič
revize
62d817cde6
1 změnil soubory, kde provedl 95 přidání a 0 odebrání
  1. 95 0
      gclient-new-workdir.py

+ 95 - 0
gclient-new-workdir.py

@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+# Copyright 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))