diff options
| author | 2026-02-21 03:46:50 +0800 | |
|---|---|---|
| committer | 2026-02-21 03:46:50 +0800 | |
| commit | 27ee98e7a9a8693db59e755739e10c1c1ba852b4 (patch) | |
| tree | 2b69d6912851d36b06c0a795391120d204605ffe /objectstore/loose/parse.go | |
| parent | objectstore: ReadReaderContent should have an advisory declared length (diff) | |
| signature | No signature | |
objectstore/loose: Add loose backend
Diffstat (limited to 'objectstore/loose/parse.go')
| -rw-r--r-- | objectstore/loose/parse.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/objectstore/loose/parse.go b/objectstore/loose/parse.go new file mode 100644 index 00000000..30c7e251 --- /dev/null +++ b/objectstore/loose/parse.go @@ -0,0 +1,45 @@ +package loose + +import ( + "bufio" + "compress/zlib" + "errors" + "io" + "os" + + "codeberg.org/lindenii/furgit/objectheader" + "codeberg.org/lindenii/furgit/objecttype" +) + +// decodeAll inflates the full loose object payload from file. +func decodeAll(file *os.File) ([]byte, error) { + zr, err := zlib.NewReader(file) + if err != nil { + return nil, err + } + defer func() { _ = zr.Close() }() + return io.ReadAll(zr) +} + +// parseRaw parses a loose object payload in "type size\0content" format. +func parseRaw(raw []byte) (objecttype.Type, []byte, error) { + ty, _, headerLen, ok := objectheader.Parse(raw) + if !ok { + return objecttype.TypeInvalid, nil, errors.New("objectstore/loose: malformed object header") + } + return ty, raw[headerLen:], nil +} + +// readHeader reads and parses a loose object header from br. +// br must be positioned at the start of decoded loose object bytes. +func readHeader(br *bufio.Reader) (objecttype.Type, int64, error) { + header, err := br.ReadSlice(0) + if err != nil { + return objecttype.TypeInvalid, 0, err + } + ty, size, _, ok := objectheader.Parse(header) + if !ok { + return objecttype.TypeInvalid, 0, errors.New("objectstore/loose: malformed object header") + } + return ty, size, nil +} |
