submodule absorbing: fix worktree/gitdir pointers recursively for non-moves
commitec9629b3b9abc9fc9cb2a9e058bf8dccbc760433
authorStefan Beller <sbeller@google.com>
Wed, 25 Jan 2017 23:04:50 +0000 (25 15:04 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 Jan 2017 19:01:04 +0000 (26 11:01 -0800)
treec777462a63da0ec73e6ca5feef41d6805fa101da
parent5f29433f1ca1efc35d546a056200d923e86e3fca
submodule absorbing: fix worktree/gitdir pointers recursively for non-moves

Consider having a submodule 'sub' and a nested submodule at 'sub/nested'.
When nested is already absorbed into sub, but sub is not absorbed into
its superproject, then we need to fixup the gitfile and core.worktree
setting for 'nested' when absorbing 'sub', but we do not need to move
its git dir around.

Previously 'nested's gitfile contained "gitdir: ../.git/modules/nested";
it has to be corrected to "gitdir: ../../.git/modules/sub1/modules/nested".

An alternative I considered to do this work lazily, i.e. when resolving
"../.git/modules/nested", we would notice the ".git" being a gitfile
linking to another path.  That seemed to be robuster by design, but harder
to get the implementation right.  Maybe we have to do that anyway once we
try to have submodules and worktrees working nicely together, but for now
just produce 'correct' (i.e. direct) pointers.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
submodule.c
t/t7412-submodule-absorbgitdirs.sh