a structural diff that understands syntax 🟥🟩
 
 
 
 
 
Go to file
Wilfred Hughes e38d14a144 Prefer aligning blank lines in display
After we've aligned lines based on diff results, we have intermediate
lines that we need to align somehow. Previously, we'd just take them
in order, aligning the first on the LHS with the first on the RHS and
so on.

If the intermediate lines start or end with a sequence of blank lines,
prefer aligning the blank lines. If we have both, arbitrarily choose
the ending blank lines.

This has produced better results in many of the sample files, although
in the case of slow_before.rs we've just changed from a leading blank
line alignment to a trailing blank line alignment.
2022-03-17 22:16:45 +07:00
.github Improve bug report template wording 2022-03-12 17:44:54 +07:00
img Update screenshots to show new syntax highlighting 2022-01-29 17:54:36 +07:00
manual Adding support for PHP 2022-03-09 23:52:31 +07:00
sample_files Prefer aligning blank lines in display 2022-03-17 22:16:45 +07:00
scripts Add a helper script for doing releases 2022-01-30 18:04:03 +07:00
src Prefer aligning blank lines in display 2022-03-17 22:16:45 +07:00
vendor Add symlinks for building PHP parser 2022-03-09 23:55:18 +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 Prefer aligning blank lines in display 2022-03-17 22:16:45 +07:00
CITATION.cff Add citation information 2021-11-23 09:52:39 +07:00
Cargo.lock Use Myers' diff everywhere 2022-03-12 12:29:34 +07:00
Cargo.toml Tweak motto 2022-03-13 22:14:03 +07:00
LICENSE Roll year 2022-02-05 15:58:45 +07:00
README.md Adding support for PHP 2022-03-09 23:52:31 +07:00
build.rs Adding support for PHP 2022-03-09 23:52:31 +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.

Demo 1: Wrapping Expressions

Difftastic understands expression nesting. If you wrap an expression in an if statement, difftastic understands 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 closing parenthesis has been added.

Elisp comparison screenshot

Demo 2: 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:

  • Bash
  • C
  • C++
  • C#
  • Clojure
  • Common Lisp
  • CSS
  • 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

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.