Skip to content

Commit a9185cc

Browse files
dschogitster
authored andcommitted
t3650: document bug when directory renames are turned off
There is a bug in the way renames are cached that rears its head when `merge.directoryRenames` is set to false; it results in the following message: merge-ort.c:3002: process_renames: Assertion `newinfo && !newinfo->merged.clean' failed. Aborted It is quite a curious bug: the same test case will succeed, without any assertion, if instead run with `merge.directoryRenames=true`. Further, the assertion does not manifest while replaying the first commit, it manifests while replaying the _second_ commit of the commit range. But it does _not_ manifest when the second commit is replayed individually. This would indicate that there is an incomplete rename cache left-over from the first replayed commit which is being reused for the second commit, and if directory rename detection is enabled, the missing paths are somehow regenerated. Incidentally, the same bug can by triggered by modifying t6429 to switch from merge.directoryRenames=true to merge.directoryRenames=false. Signed-off-by: Johannes Schindelin <[email protected]> [en: tweaked the commit message slightly, including adjusting the line number of the assertion to the latest version, and the much later discovery that a simple t6429 tweak would also display the issue.] Signed-off-by: Elijah Newren <[email protected]> Reviewed-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 3965976 commit a9185cc

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

t/t3650-replay-basics.sh

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,4 +195,26 @@ test_expect_success 'using replay on bare repo to rebase multiple divergent bran
195195
done
196196
'
197197

198+
test_expect_failure 'merge.directoryRenames=false' '
199+
# create a test case that stress-tests the rename caching
200+
git switch -c rename-onto &&
201+
202+
mkdir -p to-rename &&
203+
test_commit to-rename/move &&
204+
205+
mkdir -p renamed-directory &&
206+
git mv to-rename/move* renamed-directory/ &&
207+
test_tick &&
208+
git commit -m renamed-directory &&
209+
210+
git switch -c rename-from HEAD^ &&
211+
test_commit to-rename/add-a-file &&
212+
echo modified >to-rename/add-a-file.t &&
213+
test_tick &&
214+
git commit -m modified to-rename/add-a-file.t &&
215+
216+
git -c merge.directoryRenames=false replay \
217+
--onto rename-onto rename-onto..rename-from
218+
'
219+
198220
test_done

0 commit comments

Comments
 (0)