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
|
# µDiff
<p>
<a href="https://github.com/aymanbagabas/go-udiff/releases"><img src="https://img.shields.io/github/release/aymanbagabas/go-udiff.svg" alt="Latest Release"></a>
<a href="https://pkg.go.dev/github.com/aymanbagabas/go-udiff?tab=doc"><img src="https://godoc.org/github.com/golang/gddo?status.svg" alt="Go Docs"></a>
<a href="https://github.com/aymanbagabas/go-udiff/actions"><img src="https://github.com/aymanbagabas/go-udiff/workflows/build/badge.svg" alt="Build Status"></a>
<a href="https://goreportcard.com/report/github.com/aymanbagabas/go-udiff"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/aymanbagabas/go-udiff"></a>
</p>
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 main
import (
"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 main
import (
"fmt"
"github.com/aymanbagabas/go-udiff"
"github.com/aymanbagabas/go-udiff/myers"
)
func main() {
a := "Hello, world!\n"
b := "Hello, Go!\nSay hi to µDiff"
edits := myers.ComputeEdits(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 main
import (
"fmt"
"github.com/aymanbagabas/go-udiff"
"github.com/aymanbagabas/go-udiff/myers"
)
func main() {
a := "Hello, world!\n"
b := "Hello, Go!\nSay hi to µDiff"
edits := myers.ComputeEdits(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).
|