diff options
| author | 2026-03-30 14:28:13 +0000 | |
|---|---|---|
| committer | 2026-03-30 14:28:13 +0000 | |
| commit | a4eeb727468a178a4de0dfc718828f26740484ac (patch) | |
| tree | 4318d38d49facc80e2e2186f5919fa656be3b31f /object/store/packed/internal/ingest/write.go | |
| parent | object/store/packed: Make store own root, algo, opts (diff) | |
| signature | No signature | |
object,store/packed{,/internal/ingest}: Move from format/packfile/ingest
Diffstat (limited to 'object/store/packed/internal/ingest/write.go')
| -rw-r--r-- | object/store/packed/internal/ingest/write.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/object/store/packed/internal/ingest/write.go b/object/store/packed/internal/ingest/write.go new file mode 100644 index 00000000..efd27323 --- /dev/null +++ b/object/store/packed/internal/ingest/write.go @@ -0,0 +1,50 @@ +package ingest + +import ( + "bufio" + "io" + "os" + + objectid "codeberg.org/lindenii/furgit/object/id" +) + +// WritePack ingests one pack stream into destination and writes pack artifacts. +// +// Artifacts are published under content-addressed final names derived from the +// resulting pack hash. If those final names already exist, WritePack treats +// that as success and removes its temporary files. +func WritePack( + destination *os.Root, + algo objectid.Algorithm, + src io.Reader, + opts Options, +) (Result, error) { + if algo.Size() == 0 { + return Result{}, objectid.ErrInvalidAlgorithm + } + + reader := bufio.NewReader(src) + + header, headerRaw, err := readAndValidatePackHeader(reader) + if err != nil { + return Result{}, err + } + + if header.ObjectCount == 0 { + return discardZeroObjectPack(reader, algo, opts, headerRaw) + } + + state, err := newIngestState( + reader, + destination, + algo, + opts, + header, + headerRaw, + ) + if err != nil { + return Result{}, err + } + + return ingest(state) +} |
