This gets 100% test coverage for the functions involved in parsing Git-style file headers. Whether that actually makes it correct remains to be seen.
go-gitdiff
A Go library for parsing and applying patches generated by git diff, git show, and git format-patch. It can also parse and apply unified diffs
generated by the standard diff tool.
It supports both standard line-oriented / text patches and Git binary patches.
Status
In development, most functionality is currently missing, incomplete, or broken.
Why another git/unified diff parser?
Several packages with similar functionality exist, so why did I write another?
-
No other packages I found support binary diffs, as generated with the
--binaryflag. This is the main reason for writing a new packages, as the format is pretty different from line-oriented diffs and is unique to Git. -
Most other packages only parse patches, so you need another package to apply them (and if they do support applies, it is only for text files.)
-
This package aims to accept anything that
git applyaccepts, and closely follows the logic inapply.c. -
It seemed like a fun thing to write and a good way to learn more about Git.
Known Issues and Differences From Git
-
Certain types of invalid input that I believe are accepted by
git applygenerate errors in this library. These include:- Numbers immediately followed by non-numeric characters
- Trailing characters on a line after valid or expected content
-
The translation from C to Go may have introduced inconsistencies in the way Unicode file names are handled; these are bugs, so please report any issues of this type.
-
When reading headers, object IDs are always loaded from
indexlines, regardless of their length. Git calls these fields{new,old}_oid_prefixbut appears to only load full-length OIDs, ignoring abbreviations.