29 lines
602 B
Go
29 lines
602 B
Go
|
package copy
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
"time"
|
||
|
|
||
|
"github.com/containers/image/types"
|
||
|
)
|
||
|
|
||
|
// progressReader is a reader that reports its progress on an interval.
|
||
|
type progressReader struct {
|
||
|
source io.Reader
|
||
|
channel chan types.ProgressProperties
|
||
|
interval time.Duration
|
||
|
artifact types.BlobInfo
|
||
|
lastTime time.Time
|
||
|
offset uint64
|
||
|
}
|
||
|
|
||
|
func (r *progressReader) Read(p []byte) (int, error) {
|
||
|
n, err := r.source.Read(p)
|
||
|
r.offset += uint64(n)
|
||
|
if time.Since(r.lastTime) > r.interval {
|
||
|
r.channel <- types.ProgressProperties{Artifact: r.artifact, Offset: r.offset}
|
||
|
r.lastTime = time.Now()
|
||
|
}
|
||
|
return n, err
|
||
|
}
|