add -i: close some regression test gaps
cover add -i: close some regression test gaps
While re-implementing git add -i and git add -p in C, I tried to make sure that there is test coverage for all of the features I convert from Perl to C, to give me some confidence in the correctness from running the test suite both with GIT_TEST_ADD_I_USE_BUILTIN=true and with GIT_TEST_ADD_I_USE_BUILTIN=false.
However, I discovered that there are a couple of gaps. This patch series intends to close them.
The first patch might actually not be considered a gap by some: it basically removes the need for the TTY prerequisite in the git add -i tests to verify that the output is colored all right. This change is rather crucial for me,
though: on Windows, where the conversion to a built-in shows the most obvious benefits, there are no pseudo terminals (yet), therefore git.exe cannot work with them (even if the MSYS2 Perl interpreter used by Git for Windows knows about some sort of pty emulation). And I really wanted to make sure that the colors work on Windows, as I personally get a lot out of those color cues.
The patch series ends by addressing two issues that are not exactly covering testing gaps:
* While adding a test case, I noticed that git add -p exited with success when it could not even generate a diff. This is so obviously wrong that I had to fix it right away (I noticed, actually, because my in-progress built-in git add -p failed, and the Perl version did not), and I used the same test case to verify that this is fixed once and for all.
* While working on covering those test gaps, I noticed a problem in an early version of the built-in version of git add -p where the git apply --allow-overlap mode failed to work properly, for little reason, and I fixed it real quick.
It would seem that the --allow-overlap function is not only purposefully under-documented, but also purposefully under-tested, probably to discourage its use. I do not quite understand the aversion to that option, but I did not feel like I should put up a battle here, so I did not accompany this fix with a new test script.
In the end, the built-in version of git add -p does not use the --allow-overlap function at all, anyway. Which should make everybody a lot happier.
Johannes Schindelin (7):
t3701: add a test for advanced split-hunk editing
t3701: avoid depending on the TTY prerequisite
t3701: add a test for the different add -p prompts
t3701: verify the shown messages when nothing can be added
t3701: verify that the diff.algorithm config setting is handled git add -p: use non-zero exit code when the diff generation failed apply --allow-overlap: fix a corner case
apply.c | 10 +++++ git-add--interactive.perl | 8 ++-- t/t3701-add-interactive.sh | 90 ++++++++++++++++++++++++++++++++++---- 3 files changed, 97 insertions(+), 11 deletions(-)
base-commit: 2e697ced9d647d6998d70f010d582ba8019fe3af
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-172%2Fdscho%2Fadd-i-fixes-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-172/dscho/add-i-fixes-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/172
Signature · 1 line
gitgitgadget
PATCH 1/7 t3701: add a test for advanced split-hunk editing
From: Johannes Schindelin <[email protected]>
In this developer's workflows, it often happens that a hunk needs to be edited in a way that adds lines, and sometimes even reduces the number of context lines.
Let's add a regression test for this.
Note that just like the preceding test case, the new test case is *not* handled gracefully by the current git add -p. It will be handled correctly by the upcoming built-in git add -p, though.
--- t/t3701-add-interactive.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
t/t3701-add-interactive.sh +22 -0
@@ -403,6 +403,28 @@ test_expect_failure 'split hunk "add -p (no, yes, edit)"' ' ! grep "^+31" actual ' +test_expect_failure 'edit, adding lines to the first hunk' ' + test_write_lines 10 11 20 30 40 50 51 60 >test && + git reset && + tr _ " " >patch <<-EOF && + @@ -1,5 +1,6 @@ + _10 + +11 + +12 + _20 + +21 + +22 + _30 + EOF + # test sequence is s(plit), e(dit), n(o) + # q n q q is there to make sure we exit at the end. + printf "%s\n" s e n q n q q | + EDITOR=./fake_editor.sh git add -p 2>error && + test_must_be_empty error && + git diff --cached >actual && + grep "^+22" actual +' + test_expect_success 'patch mode ignores unmerged entries' ' git reset --hard && test_commit conflict &&
Signature · 1 line
gitgitgadget
PATCH 2/7 t3701: avoid depending on the TTY prerequisite
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
The TTY prerequisite is a rather heavy one: it not only requires Perl to work, but also the IO/Pty.pm module (with native support, and it requires pseudo terminals, too).
In particular, test cases marked with the TTY prerequisite would be skipped in Git for Windows' SDK.
In the case of git add -p, we do not actually need that big a hammer, as we do not want to test any functionality that requires a pseudo terminal; all we want is for the interactive add command to use color, even when being called from within the test suite.
And we found exactly such a trick earlier already: when we added a test case to verify that the main loop of git add -i is colored appropriately. Let's use that trick instead of the TTY prerequisite.
While at it, we avoid the pipes, as we do not want a SIGPIPE to break the regression test cases (which will be much more likely when we do not run everything through Perl because that is inherently slower).
--- t/t3701-add-interactive.sh | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
t/t3701-add-interactive.sh +21 -7
@@ -23,6 +23,17 @@ diff_cmp () { test_cmp "$1.filtered" "$2.filtered" } +# This function uses a trick to manipulate the interactive add to use color: +# the `want_color()` function special-cases the situation where a pager was +# spawned and Git now wants to output colored text: to detect that situation, +# the environment variable `GIT_PAGER_IN_USE` is set. However, color is +# suppressed despite that environment variable if the `TERM` variable +# indicates a dumb terminal, so we set that variable, too. + +force_color () { + env GIT_PAGER_IN_USE=true TERM=vt100 "$@" +} + test_expect_success 'setup (initial)' ' echo content >file && git add file &&
@@ -451,35 +462,38 @@ test_expect_success 'patch mode ignores unmerged entries' ' diff_cmp expected diff ' -test_expect_success TTY 'diffs can be colorized' ' +test_expect_success 'diffs can be colorized' ' git reset --hard && echo content >test && - printf y | test_terminal git add -p >output 2>&1 && + printf y >y && + force_color git add -p >output 2>&1 <y && # We do not want to depend on the exact coloring scheme # git uses for diffs, so just check that we saw some kind of color. grep "$(printf "\\033")" output ' -test_expect_success TTY 'diffFilter filters diff' ' +test_expect_success 'diffFilter filters diff' ' git reset --hard && echo content >test && test_config interactive.diffFilter "sed s/^/foo:/" && - printf y | test_terminal git add -p >output 2>&1 && + printf y >y && + force_color git add -p >output 2>&1 <y && # avoid depending on the exact coloring or content of the prompts, # and just make sure we saw our diff prefixed grep foo:.*content output ' -test_expect_success TTY 'detect bogus diffFilter output' ' +test_expect_success 'detect bogus diffFilter output' ' git reset --hard && echo content >test && test_config interactive.diffFilter "echo too-short" && - printf y | test_must_fail test_terminal git add -p + printf y >y && + test_must_fail force_color git add -p <y ' test_expect_success 'patch-mode via -i prompts for files' '
@@ -689,7 +703,7 @@ test_expect_success 'show help from add--helper' ' <BOLD;BLUE>What now<RESET>>$SP Bye. EOF - test_write_lines h | GIT_PAGER_IN_USE=true TERM=vt100 git add -i >actual.colored && + test_write_lines h | force_color git add -i >actual.colored && test_decode_color <actual.colored >actual && test_i18ncmp expect actual '
Signature · 1 line
gitgitgadget
Re: [PATCH 2/7] t3701: avoid depending on the TTY prerequisite
Quoted 9 lines · Johannes Schindelin via GitGitGadget
From: Johannes Schindelin <[email protected]>
The TTY prerequisite is a rather heavy one: it not only requires Perl to work, but also the IO/Pty.pm module (with native support, and it requires pseudo terminals, too).
In particular, test cases marked with the TTY prerequisite would be skipped in Git for Windows' SDK.
Quoted 8 lines
In the case of
git add -p, we do not actually need that big a hammer, as we do not want to test any functionality that requires a pseudo terminal; all we want is for the interactive add command to use color, even when being called from within the test suite.And we found exactly such a trick earlier already: when we added a test case to verify that the main loop of
git add -iis colored appropriately. Let's use that trick instead of the TTY prerequisite.
It's much more interesting _what_ that trick is than when it was found. Is it setting TERM=vt100, or is it setting both TERM=vt100 and GIT_PAGER_IN_USE=true? I'm inclined to think the latter, but I'm not sure I interpreted the comment below right.
t/t3701-add-interactive.sh diff_cmp () { · line 29
Quoted 4 lines
t/t3701-add-interactive.sh +4
-0+# This function uses a trick to manipulate the interactive add to use color: +# the `want_color()` function special-cases the situation where a pager was +# spawned and Git now wants to output colored text: to detect that situation, +# the environment variable `GIT_PAGER_IN_USE` is set. However, color is
Perhaps a s/is set/has to be set/ would have helped my interpreter, dunno.
t/t3701-add-interactive.sh diff_cmp () { · line 35
Quoted 6 lines
t/t3701-add-interactive.sh +6
-0+# suppressed despite that environment variable if the `TERM` variable +# indicates a dumb terminal, so we set that variable, too. + +force_color () { + env GIT_PAGER_IN_USE=true TERM=vt100 "$@" +}
In any case, there are a couple of tests in other test scripts that test color relying on the TTY prereq. So maybe it would be worth to make this into a "global" helper function by adding it to 'test-lib-functions.sh', so we can drop a few more prereqs.
OTOH, some of those other tests have descriptions like:
t3203-branch-output.sh:test_expect_success TTY '%(color) present with tty' t7004-tag.sh:test_expect_success TTY '%(color) present with tty'
i.e. their description is specific about checking the behaviour with a tty, so I'm not entirely sure.
Re: [PATCH 2/7] t3701: avoid depending on the TTY prerequisite
Quoted 8 lines · SZEDER Gábor
Quoted 3 lines
And we found exactly such a trick earlier already: when we added a test case to verify that the main loop of
git add -iis colored appropriately. Let's use that trick instead of the TTY prerequisite.It's much more interesting _what_ that trick is than when it was found. Is it setting TERM=vt100, or is it setting both TERM=vt100 and GIT_PAGER_IN_USE=true? I'm inclined to think the latter, but I'm not sure I interpreted the comment below right.
It's both. GIT_PAGER_IN_USE tells Git not to bother checking isatty(), and then TERM=vt100 is necessary to override test-lib's TERM=dumb specifically for the color code.
Quoted 5 lines
In any case, there are a couple of tests in other test scripts that test color relying on the TTY prereq. So maybe it would be worth to make this into a "global" helper function by adding it to '
test-lib-functions.sh', so we can drop a few more prereqs.
Quoted 7 lines
OTOH, some of those other tests have descriptions like:
t3203-branch-output.sh:test_expect_success TTY '%(color) present with tty' t7004-tag.sh:test_expect_success TTY '%(color) present with tty'
i.e. their description is specific about checking the behaviour with a tty, so I'm not entirely sure.
Hmm. I have mixed feelings on this. I do like the simplicity of avoiding test_terminal (which is unportable and has also contributed to some confusing behavior in the past[1]). But it also takes us further away from a real-world setup.
That might be OK for the tests you quoted above, if we're OK with assuming the equivalence of isatty() and GIT_PAGER_IN_USE for the color code (though we'd probably want to make sure that's tested _somewhere_).
But it obviously would not work for test-terminal callers that are checking the pager behavior. And I suspect it may create other oddities; e.g., a script which calls a sub-command that looks at GIT_PAGER_IN_USE, even though the sub-command's output is going to a pipe. Though one could argue that's a bug[2] (that could be triggered by _actually_ sending the script's output to pager).
If we're going to get rid of test-terminal.pl (and I would be happy enough to see it go), I'd rather we mock things up at the isatty() level, something like what I showed in:
https://lore.kernel.org/git/[email protected]/
That gives us a more realistic setup, and we could reliably use it everywhere that test-terminal is used.
-Peff
[1] I had issues a while back with test-terminal's stdin feature being
racy:
https://lore.kernel.org/git/[email protected]/[2] Long ago I had a patch to make PAGER_IN_USE more careful by making sure that our pipe is the same as the pager pipe. It did (and does) work, but it would need some portability adjustments. I never bothered to follow up because it really does seem to be a pretty unlikely setup in practice. But if you're curious:
https://lore.kernel.org/git/[email protected]/
-Peff
PATCH 3/7 t3701: add a test for the different `add -p` prompts
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
The git add -p command offers different prompts for regular diff hunks vs mode change pseudo hunks vs diffs deleting files.
Let's cover this in the regresion test suite, in preparation for re-implementing git add -p in C.
For the mode change prompt, we use a trick that lets this test case pass even on systems without executable bit, i.e. where core.filemode = false (such as Windows): we first add the file to the index with git add --chmod=+x, and then call git add -p with core.filemode forced to true. The file on disk has no executable bit set, therefore we will see a mode change.
--- t/t3701-add-interactive.sh | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
t/t3701-add-interactive.sh +18 -1
@@ -105,7 +105,6 @@ test_expect_success 'revert works (commit)' ' grep "unchanged *+3/-0 file" output ' - test_expect_success 'setup expected' ' cat >expected <<-\EOF EOF
@@ -274,6 +273,24 @@ test_expect_success FILEMODE 'stage mode and hunk' ' # end of tests disabled when filemode is not usable +test_expect_success 'different prompts for mode change/deleted' ' + git reset --hard && + >file && + >deleted && + git add --chmod=+x file deleted && + echo changed >file && + rm deleted && + test_write_lines n n n | + git -c core.filemode=true add -p >actual && + sed -n "s/^\(([0-9/]*) Stage .*?\).*/\1/p" actual >actual.filtered && + cat >expect <<-\EOF && + (1/1) Stage deletion [y,n,q,a,d,?]? + (1/2) Stage mode change [y,n,q,a,d,j,J,g,/,?]? + (2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? + EOF + test_cmp expect actual.filtered +' + test_expect_success 'setup again' ' git reset --hard && test_chmod +x file &&
Signature · 1 line
gitgitgadget
PATCH 4/7 t3701: verify the shown messages when nothing can be added
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
In preparation for re-implementing git add -p in pure C (where we will purposefully keep the implementation of git add -p separate from the implementation of git add -i), let's verify that the user is told the same things as in the Perl version when the diff file is either empty or contains only entries about binary files.
--- t/t3701-add-interactive.sh | 11 +++++++++++ 1 file changed, 11 insertions(+)
t/t3701-add-interactive.sh +11 -0
@@ -291,6 +291,17 @@ test_expect_success 'different prompts for mode change/deleted' ' test_cmp expect actual.filtered ' +test_expect_success 'correct message when there is nothing to do' ' + git reset --hard && + git add -p 2>err && + test_i18ngrep "No changes" err && + printf "\\0123" >binary && + git add binary && + printf "\\0abc" >binary && + git add -p 2>err && + test_i18ngrep "Only binary files changed" err +' + test_expect_success 'setup again' ' git reset --hard && test_chmod +x file &&
Signature · 1 line
gitgitgadget
PATCH 5/7 t3701: verify that the diff.algorithm config setting is handled
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
Without this patch, there is actually no test in Git's test suite that covers the diff.algorithm feature. Let's add one.
We do this by passing a bogus value and then expecting git diff-files to produce the appropriate error message.
--- t/t3701-add-interactive.sh | 10 ++++++++++ 1 file changed, 10 insertions(+)
t/t3701-add-interactive.sh +10 -0
@@ -524,6 +524,16 @@ test_expect_success 'detect bogus diffFilter output' ' test_must_fail force_color git add -p <y ' +test_expect_success 'diff.algorithm is passed to `git diff-files`' ' + git reset --hard && + + >file && + git add file && + echo changed >file && + git -c diff.algorithm=bogus add -p 2>err && + test_i18ngrep "error: option diff-algorithm accepts " err +' + test_expect_success 'patch-mode via -i prompts for files' ' git reset --hard &&
Signature · 1 line
gitgitgadget
PATCH 6/7 git add -p: use non-zero exit code when the diff generation failed
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
The first thing git add -p does is to generate a diff. If this diff cannot be generated, git add -p should not continue as if nothing happened, but instead fail.
What we *actually* do here is much broader: we now verify for *every* run_cmd_pipe() call that the spawned process actually succeeded.
Note that we have to change two callers in this patch, as we need to store the spawned process' output in a local variable, which means that the callers can no longer decide whether to interpret the return <$fh> in array or in scalar context.
This bug was noticed while writing a test case for the diff.algorithm feature, and we let that test case double as a regression test for this fixed bug, too.
--- git-add--interactive.perl | 8 +++++--- t/t3701-add-interactive.sh | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-)
git-add--interactive.perl +5 -3
@@ -177,7 +177,9 @@ sub run_cmd_pipe { } else { my $fh = undef; open($fh, '-|', @_) or die; - return <$fh>; + my @out = <$fh>; + close $fh || die "Cannot close @_ ($!)"; + return @out; } }
@@ -224,7 +226,7 @@ sub list_untracked { sub get_empty_tree { return $empty_tree if defined $empty_tree; - $empty_tree = run_cmd_pipe(qw(git hash-object -t tree /dev/null)); + ($empty_tree) = run_cmd_pipe(qw(git hash-object -t tree /dev/null)); chomp $empty_tree; return $empty_tree; }
@@ -1127,7 +1129,7 @@ sub edit_hunk_manually { EOF2 close $fh; - chomp(my $editor = run_cmd_pipe(qw(git var GIT_EDITOR))); + chomp(my ($editor) = run_cmd_pipe(qw(git var GIT_EDITOR))); system('sh', '-c', $editor.' "$@"', $editor, $hunkfile); if ($? != 0) {
t/t3701-add-interactive.sh +1 -1
@@ -530,7 +530,7 @@ test_expect_success 'diff.algorithm is passed to `git diff-files`' ' >file && git add file && echo changed >file && - git -c diff.algorithm=bogus add -p 2>err && + test_must_fail git -c diff.algorithm=bogus add -p 2>err && test_i18ngrep "error: option diff-algorithm accepts " err '
Signature · 1 line
gitgitgadget
Re: [PATCH 6/7] git add -p: use non-zero exit code when the diff generation failed
"Johannes Schindelin via GitGitGadget" <[email protected]>
t/t3701-add-interactive.sh test_expect_success 'diff.algorithm is passed to `git diff-files`' ' · line 533
Quoted 10 lines · writes:
t/t3701-add-interactive.sh +1
-1@@ -530,7 +530,7 @@ test_expect_success 'diff.algorithm is passed to `git diff-files`' ' >file && git add file && echo changed >file && - git -c diff.algorithm=bogus add -p 2>err && + test_must_fail git -c diff.algorithm=bogus add -p 2>err &&
Makes sense.
Quoted 2 lines
t/t3701-add-interactive.sh +0
-0test_i18ngrep "error: option diff-algorithm accepts " err '
PATCH 7/7 apply --allow-overlap: fix a corner case
In reply to Johannes Schindelin via GitGitGadgetFrom: Johannes Schindelin <[email protected]>
Yes, yes, this is supposed to be only a band-aid option for git add -p not Doing The Right Thing. But as long as we carry the --allow-overlap option, we might just as well get it right.
This fixes the case where one hunk inserts a line before the first line, and is followed by a hunk whose context overlaps with the first one's and which appends a line at the end.
--- apply.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
apply.c +10 -0
@@ -2661,6 +2661,16 @@ static int find_pos(struct apply_state *state,unsigned long backwards, forwards, current;int backwards_lno, forwards_lno, current_lno; +/* +* When running with --allow-overlap, it is possible that a hunk is +* seen that pretends to start at the beginning (but no longer does), +* and that *still* needs to match the end. So trust `match_end` more +* than `match_beginning`. +*/ +if (state->allow_overlap && match_beginning && match_end && + img->nr - preimage->nr !=0 ) + match_beginning =0 ; +/* * If match_beginning or match_end is specified, there is no * point starting from a wrong line that will never match and
Signature · 1 line
gitgitgadget
Re: [PATCH 7/7] apply --allow-overlap: fix a corner case
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 5 lines · writes:
From: Johannes Schindelin <[email protected]>
Yes, yes, this is supposed to be only a band-aid option for
git add -pnot Doing The Right Thing. But as long as we carry the--allow-overlapoption, we might just as well get it right.
It probably depends on the definition of "right", where it may not even exist (otherwise it wouldn't be a band-aid but be a real feature) ;-)
Quoted 3 lines
This fixes the case where one hunk inserts a line before the first line, and is followed by a hunk whose context overlaps with the first one's and which appends a line at the end.
The in-code comment makes me wonder if we need to further loosen the check in the other direction, though. What makes begin more special than end? Can a hunk be seen that pretends to extend to the end but no longer does because there was an overlapping hunk that has been wiggled in?
Quoted 27 lines
Signed-off-by Johannes Schindelin <[email protected]>--- apply.c | 10 ++++++++++ 1 file changed, 10 insertions(+)apply.c +10
-0@@ -2661,6 +2661,16 @@ static int find_pos(struct apply_state *state,unsigned long backwards, forwards, current;int backwards_lno, forwards_lno, current_lno; +/* +* When running with --allow-overlap, it is possible that a hunk is +* seen that pretends to start at the beginning (but no longer does), +* and that *still* needs to match the end. So trust `match_end` more +* than `match_beginning`. +*/ +if (state->allow_overlap && match_beginning && match_end && + img->nr - preimage->nr !=0 ) + match_beginning =0 ; +/* * If match_beginning or match_end is specified, there is no * point starting from a wrong line that will never match and
Re: [PATCH 7/7] apply --allow-overlap: fix a corner case
Hi Junio,
Quoted 5 lines · Junio C Hamano
"Johannes Schindelin via GitGitGadget" <[email protected]>
Quoted 2 lines · writes:
From: Johannes Schindelin <[email protected]>
Quoted 7 lines
Quoted 3 lines
Yes, yes, this is supposed to be only a band-aid option for
git add -pnot Doing The Right Thing. But as long as we carry the--allow-overlapoption, we might just as well get it right.It probably depends on the definition of "right", where it may not even exist (otherwise it wouldn't be a band-aid but be a real feature) ;-)
Indeed. My hope is that we can get rid of it once the scripted git-add--interactive.perl is removed in favor of the built-in add -i/-p. This is a long way off, of course.
Quoted 9 lines
Quoted 3 lines
This fixes the case where one hunk inserts a line before the first line, and is followed by a hunk whose context overlaps with the first one's and which appends a line at the end.
The in-code comment makes me wonder if we need to further loosen the check in the other direction, though. What makes begin more special than end? Can a hunk be seen that pretends to extend to the end but no longer does because there was an overlapping hunk that has been wiggled in?
The beginning is more special than the end because it is associated with the line number 1. The end line number is flexible already.
There is another difference: after splitting hunks, the first hunk is applied first, and may render the line numbers of succeeding hunks incorrect. The same is not true for the last hunk: it cannot render the preceding hunks' line numbers incorrect, as it has not been applied yet.
I think that's why --allow-overlap works with this patch when adding lines both to the beginning and to the end after splitting a single hunk.
Ciao,
Dscho
Quoted 27 lines
Quoted 26 lines
Signed-off-by Johannes Schindelin <[email protected]>--- apply.c | 10 ++++++++++ 1 file changed, 10 insertions(+)apply.c +10
-0@@ -2661,6 +2661,16 @@ static int find_pos(struct apply_state *state,unsigned long backwards, forwards, current;int backwards_lno, forwards_lno, current_lno; +/* +* When running with --allow-overlap, it is possible that a hunk is +* seen that pretends to start at the beginning (but no longer does), +* and that *still* needs to match the end. So trust `match_end` more +* than `match_beginning`. +*/ +if (state->allow_overlap && match_beginning && match_end && + img->nr - preimage->nr !=0 ) + match_beginning =0 ; +/* * If match_beginning or match_end is specified, there is no * point starting from a wrong line that will never match and
Re: [PATCH 7/7] apply --allow-overlap: fix a corner case
Quoted 2 lines · Johannes Schindelin
The beginning is more special than the end because it is associated with the line number 1. The end line number is flexible already.
Yeah, we do not insist "the lineno must be X" at the end like we do at the beginning, but we still insist "there cannot be no post context if we are adding at the end" just like there cannot be any pre context for a patch that adds at the beginning, no?
Quoted 4 lines
There is another difference: after splitting hunks, the first hunk is applied first, and may render the line numbers of succeeding hunks incorrect. The same is not true for the last hunk: it cannot render the preceding hunks' line numbers incorrect, as it has not been applied yet.
This truly may make quite a difference, especially because the hunks are applied in order.
Thanks.
Re: [PATCH 7/7] apply --allow-overlap: fix a corner case
Hi Junio,
Quoted 9 lines · Junio C Hamano
Quoted 2 lines · Johannes Schindelin
The beginning is more special than the end because it is associated with the line number 1. The end line number is flexible already.
Yeah, we do not insist "the lineno must be X" at the end like we do at the beginning, but we still insist "there cannot be no post context if we are adding at the end" just like there cannot be any pre context for a patch that adds at the beginning, no?
True.
Quoted 7 lines
Quoted 4 lines
There is another difference: after splitting hunks, the first hunk is applied first, and may render the line numbers of succeeding hunks incorrect. The same is not true for the last hunk: it cannot render the preceding hunks' line numbers incorrect, as it has not been applied yet.
This truly may make quite a difference, especially because the hunks are applied in order.
I think you're right, I fooled myself into believing that the line number 1 is special, but the real culprit is that the second hunk is applied _after_ the first one may have changed the (overlapping) context. The same is not true for the second-to-last hunk: it will always be applied before the end of the file can possibly become no longer the end of the file.
I'll try to think up a concise paragraph about this, and stick it into the commit message.
Ciao,
Dscho