a structural diff that understands syntax 🟥🟩
 
 
 
 
 
Go to file
Wilfred Hughes 6d1a80c55b Improve README
Add better examples, show contrast with git, and explain why they're
interesting.

Also remove the mention of the wiki from the footer. Most of the
interesting content has been migrated to the manual.
2021-11-23 22:38:25 +07:00
.github/workflows Use rustdoc as subdir name 2021-11-21 19:03:13 +07:00
img Improve README 2021-11-23 22:38:25 +07:00
manual Link in manual to rustdoc pages 2021-11-21 19:14:58 +07:00
sample_files Configure atoms for Ruby 2021-11-20 14:46:12 +07:00
src Expand and improve docstrings 2021-11-21 23:22:24 +07:00
vendor Add basic Ruby support 2021-11-20 01:08:33 +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 Add basic Ruby support 2021-11-20 01:08:33 +07:00
CITATION.cff Add citation information 2021-11-23 09:52:39 +07:00
Cargo.lock Update build dependencies 2021-11-19 23:29:17 +07:00
Cargo.toml Change entry point to be main.rs 2021-11-21 11:45:48 +07:00
LICENSE Add LICENSE file 2021-07-04 11:41:39 +07:00
README.md Improve README 2021-11-23 22:38:25 +07:00
build.rs Add basic Ruby support 2021-11-20 01:08:33 +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.

Demo: Wrapping Expressions

Difftastic understands expression nesting. If you wrap an expression in an if statement, difftastic understand that the inner values are unchanged.

Elisp screenshot

Compare this with git's default diff. It is confused by indentation changes, and doesn't know which additional closing paren has been added.

Elisp comparison screenshot

Demo: Reflowing Code

Difftastic is robust to code formatting changes. If you change how many items appear on a single line, difftastic will only show you items which have changed.

Rust screenshot

In git's default diff, it's harder to see that iter and the curly braces are unchanged. It's also harder to see the affected line numbers.

Rust comparison screenshot

Languages

Difftastic supports the following languages:

  • C
  • C++
  • C#
  • Clojure
  • CSS
  • Elixir
  • Emacs Lisp
  • Go
  • Haskell
  • Java
  • JavaScript (and JSX)
  • JSON
  • OCaml
  • Python
  • Ruby
  • 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.