shithub: furgit

Download patch

ref: 3d71db8702f58182f1f7eda3446a2c474443c7f2
parent: e667c3c52a535ee67fe895bb0240fbad6e920087
author: Runxi Yu <me@runxiyu.org>
date: Sat Mar 7 14:06:11 EST 2026

refstore: Add non-transactional store and rw store

--- /dev/null
+++ b/refstore/batch.go
@@ -1,0 +1,38 @@
+package refstore
+
+import "codeberg.org/lindenii/furgit/objectid"
+
+// Batch applies reference operations immediately, one operation at a time.
+//
+// Unlike Transaction, Batch does not stage changes for one atomic commit.
+// Each method attempts its update immediately and returns that operation's
+// error, if any.
+type Batch interface {
+	// Create creates one detached reference, requiring that the logical
+	// reference does not already exist.
+	Create(name string, newID objectid.ObjectID) error
+	// Update updates one detached reference, requiring that the current logical
+	// reference value matches oldID.
+	Update(name string, newID, oldID objectid.ObjectID) error
+	// Delete deletes one detached reference, requiring that the current logical
+	// reference value matches oldID.
+	Delete(name string, oldID objectid.ObjectID) error
+	// Verify verifies that the current logical reference value matches oldID.
+	Verify(name string, oldID objectid.ObjectID) error
+
+	// CreateSymbolic creates one symbolic reference, requiring that the named
+	// reference does not already exist.
+	CreateSymbolic(name, newTarget string) error
+	// UpdateSymbolic updates one symbolic reference directly, requiring that its
+	// current target matches oldTarget.
+	UpdateSymbolic(name, newTarget, oldTarget string) error
+	// DeleteSymbolic deletes one symbolic reference directly, requiring that its
+	// current target matches oldTarget.
+	DeleteSymbolic(name, oldTarget string) error
+	// VerifySymbolic verifies that the named symbolic reference currently points
+	// at oldTarget.
+	VerifySymbolic(name, oldTarget string) error
+
+	// Close releases any resources associated with the batch.
+	Close() error
+}
--- /dev/null
+++ b/refstore/batch_store.go
@@ -1,0 +1,7 @@
+package refstore
+
+// BatchStore begins non-atomic reference batches.
+type BatchStore interface {
+	// BeginBatch creates one new immediate-apply batch.
+	BeginBatch() (Batch, error)
+}
--- /dev/null
+++ b/refstore/read_write.go
@@ -1,0 +1,7 @@
+package refstore
+
+// ReadWriteStore supports both reading and atomic transactional updates.
+type ReadWriteStore interface {
+	ReadingStore
+	TransactionalStore
+}
--- /dev/null
+++ b/refstore/read_write_store.go
@@ -1,0 +1,8 @@
+package refstore
+
+// ReadWriteStore supports reading, atomic transactions, and immediate batches.
+type ReadWriteStore interface {
+	ReadingStore
+	TransactionalStore
+	BatchStore
+}
--- a/refstore/transactional.go
+++ /dev/null
@@ -1,11 +1,0 @@
-package refstore
-
-// TransactionalStore begins atomic reference transactions.
-//
-// Not every readable reference store is writable. Implementations should only
-// satisfy TransactionalStore when they can stage and commit reference updates
-// atomically within that backend.
-type TransactionalStore interface {
-	// BeginTransaction creates one new mutable transaction.
-	BeginTransaction() (Transaction, error)
-}
--- /dev/null
+++ b/refstore/transactional_store.go
@@ -1,0 +1,11 @@
+package refstore
+
+// TransactionalStore begins atomic reference transactions.
+//
+// Not every readable reference store is writable. Implementations should only
+// satisfy TransactionalStore when they can stage and commit reference updates
+// atomically within that backend.
+type TransactionalStore interface {
+	// BeginTransaction creates one new mutable transaction.
+	BeginTransaction() (Transaction, error)
+}
--- a/repository/refs.go
+++ b/repository/refs.go
@@ -11,7 +11,7 @@
 )
 
 //nolint:ireturn
-func openRefStore(root *os.Root, algo objectid.Algorithm, packedRefsTimeout time.Duration) (out refstore.ReadingStore, err error) {
+func openRefStore(root *os.Root, algo objectid.Algorithm, packedRefsTimeout time.Duration) (out refstore.ReadWriteStore, err error) {
 	refRoot, err := root.OpenRoot(".")
 	if err != nil {
 		return nil, fmt.Errorf("repository: open root for refs: %w", err)
@@ -30,6 +30,6 @@
 // Refs returns the configured ref store.
 //
 //nolint:ireturn
-func (repo *Repository) Refs() refstore.ReadingStore {
+func (repo *Repository) Refs() refstore.ReadWriteStore {
 	return repo.refs
 }
--- a/repository/repository.go
+++ b/repository/repository.go
@@ -19,5 +19,5 @@
 
 	objects                    objectstore.Store
 	objectsLooseForWritingOnly *objectloose.Store
-	refs                       refstore.ReadingStore
+	refs                       refstore.ReadWriteStore
 }
--