aboutsummaryrefslogtreecommitdiff
path: root/ref/store/transaction.go
diff options
context:
space:
mode:
Diffstat (limited to 'ref/store/transaction.go')
-rw-r--r--ref/store/transaction.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/ref/store/transaction.go b/ref/store/transaction.go
new file mode 100644
index 00000000..a70cd3d4
--- /dev/null
+++ b/ref/store/transaction.go
@@ -0,0 +1,50 @@
+package refstore
+
+import objectid "codeberg.org/lindenii/furgit/object/id"
+
+// Transaction stages reference updates for one atomic commit.
+//
+// A transaction borrows its underlying store and is invalid after that store
+// is closed.
+//
+// Ordinary methods operate in dereference mode if name resolves to
+// a symbolic ref, the operation applies to the final referent rather
+// than to the symbolic ref itself.
+//
+// Symbolic methods operate on the named reference directly, without
+// dereferencing symbolic refs.
+type Transaction 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
+
+ // Commit validates and applies all queued operations atomically.
+ //
+ // Commit is terminal. Further use of the transaction is undefined behavior.
+ Commit() error
+ // Abort abandons the transaction and releases any resources it holds.
+ //
+ // Abort is terminal. Further use of the transaction is undefined behavior.
+ Abort() error
+}