Skip to content

diff: fallback to longest common substring algorithm - #9947

Open
yuja wants to merge 3 commits into
mainfrom
push-kuwwmkyknpkl
Open

diff: fallback to longest common substring algorithm#9947
yuja wants to merge 3 commits into
mainfrom
push-kuwwmkyknpkl

Conversation

@yuja

@yuja yuja commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Closes #9914

Checklist

If applicable:

  • I have updated CHANGELOG.md
  • I have updated the documentation (README.md, docs/, demos/)
  • I have updated the config schema (cli/src/config-schema.json)
  • I have added/updated tests to cover my changes
  • I fully understand the code that I am submitting (what it does,
    how it works, how it's organized), including any code drafted by an LLM.
  • For any prose generated by an LLM, I have proof-read and copy-edited with
    an eye towards deleting anything that is irrelevant, clarifying anything
    that is confusing, and adding details that are relevant. This includes,
    for example, commit descriptions, PR descriptions, and code comments.

I don't find samples that look significantly worse, but one potential drawback is that minor whitespace additions/removals in indentation changes match up.

(without fallback)
image

(with fallback)
image

yuja added 3 commits August 8, 2026 23:13
This should be more correct since a word with max_occurrences + k (k > 1) may
exist in both left and right sides, and such word shouldn't be chosen when any
less common words don't share their occurrences.

This patch also removes the fast path because it's unusual that the least common
word exceeds the limit.
The git CLI falls back to Myers if no uncommon shared words can be found,
whereas jj doesn't. This patch adds the Python difflib-like algorithm as a
fallback. This is much simpler than Myers, and can naturally be plugged into the
existing recursive diffing machinery.

test_diff_color_words_omit_blank_right_line() is removed because it's
impractical to reproduce the problem without disabling the longest match
fallback. Tokens are split by line as long as matching "\n" characters are
present. The original issue is still covered by the unit tests added at
79fb219 "files: make DiffLineIterator omit blank right line following
matching+left".

Closes #9914
@yuja
yuja requested a review from a team as a code owner August 8, 2026 14:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

color-words diff of a conflict: + prefix misrendered on last line of section

1 participant