aboutsummaryrefslogtreecommitdiff
path: root/network/receivepack/service/hook.go
diff options
context:
space:
mode:
Diffstat (limited to 'network/receivepack/service/hook.go')
-rw-r--r--network/receivepack/service/hook.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/network/receivepack/service/hook.go b/network/receivepack/service/hook.go
new file mode 100644
index 00000000..750720dd
--- /dev/null
+++ b/network/receivepack/service/hook.go
@@ -0,0 +1,45 @@
+package service
+
+import (
+ "context"
+ "io"
+
+ objectid "codeberg.org/lindenii/furgit/object/id"
+ objectstorer "codeberg.org/lindenii/furgit/object/storer"
+ refstore "codeberg.org/lindenii/furgit/ref/store"
+)
+
+type HookIO struct {
+ Progress io.Writer
+ Error io.Writer
+}
+
+type RefUpdate struct {
+ Name string
+ OldID objectid.ObjectID
+ NewID objectid.ObjectID
+}
+
+type UpdateDecision struct {
+ Accept bool
+ Message string
+}
+
+// HookRequest is the borrowed view passed to one Hook invocation.
+//
+// Refs, ExistingObjects, and QuarantinedObjects are borrowed and are only
+// valid for the duration of the hook call.
+type HookRequest struct {
+ Refs refstore.ReadingStore
+ ExistingObjects objectstorer.Store
+ QuarantinedObjects objectstorer.Store
+ Updates []RefUpdate
+ PushOptions []string
+ IO HookIO
+}
+
+// Hook is an optional per-request validation hook.
+//
+// Hook borrows the data and stores in HookRequest only for the duration of the
+// call.
+type Hook func(context.Context, HookRequest) ([]UpdateDecision, error)