On Tue, Apr 03 2018, Stefan Beller wrote: > On Tue, Apr 3, 2018 at 12:39 PM, Ævar Arnfjörð Bjarmason > <avarab@xxxxxxxxx> wrote: >> >> On Mon, Apr 02 2018, Stefan Beller wrote: >> >>> At the time the move coloring was implemented we thought an enum of modes >>> is the best to configure this feature. However as we want to tack on new >>> features, the enum would grow exponentially. >>> >>> Refactor the code such that features are enabled via bits. Currently we can >>> * activate the move detection, >>> * enable the block detection on top, and >>> * enable the dimming inside a block, though this could be done without >>> block detection as well (mode "plain, dimmed") >>> >>> Choose the flags to not be at bit position 2,3,4 as the next patch >>> will occupy these. >> >> When I've been playing with colorMoved the thing I've found really >> confusing is that the current config has confused two completely >> unrelated things (at least, from a user perspective), what underlying >> algorithm you use, and how the colors look. > > Not sure I follow. The colors are in color.diff.X and the algorithm is in > diff.colorMoved, whereas some colors are reused for different algorithms? > >> >> I was helping someone at work the other day where they were trying: >> >> git -c color.diff.new="green bold" \ >> -c color.diff.old="red bold" \ >> -c color.diff.newMoved="green" \ >> -c color.diff.oldMoved="red" \ >> -c diff.colorMoved=plain show <commit> >> >> But what gave better results was: >> >> git -c color.diff.new="green bold" \ >> -c color.diff.old="red bold" \ >> -c color.diff.newMoved="green" \ >> -c color.diff.oldMoved="red" \ >> -c diff.colorMoved=zebra \ >> -c color.diff.oldMovedAlternative=red \ >> -c color.diff.newMovedAlternative=green show <commit> >> >> I don't have a public test commit to share (sorry), but I have an >> internal example where "plain" will consider a thing as falling under >> color.diff.old OR color.diff.oldMoved, but zebra will consider that >> whole part only color.diff.old. > > What do you mean by "OR" ? > Is the hunk present multiple times and colored one or the other way? > Is it colored differently in different invocations of Git? > Is one hunk mixing up both colors? > > Is the hunk "small" ? > small hunks are un-colored, to avoid showing empty lines > or closing braces as moved. But plain mode ignores this heuristic. > >> I see now that that might be since only the "zebra" supports the >> *Alternative that it ends up "stealing" chunks from something that would >> have otherwise been classified differently, so I have no idea if there's >> an easy "solution", or if it's even a problem. > > Can you describe the issue more to see if it is a problem? > (It sounds like a problem in the documentation/UX to me already > as the docs could not tell you what to expect) > >> Sorry about being vague, I just dug this up from some old notes now >> after this patch jolted my memory about it. Forget about what I said so far, sorry, that was a really shitty report. I dug into this a bit more and here's a better one. I still can't share the actual diff I have in front of me (internal code). Currently we have plain, zebra & dimmed_zebra, and zebra is the default. I got an internal report from someone who had, because zebra looked crappy in his terminal, moved to "plain", and was reporting getting worse moved diffs as a result. I found that there's essentially a missing setting between "plain" and "zebra", in git command terms: # The "plain" setting git -c diff.colorMoved=true \ -c diff.colorMoved=plain \ show <commit> # We don't have this, it's "plain" but with "zebra" heuristics, # plain_zebra? git -c diff.colorMoved=true \ -c color.diff.oldMovedAlternative="bold magenta" \ -c color.diff.newMovedAlternative="bold yellow" \ -c diff.colorMoved=zebra \ show <commit> # The "zebra" setting. git -c diff.colorMoved=true \ -c diff.colorMoved=zebra \ show <commit> Which is what I mean by the current config conflating two (to me) unrelated things. One is how we, via any method, detect what's moved or not, and the other is what color/format we use to present this to the user. You can feed that plain_zebra invocation input where it'll color-wise produce something that looks *almost* like "plain", but will differ (and usually be better) in what lines it decides to show as moved, which of course is due to *MovedAlternative.