aboutsummaryrefslogtreecommitdiff
path: root/objectstore/loose/write_writer_finalize.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-22 17:27:37 +0000
committerGravatar Runxi Yu2026-03-22 17:27:37 +0000
commit8f577284f47f699855dcb3ceda21aa9d8be77c2f (patch)
tree36f8d47a1584bd80e9e114d5c68ad5ec6c333b88 /objectstore/loose/write_writer_finalize.go
parentinternal/testgit: why not make it more annoying to use ambient authority (diff)
signatureNo signature
objectstore{,/loose}: Document contracts more clearly
Diffstat (limited to 'objectstore/loose/write_writer_finalize.go')
-rw-r--r--objectstore/loose/write_writer_finalize.go35
1 files changed, 6 insertions, 29 deletions
diff --git a/objectstore/loose/write_writer_finalize.go b/objectstore/loose/write_writer_finalize.go
index 0dcae98a..5b7a6754 100644
--- a/objectstore/loose/write_writer_finalize.go
+++ b/objectstore/loose/write_writer_finalize.go
@@ -9,17 +9,14 @@ import (
)
// Close flushes and closes the underlying zlib stream and temp file.
-// It is safe to call multiple times.
+//
+// Repeated calls to Close are undefined behavior.
func (writer *streamWriter) Close() error {
- if writer.closed {
- return nil
- }
-
- writer.closed = true
-
errZlib := writer.zw.Close()
errSync := writer.file.Sync()
errFile := writer.file.Close()
+
+ writer.closed = true
writer.file = nil
return errors.Join(errZlib, errSync, errFile)
@@ -29,10 +26,6 @@ func (writer *streamWriter) Close() error {
// 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) {
- if writer.finalized {
- return writer.finalID, writer.finalErr
- }
-
writer.finalized = true
var zero objectid.ObjectID
@@ -40,37 +33,27 @@ func (writer *streamWriter) finalize() (objectid.ObjectID, error) {
if !writer.closed {
err := writer.Close()
if err != nil {
- writer.finalErr = err
-
return zero, err
}
}
if writer.fullMode && !writer.headerDone {
- writer.finalErr = errors.New("objectstore/loose: missing full object header")
-
- return zero, writer.finalErr
+ return zero, errors.New("objectstore/loose: missing full object header")
}
if writer.expectedContentLeft != 0 {
- writer.finalErr = errors.New("objectstore/loose: object content shorter than declared size")
-
- return zero, writer.finalErr
+ 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 {
- writer.finalErr = err
-
return zero, err
}
relPath, err := writer.store.objectPath(id)
if err != nil {
- writer.finalErr = err
-
return zero, err
}
@@ -78,8 +61,6 @@ func (writer *streamWriter) finalize() (objectid.ObjectID, error) {
err = writer.store.root.MkdirAll(dir, 0o755)
if err != nil {
- writer.finalErr = err
-
return zero, err
}
@@ -94,19 +75,15 @@ func (writer *streamWriter) finalize() (objectid.ObjectID, error) {
err = writer.store.root.Link(writer.tmpRelPath, relPath)
if err != nil {
if errors.Is(err, fs.ErrExist) {
- writer.finalID = id
cleanup = false
_ = writer.store.root.Remove(writer.tmpRelPath)
return id, nil
}
- writer.finalErr = err
-
return zero, err
}
- writer.finalID = id
cleanup = false
return id, nil