diff --git a/gclient-new-workdir.py b/gclient-new-workdir.py new file mode 100755 index 0000000000..91ba35b9ef --- /dev/null +++ b/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 [] +# + +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 ") + 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))