a structural diff that understands syntax 🟥🟩
 
 
 
 
 
Go to file
Wilfred Hughes 4287594cda Don't consider other paths when UnchangedNode is available
This substantially decreases the number of edges in our graphs,
especially when few nodes have changed. Diffing slow_before.rs with
slow_after.rs now takes half the time on my machine.

This makes diffing slightly greedier, so there may exist cases where
diffs are slightly worse. Comparing AXAB with AB is arguably nicer
as (+AX)AB rather than A(+XA)B. However, all the tests still pass,
and it's a huge perf win.

Closes #47
2021-10-18 22:23:44 +07:00
.github/workflows Run `cargo package` as part of test suite 2021-09-14 00:11:19 +07:00
img Polish readme and add more screenshots 2021-09-25 00:15:30 +07:00
manual Link to tree-sitter-rust fork 2021-10-05 23:03:33 +07:00
sample_files Add sample files showing a syntax error 2021-09-20 00:25:59 +07:00
src Don't consider other paths when UnchangedNode is available 2021-10-18 22:23:44 +07:00
vendor Add basic syntax highlighting for keywords and operators 2021-10-03 15:23:27 +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 Don't consider other paths when UnchangedNode is available 2021-10-18 22:23:44 +07:00
Cargo.lock Remove criterion 2021-10-02 22:00:12 +07:00
Cargo.toml Add basic syntax highlighting for keywords and operators 2021-10-03 15:23:27 +07:00
LICENSE Add LICENSE file 2021-07-04 11:41:39 +07:00
README.md Add missing word in readme 2021-09-27 20:30:57 +07:00
build.rs Fix building of e.g., vendor/tree-sitter-haskell-src/scanner.cc 2021-09-26 19:10:09 +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.

See the manual to get started.

Screenshots

C screenshot

C++ screenshot

Haskell screenshot

Languages

Difftastic supports the following languages:

  • C
  • C++
  • C#
  • Clojure
  • CSS
  • Elixir
  • Emacs Lisp
  • Go
  • Haskell
  • 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

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.

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

Diff accuracy. Some delimiter moves are currently ignored (see #30).

Integration. Difftastic only has limited support for git and mercurial today.

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 additional notes on alternative diffing techniques and tools.