a structural diff that understands syntax 🟥🟩
 
 
 
 
 
Go to file
Wilfred Hughes 4685504c27 Disable 'patch' test coverage in GitHub status 2021-09-13 00:44:08 +07:00
.github/workflows Use 'manual' terminology consistently 2021-09-08 23:15:32 +07:00
img Simplify screenshot to exclude window chrome 2021-09-06 00:15:50 +07:00
manual Link to the rust perf book 2021-09-12 17:03:38 +07:00
sample_files Add benchmark file (takes 3-4 seconds today) 2021-09-12 21:01:54 +07:00
src Update tests whose results are sensitive to hash map ordering 2021-09-13 00:42:47 +07:00
vendor Merge commit '760985e2148a8282af86a554bf2e7d27189c2624' 2021-09-11 20:32:18 +07:00
.codecov.yml Disable 'patch' test coverage in GitHub status 2021-09-13 00:44:08 +07:00
.gitignore Ignore local notes 2021-07-27 23:49:31 +07:00
CHANGELOG.md Factor out a lib.rs 2021-09-13 00:41:58 +07:00
Cargo.lock Use a radix heap to speed up Dijkstra implementation 2021-09-12 22:04:15 +07:00
Cargo.toml Use a radix heap to speed up Dijkstra implementation 2021-09-12 22:04:15 +07:00
LICENSE Add LICENSE file 2021-07-04 11:41:39 +07:00
README.md Fix mdBook capitalisation 2021-09-09 22:52:43 +07:00
build.rs Add TODO for build parallelism 2021-09-11 22:22:28 +07:00
text_diff_notes.md Add notes on LCS weaknesses 2021-03-21 13:34:01 +07:00

README.md

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

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

screenshot

See the manual to get started.

Difftastic supports the following languages:

  • Clojure
  • CSS
  • Elixir
  • Emacs Lisp
  • Go
  • Java
  • JavaScript (and JSX)
  • JSON
  • OCaml
  • Python
  • Rust
  • TypeScript (and TSX)

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

Known Issues

Robustness. Difftastic is young and each release has fixed several crashes.

Comprehensible display. Minimal diffs can be confusing: replacing one function with another may have a small amount of common punctuation even though they're completely unrelated. Alignment of slightly modified lines is a major challenge too.

Changes to long lines. Difftastic uses a side-by-side display by default, which is unhelpful if the only changes are near the end of a line.

Performance. Difftastic scales relatively poorly on files with a large number of changes, and can use a lot of memory. This might be solved by A* search.

Non-goals

Patch files. If you want to create a patch that you can later apply, use diff. Difftastic ignores whitespace, so its output is lossy. (AST patching is also a hard problem.)

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.

Further Reading

The wiki includes a thorough overview of alternative diffing techniques and tools.