From aff7f195805661ceeb58878b7e7daca8db6930b5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 25 Jul 2023 07:53:09 +0530 Subject: [PATCH] DRYer --- tools/rsync/algorithm.go | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/tools/rsync/algorithm.go b/tools/rsync/algorithm.go index 8d5953a11..9dd47082b 100644 --- a/tools/rsync/algorithm.go +++ b/tools/rsync/algorithm.go @@ -257,7 +257,7 @@ func (r *rsync) CreateSignatureIterator(target io.Reader) func() (BlockHash, err } // Apply the difference to the target. -func (r *rsync) ApplyDelta(alignedTarget io.Writer, target io.ReadSeeker, op Operation) error { +func (r *rsync) ApplyDelta(output io.Writer, target io.ReadSeeker, op Operation) error { var err error var n int var block []byte @@ -268,7 +268,13 @@ func (r *rsync) ApplyDelta(alignedTarget io.Writer, target io.ReadSeeker, op Ope r.checksummer = r.checksummer_constructor() } - write_block := func(op Operation) error { + write := func(b []byte) (err error) { + if _, err = r.checksummer.Write(b); err == nil { + _, err = output.Write(b) + } + return err + } + write_block := func(op Operation) (err error) { if _, err = target.Seek(int64(r.BlockSize*int(op.BlockIndex)), os.SEEK_SET); err != nil { return err } @@ -277,14 +283,10 @@ func (r *rsync) ApplyDelta(alignedTarget io.Writer, target io.ReadSeeker, op Ope if err != io.ErrUnexpectedEOF { return err } + err = nil } block = buffer[:n] - r.checksummer.Write(block) - _, err = alignedTarget.Write(block) - if err != nil { - return err - } - return nil + return write(block) } switch op.Type { @@ -295,26 +297,16 @@ func (r *rsync) ApplyDelta(alignedTarget io.Writer, target io.ReadSeeker, op Ope BlockIndex: i, }) if err != nil { - if err == io.EOF { - break - } return err } } case OpBlock: err = write_block(op) if err != nil { - if err == io.EOF { - break - } return err } case OpData: - r.checksummer.Write(op.Data) - _, err = alignedTarget.Write(op.Data) - if err != nil { - return err - } + return write(op.Data) case OpHash: actual := r.checksummer.Sum(nil) if !bytes.Equal(actual, op.Data) {