| #!/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)) |