read-cache: fix reading the shared index for other repos
commita125a223347a8d43fffc1b7ec2bec93d88ec17b7
authorThomas Gummerer <t.gummerer@gmail.com>
Sun, 7 Jan 2018 22:30:13 +0000 (7 22:30 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Jan 2018 18:36:34 +0000 (19 10:36 -0800)
treeb880686aa0091dc19d44b8587f2bd2ce2e7e2c82
parent3013dff8662eae06457fe6e5348dfe2270810ab2
read-cache: fix reading the shared index for other repos

read_index_from() takes a path argument for the location of the index
file.  For reading the shared index in split index mode however it just
ignores that path argument, and reads it from the gitdir of the current
repository.

This works as long as an index in the_repository is read.  Once that
changes, such as when we read the index of a submodule, or of a
different working tree than the current one, the gitdir of
the_repository will no longer contain the appropriate shared index,
and git will fail to read it.

For example t3007-ls-files-recurse-submodules.sh was broken with
GIT_TEST_SPLIT_INDEX set in 188dce131f ("ls-files: use repository
object", 2017-06-22), and t7814-grep-recurse-submodules.sh was also
broken in a similar manner, probably by introducing struct repository
there, although I didn't track down the exact commit for that.

be489d02d2 ("revision.c: --indexed-objects add objects from all
worktrees", 2017-08-23) breaks with split index mode in a similar
manner, not erroring out when it can't read the index, but instead
carrying on with pruning, without taking the index of the worktree into
account.

Fix this by passing an additional gitdir parameter to read_index_from,
to indicate where it should look for and read the shared index from.

read_cache_from() defaults to using the gitdir of the_repository.  As it
is mostly a convenience macro, having to pass get_git_dir() for every
call seems overkill, and if necessary users can have more control by
using read_index_from().

Helped-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache-tree.c
cache.h
read-cache.c
repository.c
revision.c