/
deltaapplier.go
56 lines (49 loc) · 1.42 KB
/
deltaapplier.go
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
package octodiff
import (
"bytes"
"errors"
"io"
)
// ApplyDelta builds thew new file.
// Verifying the hash of the written file is done seperately, to allow the caller to use
// a buffered output writer to improve performance.
func ApplyDelta(basisFile io.ReadSeeker, deltaReader DeltaReader, output io.Writer) error {
buffer := make([]byte, defaultReadBufferSize)
return deltaReader.Apply(
func(bytes []byte) error {
_, err := output.Write(bytes)
return err
},
func(offset int64, length int64) error {
_, err := basisFile.Seek(offset, io.SeekStart)
if err != nil {
return err
}
iter := NewReaderIteratorBufferNBytes(basisFile, buffer, length)
for iter.Next() {
_, err = output.Write(iter.Current)
if err != nil {
return err
}
}
return iter.Err()
})
}
func VerifyNewFile(newFile io.Reader, deltaReader DeltaReader) error {
sourceFileHash, err := deltaReader.ExpectedHash()
if err != nil {
return err
}
algorithm, err := deltaReader.HashAlgorithm()
if err != nil {
return err
}
actualHash, err := algorithm.HashOverReader(newFile)
if err != nil {
return err
}
if !bytes.Equal(sourceFileHash, actualHash) {
return errors.New("verification of the patched file failed. The SHA1 hash of the patch result file, and the file that was used as input for the delta, do not match. This can happen if the basis file changed since the signatures were calculated")
}
return nil
}