aboutsummaryrefslogtreecommitdiff
path: root/objectstore/loose/write_writer_finalize.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-25 14:30:31 +0000
committerGravatar Runxi Yu2026-03-25 14:30:31 +0000
commitbfa0a3f5f18b752a6ebd3d5b37411c6871f7bb17 (patch)
tree8ee2479273e2b34d284c30703c2be48efe197556 /objectstore/loose/write_writer_finalize.go
parent*: Resort import order (diff)
signatureNo signature
*: objectstore -> object/store
Diffstat (limited to 'objectstore/loose/write_writer_finalize.go')
-rw-r--r--objectstore/loose/write_writer_finalize.go90
1 files changed, 0 insertions, 90 deletions
diff --git a/objectstore/loose/write_writer_finalize.go b/objectstore/loose/write_writer_finalize.go
deleted file mode 100644
index f8dee54d..00000000
--- a/objectstore/loose/write_writer_finalize.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package loose
-
-import (
- "errors"
- "io/fs"
- "path/filepath"
-
- objectid "codeberg.org/lindenii/furgit/object/id"
-)
-
-// Close flushes and closes the underlying zlib stream and temp file.
-//
-// Repeated calls to Close are undefined behavior.
-func (writer *streamWriter) Close() error {
- errZlib := writer.zw.Close()
- errSync := writer.file.Sync()
- errFile := writer.file.Close()
-
- writer.closed = true
- writer.file = nil
-
- return errors.Join(errZlib, errSync, errFile)
-}
-
-// finalize validates write completeness and atomically publishes the object.
-// Publication is no-clobber: it links tmpRelPath to the object path and treats
-// existing destination objects as success.
-func (writer *streamWriter) finalize() (objectid.ObjectID, error) {
- writer.finalized = true
-
- var zero objectid.ObjectID
-
- if !writer.closed {
- err := writer.Close()
- if err != nil {
- return zero, err
- }
- }
-
- if writer.fullMode && !writer.headerDone {
- return zero, errors.New("objectstore/loose: missing full object header")
- }
-
- if writer.expectedContentLeft != 0 {
- return zero, errors.New("objectstore/loose: object content shorter than declared size")
- }
-
- idBytes := writer.hash.Sum(nil)
-
- id, err := objectid.FromBytes(writer.store.algo, idBytes)
- if err != nil {
- return zero, err
- }
-
- relPath, err := writer.store.objectPath(id)
- if err != nil {
- return zero, err
- }
-
- dir := filepath.Dir(relPath)
-
- err = writer.store.root.MkdirAll(dir, 0o755)
- if err != nil {
- return zero, err
- }
-
- cleanup := true
-
- defer func() {
- if cleanup {
- _ = writer.store.root.Remove(writer.tmpRelPath)
- }
- }()
-
- err = writer.store.root.Link(writer.tmpRelPath, relPath)
- if err != nil {
- if errors.Is(err, fs.ErrExist) {
- cleanup = false
- _ = writer.store.root.Remove(writer.tmpRelPath)
-
- return id, nil
- }
-
- return zero, err
- }
-
- cleanup = false
-
- return id, nil
-}