Repository navigation
Releases: ivankovic/omnidiff
Release list
v0.2.1
A large number of improvements to non-code diffs, and adding more robust tests for non-code content.
Added
- Pictures (PNG, JPEG, GIF, WebP, BMP, ICO, TIFF) are diffed instead of reported as "Binary file
differs": what each side is (format, size, color type), how much of it changed and where, as
rectangles of changed pixels. Pixels compare perceptually, so re-encoding noise is not a change.
Headless andgit diffprint this as a short report and--mode jsonadds apictureobject.
The TUI shows the two pictures with the changed regions outlined, andtcycles to a
difference, blend and swipe view; it draws real pixels where the terminal speaks the kitty,
sixel or iTerm2 graphics protocol and Unicode half blocks everywhere else. - Animated GIF, PNG and WebP pictures are compared frame by frame, the frames aligned the way
lines are: the report says which frames changed, which were added or removed, and whether the
same frames now show for different times. In the TUI,,and.step through the frames and
space plays the animation. +and-zoom into the same part of both pictures, up to 32x, and Shift+h/j/k/lpans:
for a large screenshot whose change is a few pixels.- Inside tmux, the TUI draws pictures with the graphics protocol of the terminal in front of the
pane, as tmux knows it, rather than whichever attached client answered the query: a kitty on a
desk no longer makes a phone's terminal attached to the same session show crossed-out boxes.
bswitches every picture to half blocks and back, andOMNIDIFF_GRAPHICS=halfblocks(or
kitty,sixel,iterm2) overrides the detection. - Archives, fonts, cursor themes, message catalogs and PDFs are diffed by what they hold, member
by member: a zip's or tar's files (jars, Office documents and EPUBs are zips; gzip, xz and
bzip2 streams are opened too), a font's glyphs and names (TrueType, OpenType, WOFF, WOFF2,
EOT), a cursor's sizes and frames (Windows.curand.ani, X cursors, Hyprland.hlc), a
gettext.moor Qt.qmcatalog's messages, a PDF's pages. Members match by name and only
the changed ones are opened: each is diffed by what it is - a picture as a picture, text by
lines, a nested archive as an archive. The report lists the members that changed, were added or
were removed;--mode jsonadds acontentobject, which a picture pair carries too. In the
TUI the members are listed beside the selected one,ashows the unchanged ones as well,g
shows every changed glyph or picture at once, andEnteropens an archive inside an archive.
A text member is diffed by OmniDiff in its own language, its long lines wrapped and cut to the
changes (J/Kstep through them), andEnteropens it in the full diff view; a Java class
file in a jar is diffed as a listing of its fields, its methods and what each method calls,
reads and loads. - What happened to a picture or a member is said in one of six levels, by how hard it is to see
and what the after side is: invisible (only bytes differ), imperceptible (seen only once
highlighted), artifacts (what compression, resampling or a formatter leaves behind), edited,
redrawn (the same thing made anew) and replaced; with tags for a picture resized, cropped,
retimed or given frames, and for a container given members. Pictures of one aspect ratio and
different sizes are compared at the smaller size;--mode jsonreports, per comparison, the
pixels that differ at all and the clearly changed ones beside those that changed. - Text in UTF-16 or UTF-32 (announced by a byte order mark) is read as text and diffed like any
other file instead of reported as binary;--mode jsonnames itsencoding.
Changed
- XML formats with an extension of their own are diffed with the XML grammar instead of line by
line:.svg,.plist, Qt.ui/.qrc, MSBuild.vcxproj/.csproj/.props/.targets,.xib,
.storyboard,.xaml,.resx,.xsd/.xsl,.xlf,.kml,.gpxand more (see the README's
language list). A file under one of these names whose content is not markup is still diffed as
plain text. - Building OmniDiff needs Rust 1.92 or later (was 1.88): the picture view's graphics library
needs 1.90, and the PDF renderer 1.92. - The TUI shows the two files side by side from 200 terminal columns (was 220); narrower
terminals still show one panel at a time.
v0.2.0
CodeDiff is now OmniDiff. The old name is a registered trademark, so everything was renamed.
Changed
- Renamed from CodeDiff to OmniDiff. The crate, binary, packages, editor extensions and
repositories are allomnidiffnow: installomnidiff(cargo install --locked omnidiff, the
omnidiffdeb fromhttps://ivankovic.github.io/omnidiff/apt,brew install ivankovic/omnidiff/omnidiff, theivankovic.omnidiffVS Code extension,omnidiff.nvim),
then rerunomnidiff git configureandomnidiff jj configure, since a configuration that
namescodediffpoints at a binary that no longer updates. The apt repository moved with the
GitHub Pages site: replaceivankovic.github.io/codediff/aptand the
codediff-archive-keyring.gpgkey file in your apt sources with theomnidiffones (see the
README). Thecodediffcrate and thecodediffpackages stay available for now and are
retired in a later release. - The config moved to
.omnidiff.toml,$OMNIDIFF_CONFIGand~/.config/omnidiff/config.toml.
For this release the old names are still read, and~/.config/codediff/config.tomlis moved to
the new place the first time it is needed. - Code copied to several places is shown as such: when a statement or declaration of some size
appears once before and twice after (or the reverse) in two branches of oneif, every copy
paints as a move of the original instead of one being matched and the rest inserted. - A comment of three or more words that moves inside a function, class or other construct that
survives the change is shown as moved, instead of deleted and re-inserted. - A run of comments or small statements that changes length is aligned by similarity, so the
entries that stayed are matched instead of the whole run being deleted and re-inserted. - A leaf renamed across two different constructs (one identifier of a replaced expression reused
in the new one) is shown as deleted and inserted rather than as an in-place update. - Library:
ASTDiffrecords N:M groups next to its one-partner node maps (add_group), and its
node maps can no longer disagree about a pair (is_validchecks it).
v0.1.1
Responding to initial user reports for v0.1.0.
Note the removal of "--web" and sending users to CodeReview instead.
Changed
- Tabs display at tab stops, in the TUI and in headless output, instead of as one space.
- The TUI uses the nearest 256 colors when the terminal does not advertise 24-bit color (macOS
Terminal.app). --minimal,--full,--whole-updatesand--paint-reindent-movesapply in the TUI too, for
that run only.--reviewrejects a BEFORE/AFTER pair and--mode, and--headlessrejects--mode, instead
of ignoring one flag.codediff git configurewrites the resolved path of the running binary todiff.external.change N/Mcounts changes in the ordernwalks them.- The render-options badge names what differs from
--full. - Panel titles name languages as people write them (C++, Lua, Markdown). The JSON
language
values are unchanged. - Library: the
diff::solve_*pass modules are crate-private,ASTDiff::is_validhas noafter
parameter, andNodeCachetakes a lifetime (see Fixed). Breaking for library users, against
the policy above; the library API was never meant to be relied on (see the crate docs).
Fixed
- The TUI cursor lands on the right column on lines with non-ASCII text.
- Ctrl-C quits from every screen, and Ctrl-E scrolls instead of opening
$EDITOR. - The theme dialog opens on the syntax theme in use, and accepting a preset keeps the saved Custom
palette. - Home and End move the cursor, not only the view.
$VISUAL/$EDITORmay carry arguments (code -w,emacsclient -t).- Omitting
--whole-updatesno longer switches a saved "Whole-pair updates" setting off. - The TUI exits when its input stream closes.
- A block whose children were all deleted no longer takes its whole subtree with it: code matched
inside it (a body moved from anifinto anunless) is shown as matched, not deleted and
inserted. - Library:
NodeCacheborrows theCodeit was built from, so a cache that outlives itsCode
no longer compiles; before, safe code could read freed memory through it.
Removed
- The browser front end (
codediff-web) and thewebCargo feature. Breaking for anyone who
installed withcargo install codediff --features web; for reviewing changes in a browser, use
codereview. The GitHub Pages showcase is unaffected.
v0.1.0
The first release ready for users!
Ready for:
- Daily usage as a
git difftooltool! - Daily usage in an IDE!
- Integration into batch pipelines and LLM agents!
Things that you can do, but expect changes:
- Integration as a library into other products. The API is not fixed and might change.
Metrics:
- Speed: p50 7.6ms, p90 78.7ms, p99 347ms, slowest 1,355ms. 100ms is the 92.7th percentile
- Robust: 99.95%
- Accurate: 70.6% perfect, 88.6% <= 1% off
v0.0.14
Full Changelog: v0.0.13...v0.0.14
Full Changelog: v0.0.13...v0.0.14
Full Changelog: v0.0.13...v0.0.14
Full Changelog: v0.0.13...v0.0.14
v0.0.13
Full Changelog: v0.0.12...v0.0.13
Full Changelog: v0.0.12...v0.0.13
Full Changelog: v0.0.12...v0.0.13
Full Changelog: v0.0.12...v0.0.13
Full Changelog: v0.0.12...v0.0.13
v0.0.12
Full Changelog: v0.0.11...v0.0.12
Full Changelog: v0.0.11...v0.0.12
Full Changelog: v0.0.11...v0.0.12
Full Changelog: v0.0.11...v0.0.12
v0.0.11
Full Changelog: v0.0.10...v0.0.11
Full Changelog: v0.0.10...v0.0.11
Full Changelog: v0.0.10...v0.0.11
Full Changelog: v0.0.10...v0.0.11