aboutsummaryrefslogtreecommitdiff
path: root/delta.go
diff options
context:
space:
mode:
authorn-peugnet <n.peugnet@free.fr>2021-09-23 18:10:30 +0200
committern-peugnet <n.peugnet@free.fr>2021-09-23 18:10:30 +0200
commita07bbe4ef22d642347d18f0e0a62d24868500d23 (patch)
treedd634dc57d5525033146c197dc6822a8c0466eb0 /delta.go
parente4f6bf0d972b8e851a6fcaa20c1f305680f61884 (diff)
downloaddna-backup-a07bbe4ef22d642347d18f0e0a62d24868500d23.tar.gz
dna-backup-a07bbe4ef22d642347d18f0e0a62d24868500d23.zip
Testing with Fdelta as the differ
Diffstat (limited to 'delta.go')
-rw-r--r--delta.go43
1 files changed, 35 insertions, 8 deletions
diff --git a/delta.go b/delta.go
index ff42e86..a127580 100644
--- a/delta.go
+++ b/delta.go
@@ -5,13 +5,9 @@ import (
"github.com/gabstv/go-bsdiff/pkg/bsdiff"
"github.com/gabstv/go-bsdiff/pkg/bspatch"
+ "github.com/mdvan/fdelta"
)
-type DeltaCodec interface {
- Differ
- Patcher
-}
-
type Differ interface {
Diff(source io.Reader, target io.Reader, patch io.Writer) error
}
@@ -20,13 +16,44 @@ type Patcher interface {
Patch(source io.Reader, target io.Writer, patch io.Reader) error
}
-// TODO: maybe move this in its own file ?
type Bsdiff struct{}
-func (*Bsdiff) Diff(source io.Reader, target io.Reader, patch io.Writer) error {
+func (Bsdiff) Diff(source io.Reader, target io.Reader, patch io.Writer) error {
return bsdiff.Reader(source, target, patch)
}
-func (*Bsdiff) Patch(source io.Reader, target io.Writer, patch io.Reader) error {
+func (Bsdiff) Patch(source io.Reader, target io.Writer, patch io.Reader) error {
return bspatch.Reader(source, target, patch)
}
+
+type Fdelta struct{}
+
+func (Fdelta) Diff(source io.Reader, target io.Reader, patch io.Writer) error {
+ sourceBuf, err := io.ReadAll(source)
+ if err != nil {
+ return err
+ }
+ targetBuf, err := io.ReadAll(target)
+ if err != nil {
+ return err
+ }
+ _, err = patch.Write(fdelta.Create(sourceBuf, targetBuf))
+ return err
+}
+
+func (Fdelta) Patch(source io.Reader, target io.Writer, patch io.Reader) error {
+ sourceBuf, err := io.ReadAll(source)
+ if err != nil {
+ return err
+ }
+ patchBuf, err := io.ReadAll(patch)
+ if err != nil {
+ return err
+ }
+ targetBuf, err := fdelta.Apply(sourceBuf, patchBuf)
+ if err != nil {
+ return err
+ }
+ _, err = target.Write(targetBuf)
+ return err
+}