1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
|
## 0.13 (unreleased)
### Parsing
Added Ruby support.
Updated the C, CSS and JSON parsers to the latest upstream versions.
## 0.12
### Display
Every hunk is now shown with the file name and a hunk number. This
makes it easier to see which file you're looking at when there are
many changes.
Keywords in added/removed regions are now shown in bold, to give
modified regions basic syntax highlighting. Previously, all
added/removed regions were bold.
Lines with changes are now shown in a different colour in side-by-side
display.
The display logic has been written in terms of a `Hunk` type. This
produces more accurate context, with better alignment, especially when
the context contains blank lines.
If only a single side has changes (e.g. additions but no removals),
only one column is shown, to maximise display usage.
Difftastic now wraps rather than truncating lines that are too long
for the terminal width.
If a file has no syntactic changes, difftastic now shows the file name
consistently with changed files.
### Command Line Interface
The difftastic binary is now named `difft`, to reduce typing during
usage.
### Parsing
Updated to latest upstream Haskell parser ([commit
d72f2e4](https://github.com/tree-sitter/tree-sitter-haskell/commit/d72f2e42c0d5ccf8e8b1c39e3642428317e8fe02)).
### Diffing
Fixed a bug when diffing multiline comments where unchanged parts were
not highlighted correctly.
## 0.11
### Parsing
Improved handling of paired delimiters, particularly in C, C++ and C#.
Improved word splitting in when diffing similar comments (it's now
more granular).
Fixed a rare issue where single-item lists were flattened.
### Diffing
Diff calculations are now greedier when syntax nodes are identical, making
diffing significantly faster when most syntax nodes are the same.
### Integration
Added support for Mercurial, see [this section in the
manual](http://difftastic.wilfred.me.uk/getting_started.html#mercurial-external-diffs)
for instructions.
### Display
Added basic syntax highlighting for comments (dimmed) and keywords
(bold) in unchanged source code.
Characters that don't have a position in the parsed syntax tree are
now displayed in purple, to make bugs more obvious. Previously they
were dimmed.
## 0.10.1
### Build
Fix compilation on macOS where the C++ compiler defaulted to a
version of C++ older than C++14.
## 0.10
### Parsing
Added a C parser.
Added a C++ parser. Difftastic prefers the C++ parser for `.h`
files. Please file a bug if you see issues.
Added a C# parser.
Added a Haskell parser.
Removed legacy regex-based parsing backend.
### Diffing
Some additional runtime optimisations.
### Manual
Added a chapter on difficult cases for tree diff algorithms.
## 0.9
### Parsing
Added TypeScript parser and TSX parser. Added Elixir parser.
The following extensions are now associated with Clojure: `.bb`,
`.boot`, `.clj`, `.cljc`, `.clje`, `.cljs`, `.cljx`, `.edn`, `.joke`
and `.joker`.
Fixed an issue with parsing integer values in CSS with units,
e.g. `123px`.
Improved parsing of Rust punctuation like `&` and `::` inside macro
invocations. Improved handling of `|closure_param|` and `[` `]`
delimiters in Rust.
The line-based parser for text files now uses word-level diffs.
### Diffing
Optimised Dijkstra implementation, improving runtime performance.
### Display
Side-by-side displays now uses the same width for the left and right
columns, regardless of the content.
### Internals
Difftastic is now a library with a main binary. No APIs are considered
stable for external usage. This is intended to make benchmarking
easier.
## 0.8
### Git integration
Fixed a crash on removing whole files.
### Parsing
Tree-sitter parsing is now the default, unless the environment
variable DFT_RX is set.
Tree-sitter parser: Improved handling of string literals. Improved
matching of delimiters.
Added Python parser.
Added Java parser.
JSON (legacy parser): fixed parsing string literals (broken in 0.7).
Removed Scheme support, as there's no tree-sitter parser available.
### Display
Fixed crashes on files with non-ASCII characters on long lines.
Fixed an issue where multiline comments were not highlighted
correctly.
Improved display to better use the whole width when whole files are
added or removed.
### Command Line Interface
Removed the unused `--lang` argument.
Difftastic now handles writing to a closed pipe (SIGPIPE) gracefully
rather than crashing.
Difftastic now has some debugging logs available. `RUST_LOG=trace`
will show information on the route found during graph solving.
## 0.7
### Git integration
Fixed issues when adding/removing a whole file meant that difftastic
didn't display anything.
Fixed a crash on renaming a file.
Colour is now enabled when using git with a pager.
### Display
Side-by-side display now uses "..." for column numbers when aligning
lines. This makes hunks more obvious, but hunks now also have two
blank lines between them to make it clearer.
Fixed an issue where screen width was not shared evenly by LHS and
RHS.
Side-by-side display will now use the full width of the screen when
using a pager (i.e. if stdout is a not a TTY).
Side-by-side display now handles whole file additions better,
preferring a single column display.
Display width calculations are now based on the longest line visible
in the diff, not the longest line in the file.
### Parsing
Added tree-sitter parsers. These have known bugs, but you can try
them by setting the environment variable `DFT_TS=y`.
Fixed handling of `->` in Rust.
### Diffing
Difftastic will now prefer matching up comments that are similar
(according to levenshtein distance).
Contiguous syntax logic now considers close delimiter positions, so
`[ \n ];` now treats the `;` atom as contiguous.
Fixed an issue where diffs would prefer prefer a low depth change on a
delimiter over a delimiter that gave contiguous changes.
### Command Line Interface
Removed the `--width` argument.
Added debug options `--dump-syntax` and `--dump-ts` for viewing parse
trees. The output of these files may change without notice.
## 0.6
### Parsing
Fixed handling of `@`, `<` and `>` in elisp.
Fixed crash on binary files. Difftastic now simply shows "binary" for
files that don't look like text.
Added a basic Go parser.
### Diffing
Fixed an issue where comment replacements were not detected.
Changed words in comments are now only highlighted when comments are
relatively similar (according to their Levenshtein distance).
Multiline comments are now considered unchanged if only their
indentation changes.
Improved alignment for lines at the beginning of a changed group of
lines.
Improved horizontal spacing between before and after code shown.
Fixed an issue where source code containing tab characters was not
correctly aligned.
### Command Line Interface
Removed unused `--inline` and `--context` arguments.
Fixed crash when called with no arguments.
## 0.5
### Parsing
Fixed a crash on parsing non-ASCII source files. Fixed a crash on
files without an extension. Fixed crashes on empty files.
Input files that aren't valid UTF-8 are now replaced with � rather
than giving up.
Improved parsing for Rust punctuation.
Improved parsing for OCaml punctuation, including `:=` and `method!`.
Improved parsing for Emacs Lisp symbols containing `+` and `=`, and
punctuation of `#`, `.` and `&`.
Improved parsing for Scheme symbols containing `=`, and punctuation of
`#` and `.`.
Improved parsing of `=` and `&` in Clojure.
Improved parsing of `:`, `,`, and constants in JSON.
Improved parsing of string literals in all languages, supporting
escaped delimiters such as `"\""` and removing incorrect support for
single-quoted strings in JSON.
### Diffing
Reduced memory usage when diffing.
Difftastic now highlights word-level changes between comments.
Diffing now prefers contiguous nodes even when entering a list, so
`(foo` is considered contiguous.
Large AST trees with very few common nodes are now considered wholly
novel, rather than trying to match up the few common nodes. This
avoids nonsensical diffs when toplevel function A is completely
replaced with function B and they only have something trivial in
common (e.g. the `function` keyword).
### Command Line Interface
Improved `--help`.
### Integration
It's now possible to use `difftastic` with `git diff` and `git show`!
## 0.4
### Parsing
Improved parsing for Rust macro definitions and punctuation.
Improved parsing for OCaml punctuation, and added `.mli` as an OCaml
file extension.
### Diffing
Diff calculation is now significantly faster.
Difftastic now considers nesting depth when comparing AST nodes, and
tries to match nodes with similar nesting levels.
Difftastic now prefers marking multiple items on the same line as
novel, rather than adjacent items on different lines. This helps avoid
[sliders](https://twitter.com/_wilfredh/status/1411949035871637509),
where the diff chooses a keyword on the 'wrong' side.
Fixed an issue where complex diffs would not display some unchanged
lines.
### Robustness
Fixed a crash when diff context included the first line.
Fixed a crash when plain text content contained certain non-ASCII
characters.
## 0.3
Diffs are now displayed with unchanged lines aligned to the other side.
Improved Rust parsing to recognise lifetime syntax `'foo`, character
literals `'x'` and punctuation.
Improved punctuation parsing for OCaml and JS.
Fixed an issue where the diff calculated may not be minimal.
Fixed a crash on files with no changes.
## 0.2
First version using Dijkstra's algorithm for calculating diffs.
## 0.1
Experimenting with different implementation ideas.
|