Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/aymanbagabas/go-udiff
µDiff - a micro Go diffing library
https://github.com/aymanbagabas/go-udiff
diff go golang
Last synced: 11 days ago
JSON representation
µDiff - a micro Go diffing library
- Host: GitHub
- URL: https://github.com/aymanbagabas/go-udiff
- Owner: aymanbagabas
- License: bsd-3-clause
- Created: 2023-04-16T07:05:37.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-10-01T19:45:28.000Z (about 1 month ago)
- Last Synced: 2024-10-16T19:48:30.295Z (27 days ago)
- Topics: diff, go, golang
- Language: Go
- Homepage:
- Size: 96.7 KB
- Stars: 165
- Watchers: 3
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE-BSD
Awesome Lists containing this project
README
# µDiff
Micro diff (µDiff) is a Go library that implements the
[Myers'](http://www.xmailserver.org/diff2.pdf) diffing algorithm. It aims to
provide a minimal API to compute and apply diffs with zero dependencies. It
also supports generating diffs in the [Unified Format](https://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html).
If you are looking for a way to parse unified diffs, check out
[sourcegraph/go-diff](https://github.com/sourcegraph/go-diff).This is merely a copy of the [Golang tools internal diff package](https://github.com/golang/tools/tree/master/internal/diff)
with a few modifications to export package symbols. All credit goes to the [Go authors](https://go.dev/AUTHORS).## Usage
You can import the package using the following command:
```bash
go get github.com/aymanbagabas/go-udiff
```## Examples
Generate a unified diff for strings `a` and `b` with the default number of
context lines (3). Use `udiff.ToUnified` to specify the number of context
lines.```go
package mainimport (
"fmt""github.com/aymanbagabas/go-udiff"
)func main() {
a := "Hello, world!\n"
b := "Hello, Go!\nSay hi to µDiff"
unified := udiff.Unified("a.txt", "b.txt", a, b)
fmt.Println(unified)
}
``````
--- a.txt
+++ b.txt
@@ -1 +1,2 @@
-Hello, world!
+Hello, Go!
+Say hi to µDiff
\ No newline at end of file
```Apply changes to a string.
```go
package mainimport (
"fmt""github.com/aymanbagabas/go-udiff"
)func main() {
a := "Hello, world!\n"
b := "Hello, Go!\nSay hi to µDiff"edits := udiff.Strings(a, b)
final, err := udiff.Apply(a, edits)
if err != nil {
panic(err)
}fmt.Println(final)
}
``````
Hello, Go!
Say hi to µDiff
```To get a line-by-line diff and edits:
```go
package mainimport (
"fmt""github.com/aymanbagabas/go-udiff"
)func main() {
a := "Hello, world!\n"
b := "Hello, Go!\nSay hi to µDiff"edits := udiff.Strings(a, b)
d, err := udiff.ToUnifiedDiff("a.txt", "b.txt", a, edits, udiff.DefaultContextLines)
if err != nil {
panic(err)
}for _, h := range d.Hunks {
fmt.Printf("hunk: -%d, +%d\n", h.FromLine, h.ToLine)
for _, l := range h.Lines {
fmt.Printf("%s %q\n", l.Kind, l.Content)
}
}
}
``````
hunk: -1, +1
delete "Hello, world!\n"
insert "Hello, Go!\n"
insert "Say hi to µDiff"
```## Alternatives
- [sergi/go-diff](https://github.com/sergi/go-diff) No longer reliable. See [#123](https://github.com/sergi/go-diff/issues/123) and [#141](https://github.com/sergi/go-diff/pull/141).
- [hexops/gotextdiff](https://github.com/hexops/gotextdiff) Takes the same approach but looks like the project is abandoned.
- [sourcegraph/go-diff](https://github.com/sourcegraph/go-diff) It doesn't compute diffs. Great package for parsing and printing unified diffs.## Contributing
Please send any contributions [upstream](https://github.com/golang/tools). Pull
requests made against [the upstream diff package](https://github.com/golang/tools/tree/master/internal/diff)
are welcome.## License
[BSD 3-Clause](./LICENSE-BSD) and [MIT](./LICENSE-MIT).