forked from rosa/hakurei
internal/pkg: streaming archive reader/writer
This is much more robust and efficient than the simple buffering implementation for larger files. Allocations happen almost exclusively in WalkDir. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
+14
-4
@@ -26,7 +26,17 @@ func padSize[T int | int64](sz T) T {
|
||||
return (wordSize - (sz)%wordSize) % wordSize
|
||||
}
|
||||
|
||||
// WriteReport writes a report of all available [PArtifact] to w.
|
||||
// countWriter records total amount of data written.
|
||||
type countWriter uint64
|
||||
|
||||
// Write records the size of p.
|
||||
func (w *countWriter) Write(p []byte) (n int, err error) {
|
||||
n = len(p)
|
||||
*w += countWriter(n)
|
||||
return
|
||||
}
|
||||
|
||||
// WriteReport writes a report of all available [Artifact] to w.
|
||||
func WriteReport(msg message.Msg, w io.Writer, c *pkg.Cache) error {
|
||||
var (
|
||||
zero [wordSize]byte
|
||||
@@ -90,12 +100,12 @@ func WriteReport(msg message.Msg, w io.Writer, c *pkg.Cache) error {
|
||||
}
|
||||
|
||||
// existence of status implies cured artifact
|
||||
var n int
|
||||
var n countWriter
|
||||
if pathname, _, err := c.Cure(a); err != nil {
|
||||
return err
|
||||
} else if n, err = pkg.Flatten(
|
||||
} else if err = pkg.Write(
|
||||
os.DirFS(pathname.String()), ".",
|
||||
io.Discard,
|
||||
&n,
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user