diff options
| author | 2026-02-21 18:18:43 +0800 | |
|---|---|---|
| committer | 2026-02-21 18:18:43 +0800 | |
| commit | 1fedf54fa79d5bdf67971d89924653e3bac7179e (patch) | |
| tree | ff93400f559bf98cf03dac3623ce86cf981006a6 /objectstore/loose/read_reader.go | |
| parent | iolimit: Add ExpectLengthReader (diff) | |
| signature | No signature | |
objectstore/{loose,packed}: Use iolimit v0.1.23
Diffstat (limited to 'objectstore/loose/read_reader.go')
| -rw-r--r-- | objectstore/loose/read_reader.go | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/objectstore/loose/read_reader.go b/objectstore/loose/read_reader.go index dde0de07..68df820d 100644 --- a/objectstore/loose/read_reader.go +++ b/objectstore/loose/read_reader.go @@ -2,18 +2,19 @@ package loose import ( "bufio" + "bytes" "compress/zlib" "errors" "io" "os" + "codeberg.org/lindenii/furgit/internal/iolimit" "codeberg.org/lindenii/furgit/objectid" "codeberg.org/lindenii/furgit/objecttype" ) type objectReader struct { - // reader is the stream exposed by Read. It may be the raw zlib reader - // (full object) or a buffered reader positioned at content bytes only. + // reader is the stream exposed by Read. reader io.Reader // file is the underlying loose object file and is closed by Close. file *os.File @@ -53,10 +54,22 @@ func (store *Store) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) if err != nil { return nil, err } + + br := bufio.NewReader(zr) + header, _, size, err := readHeader(br) + if err != nil { + _ = zr.Close() + _ = file.Close() + return nil, err + } + return &objectReader{ - reader: zr, - file: file, - zr: zr, + reader: io.MultiReader( + bytes.NewReader(header), + iolimit.ExpectLengthReader(br, size), + ), + file: file, + zr: zr, }, nil } @@ -69,7 +82,7 @@ func (store *Store) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, in } br := bufio.NewReader(zr) - ty, size, err := readHeader(br) + _, ty, size, err := readHeader(br) if err != nil { _ = zr.Close() _ = file.Close() @@ -77,7 +90,7 @@ func (store *Store) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, in } return ty, size, &objectReader{ - reader: br, + reader: iolimit.ExpectLengthReader(br, size), file: file, zr: zr, }, nil |
