]> git.proxmox.com Git - libgit2.git/commit - tests/repo/discover.c
Fix repository discovery with ceiling_dirs at current directory
authorJosh Triplett <josh@joshtriplett.org>
Mon, 4 Apr 2016 02:24:15 +0000 (19:24 -0700)
committerJosh Triplett <josh@joshtriplett.org>
Fri, 24 Jun 2016 18:44:01 +0000 (11:44 -0700)
commited577134a5dcf30c95b740859aceebd9c1137157
tree25543c84c8126fa37f30aa72b086fab37cef1ad4
parent37e9278220095435d986e7412d2a97097dab3221
Fix repository discovery with ceiling_dirs at current directory

git only checks ceiling directories when its search ascends to a parent
directory.  A ceiling directory matching the starting directory will not
prevent git from finding a repository in the starting directory or a
parent directory.  libgit2 handled the former case correctly, but
differed from git in the latter case: given a ceiling directory matching
the starting directory, but no repository at the starting directory,
libgit2 would stop the search at that point rather than finding a
repository in a parent directory.

Test case using git command-line tools:

/tmp$ git init x
Initialized empty Git repository in /tmp/x/.git/
/tmp$ cd x/
/tmp/x$ mkdir subdir
/tmp/x$ cd subdir/
/tmp/x/subdir$ GIT_CEILING_DIRECTORIES=/tmp/x git rev-parse --git-dir
fatal: Not a git repository (or any of the parent directories): .git
/tmp/x/subdir$ GIT_CEILING_DIRECTORIES=/tmp/x/subdir git rev-parse --git-dir
/tmp/x/.git

Fix the testsuite to test this case (in one case fixing a test that
depended on the current behavior), and then fix find_repo to handle this
case correctly.

In the process, simplify and document the logic in find_repo():
- Separate the concepts of "currently checking a .git directory" and
  "number of iterations left before going further counts as a search"
  into two separate variables, in_dot_git and min_iterations.
- Move the logic to handle in_dot_git and append /.git to the top of the
  loop.
- Only search ceiling_dirs and find ceiling_offset after running out of
  min_iterations; since ceiling_offset only tracks the longest matching
  ceiling directory, if ceiling_dirs contained both the current
  directory and a parent directory, this change makes find_repo stop the
  search at the parent directory.
src/repository.c
tests/repo/discover.c
tests/repo/open.c