Merge branch 'jn/setup-fixes'

* jn/setup-fixes:
  t1510: fix typo in the comment of a test
  Documentation updates for 'GIT_WORK_TREE without GIT_DIR' historical usecase
  Subject: setup: officially support --work-tree without --git-dir
  tests: compress the setup tests
  tests: cosmetic improvements to the repo-setup test
  t/README: hint about using $(pwd) rather than $PWD in tests
  Fix expected values of setup tests on Windows
This commit is contained in:
Junio C Hamano 2011-01-24 10:53:09 -08:00
commit 0efbb7d9f4
6 changed files with 726 additions and 4453 deletions

View File

@ -317,17 +317,26 @@ false), while all other repositories are assumed to be bare (bare
= true). = true).
core.worktree:: core.worktree::
Set the path to the working tree. The value will not be Set the path to the root of the working tree.
used in combination with repositories found automatically in
a .git directory (i.e. $GIT_DIR is not set).
This can be overridden by the GIT_WORK_TREE environment This can be overridden by the GIT_WORK_TREE environment
variable and the '--work-tree' command line option. It can be variable and the '--work-tree' command line option.
an absolute path or relative path to the directory specified by The value can an absolute path or relative to the path to
--git-dir or GIT_DIR. the .git directory, which is either specified by --git-dir
Note: If --git-dir or GIT_DIR are specified but none of or GIT_DIR, or automatically discovered.
If --git-dir or GIT_DIR is specified but none of
--work-tree, GIT_WORK_TREE and core.worktree is specified, --work-tree, GIT_WORK_TREE and core.worktree is specified,
the current working directory is regarded as the top directory the current working directory is regarded as the top level
of your working tree. of your working tree.
+
Note that this variable is honored even when set in a configuration
file in a ".git" subdirectory of a directory and its value differs
from the latter directory (e.g. "/path/to/.git/config" has
core.worktree set to "/different/path"), which is most likely a
misconfiguration. Running git commands in the "/path/to" directory will
still use "/different/path" as the root of the work tree and can cause
confusion unless you know what you are doing (e.g. you are creating a
read-only snapshot of the same index to a location different from the
repository's usual working tree).
core.logAllRefUpdates:: core.logAllRefUpdates::
Enable the reflog. Updates to a ref <ref> is logged to the file Enable the reflog. Updates to a ref <ref> is logged to the file

View File

@ -291,17 +291,12 @@ help ...`.
path or relative path to current working directory. path or relative path to current working directory.
--work-tree=<path>:: --work-tree=<path>::
Set the path to the working tree. The value will not be Set the path to the working tree. It can be an absolute path
used in combination with repositories found automatically in or a path relative to the current working directory.
a .git directory (i.e. $GIT_DIR is not set).
This can also be controlled by setting the GIT_WORK_TREE This can also be controlled by setting the GIT_WORK_TREE
environment variable and the core.worktree configuration environment variable and the core.worktree configuration
variable. It can be an absolute path or relative path to variable (see core.worktree in linkgit:git-config[1] for a
current working directory. more detailed discussion).
Note: If --git-dir or GIT_DIR are specified but none of
--work-tree, GIT_WORK_TREE and core.worktree is specified,
the current working directory is regarded as the top directory
of your working tree.
--bare:: --bare::
Treat the repository as a bare repository. If GIT_DIR Treat the repository as a bare repository. If GIT_DIR

19
setup.c
View File

@ -411,6 +411,15 @@ static const char *setup_discovered_git_dir(const char *gitdir,
if (check_repository_format_gently(gitdir, nongit_ok)) if (check_repository_format_gently(gitdir, nongit_ok))
return NULL; return NULL;
/* --work-tree is set without --git-dir; use discovered one */
if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
if (offset != len && !is_absolute_path(gitdir))
gitdir = xstrdup(make_absolute_path(gitdir));
if (chdir(cwd))
die_errno("Could not come back to cwd");
return setup_explicit_git_dir(gitdir, cwd, len, nongit_ok);
}
/* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */ /* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */
if (is_bare_repository_cfg > 0) { if (is_bare_repository_cfg > 0) {
set_git_dir(offset == len ? gitdir : make_absolute_path(gitdir)); set_git_dir(offset == len ? gitdir : make_absolute_path(gitdir));
@ -443,6 +452,16 @@ static const char *setup_bare_git_dir(char *cwd, int offset, int len, int *nongi
if (check_repository_format_gently(".", nongit_ok)) if (check_repository_format_gently(".", nongit_ok))
return NULL; return NULL;
/* --work-tree is set without --git-dir; use discovered one */
if (getenv(GIT_WORK_TREE_ENVIRONMENT) || git_work_tree_cfg) {
const char *gitdir;
gitdir = offset == len ? "." : xmemdupz(cwd, offset);
if (chdir(cwd))
die_errno("Could not come back to cwd");
return setup_explicit_git_dir(gitdir, cwd, len, nongit_ok);
}
inside_git_dir = 1; inside_git_dir = 1;
inside_work_tree = 0; inside_work_tree = 0;
if (offset != len) { if (offset != len) {

View File

@ -283,6 +283,12 @@ Do:
Tests that are likely to smoke out future regressions are better Tests that are likely to smoke out future regressions are better
than tests that just inflate the coverage metrics. than tests that just inflate the coverage metrics.
- When a test checks for an absolute path that a git command generated,
construct the expected value using $(pwd) rather than $PWD,
$TEST_DIRECTORY, or $TRASH_DIRECTORY. It makes a difference on
Windows, where the shell (MSYS bash) mangles absolute path names.
For details, see the commit message of 4114156ae9.
Don't: Don't:
- exit() within a <script> part. - exit() within a <script> part.

View File

@ -343,7 +343,7 @@ test_expect_success 'make_relative_path handles double slashes in GIT_DIR' '
test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' ' test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' '
GIT_DIR=repo.git GIT_WORK_TREE=repo.git/work \ GIT_DIR=repo.git GIT_WORK_TREE=repo.git/work \
test-subprocess --setup-work-tree rev-parse --show-toplevel >actual && test-subprocess --setup-work-tree rev-parse --show-toplevel >actual &&
echo "$TRASH_DIRECTORY/repo.git/work" >expected && echo "$(pwd)/repo.git/work" >expected &&
test_cmp expected actual test_cmp expected actual
' '

File diff suppressed because it is too large Load Diff