restorer: move zeroPrefixLen to restic package
This commit is contained in:
parent
a5ebd5de4b
commit
34fe1362da
4 changed files with 77 additions and 48 deletions
|
@ -3,7 +3,9 @@
|
|||
|
||||
package restorer
|
||||
|
||||
import "bytes"
|
||||
import (
|
||||
"github.com/restic/restic/internal/restic"
|
||||
)
|
||||
|
||||
// WriteAt writes p to f.File at offset. It tries to do a sparse write
|
||||
// and updates f.size.
|
||||
|
@ -16,7 +18,7 @@ func (f *partialFile) WriteAt(p []byte, offset int64) (n int, err error) {
|
|||
|
||||
// Skip the longest all-zero prefix of p.
|
||||
// If it's long enough, we can punch a hole in the file.
|
||||
skipped := zeroPrefixLen(p)
|
||||
skipped := restic.ZeroPrefixLen(p)
|
||||
p = p[skipped:]
|
||||
offset += int64(skipped)
|
||||
|
||||
|
@ -33,21 +35,3 @@ func (f *partialFile) WriteAt(p []byte, offset int64) (n int, err error) {
|
|||
|
||||
return n, err
|
||||
}
|
||||
|
||||
// zeroPrefixLen returns the length of the longest all-zero prefix of p.
|
||||
func zeroPrefixLen(p []byte) (n int) {
|
||||
// First skip 1kB-sized blocks, for speed.
|
||||
var zeros [1024]byte
|
||||
|
||||
for len(p) >= len(zeros) && bytes.Equal(p[:len(zeros)], zeros[:]) {
|
||||
p = p[len(zeros):]
|
||||
n += len(zeros)
|
||||
}
|
||||
|
||||
for len(p) > 0 && p[0] == 0 {
|
||||
p = p[1:]
|
||||
n++
|
||||
}
|
||||
|
||||
return n
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue