# README
µDiff
Micro diff (µDiff) is a Go library that implements the Myers' 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. If you are looking for a way to parse unified diffs, check out sourcegraph/go-diff.
This is merely a copy of the Golang tools internal diff package with a few modifications to export package symbols. All credit goes to the Go authors.
Usage
You can import the package using the following command:
go get github.com/aymanbagabas/go-udiff
Examples
Generate a unified diff for strings a
and b
.
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)
unified, _ := udiff.ToUnified("a.txt", "b.txt", a, edits)
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.
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:
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)
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 No longer reliable. See #123 and #141.
- hexops/gotextdiff Takes the same approach but looks like the project is abandoned.
- sourcegraph/go-diff It doesn't compute diffs. Great package for parsing and printing unified diffs.
Contributing
Please send any contributions upstream. Pull requests made against the upstream diff package are welcome.
License
BSD 3-Clause and MIT.
# Packages
Package difftest supplies a set of tests that will operate on any implementation of a diff algorithm as exposed by diff "github.com/neilotoole/sq/libsq/core/diffdoc/internal/go-udiff".
package lcs contains code to find longest-common-subsequences (and diffs).
Package myers implements the Myers diff algorithm.
# Functions
Apply applies a sequence of edits to the src buffer and returns the result.
ApplyBytes is like Apply, but it accepts a byte slice.
Bytes computes the differences between two byte slices.
SortEdits orders a slice of Edits by (start, end) offset.
Strings computes the differences between two strings.
ToUnified applies the edits to content and returns a unified diff.
ToUnifiedDiff takes a file contents and a sequence of edits, and calculates a unified diff that represents those edits.
Unified returns a unified diff of the old and new strings.
# Constants
Delete is the operation kind for a line that is present in the input but not in the output.
Equal is the operation kind for a line that is the same in the input and output, often used to provide context around edited lines.
Insert is the operation kind for a line that is new in the output.
# Type aliases
OpKind is used to denote the type of operation a line represents.
UnifiedDiff is a unified diff.