Merge branch 'nd/multiple-work-trees'

A replacement for contrib/workdir/git-new-workdir that does not
rely on symbolic links and make sharing of objects and refs safer
by making the borrowee and borrowers aware of each other.

* nd/multiple-work-trees: (41 commits)
  prune --worktrees: fix expire vs worktree existence condition
  t1501: fix test with split index
  t2026: fix broken &&-chain
  t2026 needs procondition SANITY
  git-checkout.txt: a note about multiple checkout support for submodules
  checkout: add --ignore-other-wortrees
  checkout: pass whole struct to parse_branchname_arg instead of individual flags
  git-common-dir: make "modules/" per-working-directory directory
  checkout: do not fail if target is an empty directory
  t2025: add a test to make sure grafts is working from a linked checkout
  checkout: don't require a work tree when checking out into a new one
  git_path(): keep "info/sparse-checkout" per work-tree
  count-objects: report unused files in $GIT_DIR/worktrees/...
  gc: support prune --worktrees
  gc: factor out gc.pruneexpire parsing code
  gc: style change -- no SP before closing parenthesis
  checkout: clean up half-prepared directories in --to mode
  checkout: reject if the branch is already checked out elsewhere
  prune: strategies for linked checkouts
  checkout: support checking out into a new working directory
  ...
This commit is contained in:
Junio C Hamano
2015-05-11 14:23:39 -07:00
52 changed files with 1394 additions and 253 deletions

View File

@ -92,8 +92,9 @@ static char *work_tree;
static const char *namespace;
static size_t namespace_len;
static const char *git_dir;
static const char *git_dir, *git_common_dir;
static char *git_object_dir, *git_index_file, *git_graft_file;
int git_db_env, git_index_env, git_graft_env, git_common_dir_env;
/*
* Repository-local GIT_* environment variables; see cache.h for details.
@ -111,6 +112,7 @@ const char * const local_repo_env[] = {
NO_REPLACE_OBJECTS_ENVIRONMENT,
GIT_PREFIX_ENVIRONMENT,
GIT_SHALLOW_FILE_ENVIRONMENT,
GIT_COMMON_DIR_ENVIRONMENT,
NULL
};
@ -135,14 +137,23 @@ static char *expand_namespace(const char *raw_namespace)
return strbuf_detach(&buf, NULL);
}
static char *git_path_from_env(const char *envvar, const char *path)
static char *git_path_from_env(const char *envvar, const char *git_dir,
const char *path, int *fromenv)
{
const char *value = getenv(envvar);
return value ? xstrdup(value) : git_pathdup("%s", path);
if (!value) {
char *buf = xmalloc(strlen(git_dir) + strlen(path) + 2);
sprintf(buf, "%s/%s", git_dir, path);
return buf;
}
if (fromenv)
*fromenv = 1;
return xstrdup(value);
}
static void setup_git_env(void)
{
struct strbuf sb = STRBUF_INIT;
const char *gitfile;
const char *shallow_file;
@ -151,9 +162,15 @@ static void setup_git_env(void)
git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
gitfile = read_gitfile(git_dir);
git_dir = xstrdup(gitfile ? gitfile : git_dir);
git_object_dir = git_path_from_env(DB_ENVIRONMENT, "objects");
git_index_file = git_path_from_env(INDEX_ENVIRONMENT, "index");
git_graft_file = git_path_from_env(GRAFT_ENVIRONMENT, "info/grafts");
if (get_common_dir(&sb, git_dir))
git_common_dir_env = 1;
git_common_dir = strbuf_detach(&sb, NULL);
git_object_dir = git_path_from_env(DB_ENVIRONMENT, git_common_dir,
"objects", &git_db_env);
git_index_file = git_path_from_env(INDEX_ENVIRONMENT, git_dir,
"index", &git_index_env);
git_graft_file = git_path_from_env(GRAFT_ENVIRONMENT, git_common_dir,
"info/grafts", &git_graft_env);
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
check_replace_refs = 0;
namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
@ -176,6 +193,11 @@ const char *get_git_dir(void)
return git_dir;
}
const char *get_git_common_dir(void)
{
return git_common_dir;
}
const char *get_git_namespace(void)
{
if (!namespace)