https://github.com/icedream/go-bsdiff
Golang wrapper for @mendsley's bsdiff C library.
https://github.com/icedream/go-bsdiff
binary-diffing bsdiff go golang golang-library patch
Last synced: about 1 month ago
JSON representation
Golang wrapper for @mendsley's bsdiff C library.
- Host: GitHub
- URL: https://github.com/icedream/go-bsdiff
- Owner: icedream
- License: bsd-2-clause
- Created: 2017-02-16T18:00:50.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2025-11-01T02:02:04.000Z (4 months ago)
- Last Synced: 2025-11-01T04:06:13.236Z (4 months ago)
- Topics: binary-diffing, bsdiff, go, golang, golang-library, patch
- Language: C
- Homepage:
- Size: 2.35 MB
- Stars: 26
- Watchers: 1
- Forks: 8
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# bsdiff for Go
This wrapper implementation for Golang reuses the existing
C version of bsdiff as provided by @mendsley and wraps it
into a Go package, abstracting away all the cgo work that
would need to be done otherwise.
## Installation
The library and the helper binaries `go-bsdiff` and `go-bspatch` can be installed like this:
go get -v github.com/icedream/go-bsdiff/...
## Usage in application code
For exact documentation of the library check out [GoDoc](https://godoc.org/github.com/icedream/go-bsdiff).
Library functionality is provided both as a package `bsdiff` containing both
methods `Diff` and `Patch`, or as subpackages `diff` and `patch` which each
only link the wanted functionality.
Below example will generate a patch and apply it again in one go. This code
is not safe against errors but it shows how to use the provided routines:
```go
package main
import (
"os"
"github.com/icedream/go-bsdiff"
// Or use the subpackages to only link what you need:
//"github.com/icedream/go-bsdiff/diff"
//"github.com/icedream/go-bsdiff/patch"
)
const (
oldFilePath = "your_old_file.dat"
newFilePath = "your_new_file.dat"
patchFilePath = "the_generated.patch"
)
func generatePatch() error {
oldFile, _ := os.Open(oldFilePath)
defer oldFile.Close()
newFile, _ := os.Open(newFilePath)
defer newFile.Close()
patchFile, _ := os.Create(patchFilePath)
defer patchFile.Close()
return bsdiff.Diff(oldFile, newFile, patchFile)
}
func applyPatch() error {
oldFile, _ := os.Open(oldFilePath)
defer oldFile.Close()
newFile, _ := os.Create(newFilePath)
defer newFile.Close()
patchFile, _ := os.Open(patchFilePath)
defer patchFile.Close()
return bsdiff.Patch(oldFile, newFile, patchFile)
}
func main() {
generatePatch()
applyPatch()
}
```
## Usage of the tools
The tools `go-bsdiff` and `go-bspatch` both provide a `--help` flag to print
out all information but in their simplest form, they can be used like this:
```sh
# Creates a patch file $the_generated with differences from
# $your_old_file to $your_new_file.
go-bsdiff "$your_old_file" "$your_new_file" "$the_generated"
# Applies a patch file $the_generated on $your_old_file
# and saves the new file to $your_new_file.
go-bspatch "$your_old_file" "$your_new_file" "$the_generated"
```
## Motivation
There is [a Go implementation of an older version of bsdiff called binarydist](https://github.com/kr/binarydist). The original bsdiff tool has since been updated so patches generating using the original tool are no longer compatible with the Go implementation. I don't know what the changes between the versions are and unfortunately I don't have the time to search for these changes and port them over as a pull request, otherwise I'd have done that instead.
Additionally, @mendsley has already done the extra work of rewriting the code to be embeddable in any application code as a library. So why not make use of cgo, which I was going to look into in more detail at some point anyways?
By now, there is also [TotallyGamerJet's purely Go implementation of bsdiff 4](https://github.com/TotallyGamerJet/bsdiff). It does not rely on cgo at all and may suit your use-case better.
## License
Just like bsdiff, this project is licensed under the 2-clause BSD license (or Simplified BSD license). You can check [LICENSE.txt](LICENSE.txt) for more information.