ref: 9053c85456bd9b4457b588610eeef1b8dfff2b89
dir: /format/pack/ingest/thin_append.go/
package ingest
import (
"compress/zlib"
"hash/crc32"
"io"
"codeberg.org/lindenii/furgit/internal/intconv"
"codeberg.org/lindenii/furgit/objectid"
"codeberg.org/lindenii/furgit/objecttype"
)
// appendBaseObject appends one base object as a new packed non-delta entry.
func appendBaseObject(state *ingestState, id objectid.ObjectID, realType objecttype.Type, content []byte) (int, error) {
start := state.stream.consumed
header := encodePackEntryHeader(realType, int64(len(content)))
startInt64, err := intconv.Uint64ToInt64(start)
if err != nil {
return 0, err
}
_, err = state.packFile.WriteAt(header, startInt64)
if err != nil {
return 0, err
}
headerLenInt64 := int64(len(header))
section := &fileSectionWriter{file: state.packFile, off: startInt64 + headerLenInt64}
crc := crc32.NewIEEE()
_, _ = crc.Write(header)
counting := &countingWriter{dst: section}
zw := zlib.NewWriter(io.MultiWriter(counting, crc))
_, err = zw.Write(content)
if err != nil {
return 0, err
}
err = zw.Close()
if err != nil {
return 0, err
}
headerLenUint64, err := intconv.IntToUint64(len(header))
if err != nil {
return 0, err
}
countingNUint64, err := intconv.IntToUint64(counting.n)
if err != nil {
return 0, err
}
packedLen := headerLenUint64 + countingNUint64
end := start + packedLen
state.stream.consumed = end
headerLenUint32, err := intconv.IntToUint32(len(header))
if err != nil {
return 0, err
}
record := objectRecord{
offset: start,
headerLen: headerLenUint32,
packedLen: packedLen,
crc32: crc.Sum32(),
packedType: realType,
realType: realType,
declaredSize: int64(len(content)),
dataOffset: start + headerLenUint64,
objectID: id,
resolved: true,
}
recordIdx := len(state.records)
state.records = append(state.records, record)
state.offsetToRecord[start] = recordIdx
state.objectToRecord[id] = recordIdx
state.baseCache.add(recordIdx, realType, content)
return recordIdx, nil
}