40 lines
616 B
Go
40 lines
616 B
Go
package repocli
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
func Copy(ctx context.Context, writer io.Writer, reader io.Reader) (int64, error) {
|
|
var err error
|
|
var size int64
|
|
var halt bool
|
|
buffer := make([]byte, 1024*4)
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
err = errors.New("Break copy by context")
|
|
break
|
|
default:
|
|
}
|
|
rsize, err := reader.Read(buffer)
|
|
if err == io.EOF {
|
|
err = nil
|
|
halt = true
|
|
}
|
|
if err != nil {
|
|
return size, err
|
|
}
|
|
wsize, err := writer.Write(buffer[0:rsize])
|
|
size += int64(wsize)
|
|
if err != nil {
|
|
return size, err
|
|
}
|
|
if halt {
|
|
break
|
|
}
|
|
}
|
|
return size, err
|
|
}
|