aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--diffcore-break.c1
-rwxr-xr-xt/t4067-diff-partial-clone.sh31
2 files changed, 32 insertions, 0 deletions
diff --git a/diffcore-break.c b/diffcore-break.c
index c4c2173f30..9b11fe2fa0 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -222,6 +222,7 @@ void diffcore_break(struct repository *r, int break_score)
free(p); /* not diff_free_filepair(), we are
* reusing one and two here.
*/
+ q->queue[i] = NULL;
continue;
}
}
diff --git a/t/t4067-diff-partial-clone.sh b/t/t4067-diff-partial-clone.sh
index 72f25de449..30813109ac 100755
--- a/t/t4067-diff-partial-clone.sh
+++ b/t/t4067-diff-partial-clone.sh
@@ -132,6 +132,37 @@ test_expect_success 'diff with rename detection batches blobs' '
test_line_count = 1 done_lines
'
+test_expect_success 'diff succeeds even if prefetch triggered by break-rewrites' '
+ test_when_finished "rm -rf server client trace" &&
+
+ test_create_repo server &&
+ echo xyz >server/foo &&
+ mkdir server/bar &&
+ test_seq -f "line %d" 1 100 >server/bar/baz &&
+ git -C server add -A &&
+ git -C server commit -m x &&
+
+ echo xyzz >server/foo &&
+ test_seq -f "line %d" 90 190 >server/bar/baz &&
+ git -C server add -A &&
+ git -C server commit -m x &&
+
+ test_config -C server uploadpack.allowfilter 1 &&
+ test_config -C server uploadpack.allowanysha1inwant 1 &&
+ git clone --filter=blob:limit=0 "file://$(pwd)/server" client &&
+
+ # Fetch bar/baz without fetching foo.
+ # Foo will be lazily fetched during break rewrites detection.
+ git -C client checkout HEAD~1 bar &&
+
+ # Ensure baz in the working tree is different from baz in HEAD~1.
+ # We need baz to trigger break-rewrites detection.
+ git -C client reset --hard HEAD &&
+
+ # break-rewrites detction in reset.
+ git -C client reset HEAD~1
+'
+
test_expect_success 'diff succeeds even if entries are removed from queue' '
test_when_finished "rm -rf server client trace" &&