Re: [PATCH 0/2] RFC: implement new zdiff3 conflict style
- From
Jeff King <peff@peff.net>
- Date
- Jun 15, 2021, 09:43 UTC
- Message-ID
- <YMh2M8Ek/RUVjKkL@coredump.intra.peff.net>
- In-Reply-To
- <pull.1036.git.git.1623734171.gitgitgadget@gmail.com>
On Tue, Jun 15, 2021 at 05:16:08AM +0000, Elijah Newren via GitGitGadget wrote:
Show 14 quoted lines
> Implement a zealous diff3, or "zdiff3". This new mode is identical to > ordinary diff3 except that it allows compaction of common lines between the > two sides of history, if those common lines occur at the beginning or end of > a conflict hunk. > > This is just RFC, because I need to add tests. Also, while I've remerged > every merge, revert, or duly marked cherry-pick from both git.git and > linux.git with this patch using the new zdiff3 mode, that only shows it > doesn't segfault. (Though I also reran 10% of the linux remerges with zdiff3 > under valgrind without issues.) I looked through some differences between > --remerge-diff with diff3 and --remerge-diff with zdiff3, but those are > essentially diffs of a diff of a diff, which I found hard to read. I'd like > to look through more examples, and use it for a while before submitting the > patches without the RFC tag.
I did something similar (but I wasn't smart enough to try your remerge-diff, and just re-ran a bunch of merges).
Skimming over the results, I didn't see anything that looked incorrect. Many of them are pretty non-exciting, though. A common case seems to be ones like 01a2a03c56 (Merge branch 'jc/diff-filter-negation', 2013-09-09), where two sides both add functions in the same place, and the common lines are just the closing "}" followed by a blank line.
Removing those shared lines actually makes things less readable, IMHO, but I don't think it's the wrong thing to do. The usual "merge" zealous minimization likewise produces the same unreadability. If we want to address that, I think the best way would be by teaching the minimization some heuristics about which lines are trivial.
Here's another interesting one. In 0c52457b7c (Merge branch 'nd/daemon-informative-errors-typofix', 2014-01-10), the diff3 looks like:
<<<<<<< ours
if (starts_with(arg, "--informative-errors")) {
||||||| base
if (!prefixcmp(arg, "--informative-errors")) {
=======
if (!strcmp(arg, "--informative-errors")) {
>>>>>>> theirs
informative_errors = 1;
continue;
}
<<<<<<< ours
if (starts_with(arg, "--no-informative-errors")) {
||||||| base
if (!prefixcmp(arg, "--no-informative-errors")) {
=======
if (!strcmp(arg, "--no-informative-errors")) {
>>>>>>> theirsA little clunky, but it's easy-ish to see what's going on. With zdiff3, the context between the two hunks is rolled into a single hunk:
<<<<<<< ours
if (starts_with(arg, "--informative-errors")) {
informative_errors = 1;
continue;
}
if (starts_with(arg, "--no-informative-errors")) {
||||||| base
if (!prefixcmp(arg, "--informative-errors")) {
=======
if (!strcmp(arg, "--informative-errors")) {
informative_errors = 1;
continue;
}
if (!strcmp(arg, "--no-informative-errors")) {
>>>>>>> theirswhich seems worse. I haven't dug/thought carefully enough into your change yet to know if this is expected, or if there's a bug.
-Peff