add -p: fix checkout -p with pathological context
cover add -p: fix checkout -p with pathological context
When I fixed the hunk offsets in add -p when hunks are skipped I forgot that the reverse patch case needs to be handled differently.
Phillip Wood (1):
add -p: fix checkout -p with pathological context
git-add--interactive.perl | 6 +++++- t/t3701-add-interactive.sh | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-)
base-commit: aeb582a98374c094361cba1bd756dc6307432c42
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-262%2Fphillipwood%2Fwip%2Ffix-checkout-p-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-262/phillipwood/wip/fix-checkout-p-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/262
Signature · 1 line
gitgitgadget
PATCH 1/1 add -p: fix checkout -p with pathological context
From: Phillip Wood <[email protected]>
Commit fecc6f3a68 ("add -p: adjust offsets of subsequent hunks when one is skipped", 2018-03-01) fixed adding hunks in the correct place when a previous hunk has been skipped. However it did not address patches that are applied in reverse. In that case we need to adjust the pre-image offset so that when apply reverses the patch the post-image offset is adjusted correctly. We subtract rather than add the delta as the patch is reversed (the easiest way to think about it is to consider a hunk of deletions that is skipped - in that case we want to reduce offset so we need to subtract).
--- git-add--interactive.perl | 6 +++++- t/t3701-add-interactive.sh | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-)
git-add--interactive.perl +5 -1
@@ -972,7 +972,11 @@ sub coalesce_overlapping_hunks { next; } if ($ofs_delta) { - $n_ofs += $ofs_delta; + if ($patch_mode_flavour{IS_REVERSE}) { + $o_ofs -= $ofs_delta; + } else { + $n_ofs += $ofs_delta; + } $_->{TEXT}->[0] = format_hunk_header($o_ofs, $o_cnt, $n_ofs, $n_cnt); }
t/t3701-add-interactive.sh +8 -0
@@ -639,4 +639,12 @@ test_expect_success 'add -p patch editing works with pathological context lines' test_cmp expected-2 actual ' +test_expect_success 'checkout -p works with pathological context lines' ' + test_write_lines a a a a a a >a && + git add a && + test_write_lines a b a b a b a b a b a > a&& + test_write_lines s n n y q | git checkout -p && + test_write_lines a b a b a a b a b a >expect && + test_cmp expect a +' test_done
Signature · 1 line
gitgitgadget