Re: [PATCH] git gui: show diffs with a minimum of 1 context line
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:45:15
Clemens Buchacher [off-list ref] writes:
git apply does not handle diffs without context correctly.
NAK on this part of the proposed commit log message. "git-apply" is more anal than other "patch" implementations in that it tries to make sure that a hunk that touches the trailing end actually applies to the trailing end of the file. If a patch is generated with non-zero context, we can detect by presense of trailing context lines that a patch is _not_ about modifying the trailing end, but with a -U0 patch, every hunk will come without trailing context, so you need to disable that safety by asking for --unidiff-zero option.
... Configuring git gui to show zero context lines therefore breaks staging.
So another option might be to pass --unidiff-zero iff/when it is feeding such a patch to fix this particular "user error" of "git-apply" program. Having said that,
In reply to this patch I will send a first attempt at fixing this problem instead of avoiding it.
I suspect there are some things "git-apply" should be able to _figure out_ that the user is giving it a -U0 patch and automatically flip unidiff_zero option on. For example, if the _first_ hunk of a patch does not begin with "@@ -0,0 +N,M @@" nor with "@@ -1,L +N,M @@" (i.e. the hunk claims to apply not at the beginning) and the hunk does not have leading context lines, _and_ if that first hunk does not have trailing context lines, then it is clearly a -U0 patch (or it could be a corrupt patch, but let's discount that possibility for now). Even if the hunk does claim to apply at the beginning, in which case we cannot determine if it is a -U0 patch by looking at the lack of leading context, if it has any context lines, we can tell it is _not_ a -U0 patch. When the first hunk that applies to the beginning lacks any context, we cannot really tell if it is -U0 or not (the other possibility is a total rewrite of the file from the beginning to the end). Even in that case, you could look at the next hunk --- if you have a hunk that applies to the same path after looking at such a "first" hunk without context, then it clearly is a -U0 patch.