diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-06-03 15:51:43 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-06-03 16:00:36 +0900 |
| commit | 42cea1e7c6d1ea0658e6b4d2a1f12f98b9c0dd22 (patch) | |
| tree | 5e04f8ff2ea2d32405c2a11fad3ea966bade27f3 /internal/rosa/report.go | |
| parent | 83498b5a8af4edc6e4f9408fec2d527c2be982a7 (diff) | |
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>
Diffstat (limited to 'internal/rosa/report.go')
| -rw-r--r-- | internal/rosa/report.go | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/internal/rosa/report.go b/internal/rosa/report.go index 29a74233..54f60fb3 100644 --- a/internal/rosa/report.go +++ b/internal/rosa/report.go @@ -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 } |
