a structural diff that understands syntax 🟥🟩
 
 
 
 
 
Go to file
Wilfred Hughes c15ba1e75a New screenshots and add screencast demo 2022-03-26 15:46:41 +07:00
.github Fix typo and clarify VCS 2022-03-20 22:32:49 +07:00
img New screenshots and add screencast demo 2022-03-26 15:46:41 +07:00
manual Configure language and fix highlighting for dart 2022-03-20 11:36:12 +07:00
sample_files Ensure that blank lines in multiline strings are shown as changed 2022-03-23 22:47:17 +07:00
scripts Add a helper script for doing releases 2022-01-30 18:04:03 +07:00
src Store previous_sibling in SyntaxInfo 2022-03-24 21:57:13 +07:00
vendor Define a highlighting file for Clojure 2022-03-22 21:08:46 +07:00
.codecov.yml Disable 'patch' test coverage in GitHub status 2021-09-13 00:44:08 +07:00
.gitattributes Ignore sample files for calculating GitHub code statistics 2022-01-16 20:27:11 +07:00
.gitignore Ignore temporary file from comparison tool 2022-02-13 17:16:30 +07:00
CHANGELOG.md Ensure that blank lines in multiline strings are shown as changed 2022-03-23 22:47:17 +07:00
CITATION.cff Add citation information 2021-11-23 09:52:39 +07:00
Cargo.lock Next release will be 0.24 2022-03-19 10:27:04 +07:00
Cargo.toml Next release will be 0.24 2022-03-19 10:27:04 +07:00
LICENSE Roll year 2022-02-05 15:58:45 +07:00
README.md New screenshots and add screencast demo 2022-03-26 15:46:41 +07:00
build.rs Add support for Dart 2022-03-20 11:07:32 +07:00
text_diff_notes.md Add notes on LCS weaknesses 2021-03-21 13:34:01 +07:00

README.md

it's difftastic!
manual crates.io codecov.io

Difftastic is an experimental diff tool that compares files based on their syntax.

See the manual to get started.

Basic Example

Screenshot of difftastic and JS

In this JavaScript example, we can see:

(1) Difftastic understands nesting. It highlights the matching { and }, but understands that foo() hasn't changed despite the leading whitespace.

(2) Difftastic understands which lines should be aligned. It's aligned bar() on the left with bar(1) on the right, despite their changes.

(3) Difftastic understands that line-wrapping isn't meaningful. "eric" is now on a new line, but it hasn't changed.

One Minute Demo

asciicast

This one minute screencast demonstrates difftastic usage with both standalone files and git.

Languages

Difftastic supports the following languages:

  • Bash
  • C
  • C++
  • C#
  • Clojure
  • Common Lisp
  • CSS
  • Dart
  • Elixir
  • Emacs Lisp
  • Go
  • Haskell
  • Java
  • JavaScript (and JSX)
  • JSON
  • OCaml
  • PHP
  • Python
  • Ruby
  • Rust
  • Scala
  • TypeScript (and TSX)

If a file has an unrecognised extension, difftastic uses a line-oriented diff.

Known Issues

Performance. Difftastic scales relatively poorly on files with a large number of changes, and can use a lot of memory.

Display. Difftastic has a side-by-side display which usually works well, but can be confusing.

Robustness. Difftastic regularly has releases that fix crashes.

Non-goals

Patching. Difftastic output is intended for human consumption, and it does not generate patches that you can apply later. Use diff if you need a patch.

Merging. AST merging is a hard problem that difftastic does not address.

License

Difftastic is open source under the MIT license, see LICENSE for more details.

Files in sample_files/ are also under the MIT license unless stated otherwise in their header.