aboutsummaryrefslogtreecommitdiff
path: root/receivepack/hooks
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-26 09:14:59 +0000
committerGravatar Runxi Yu2026-03-26 09:14:59 +0000
commit3d25bda9d5da6814661828adabe8a09f9d01aefb (patch)
treed034e28079333f85e5d7b96d921282eddd4798d6 /receivepack/hooks
parentobject/id: Empty tree (diff)
signatureNo signature
network/receivepack: Rename from receivepack
Diffstat (limited to 'receivepack/hooks')
-rw-r--r--receivepack/hooks/chain.go51
-rw-r--r--receivepack/hooks/doc.go2
-rw-r--r--receivepack/hooks/reject_force_push.go64
3 files changed, 0 insertions, 117 deletions
diff --git a/receivepack/hooks/chain.go b/receivepack/hooks/chain.go
deleted file mode 100644
index 4ce65064..00000000
--- a/receivepack/hooks/chain.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package hooks
-
-import (
- "context"
- "fmt"
-
- receivepack "codeberg.org/lindenii/furgit/receivepack"
-)
-
-// Chain combines hooks by running them in order and intersecting their
-// decisions. The first rejecting message for each update is preserved.
-func Chain(hooks ...receivepack.Hook) receivepack.Hook {
- return func(
- ctx context.Context,
- req receivepack.HookRequest,
- ) ([]receivepack.UpdateDecision, error) {
- decisions := make([]receivepack.UpdateDecision, len(req.Updates))
- for i := range decisions {
- decisions[i].Accept = true
- }
-
- for _, hook := range hooks {
- if hook == nil {
- continue
- }
-
- hookDecisions, err := hook(ctx, req)
- if err != nil {
- return nil, err
- }
-
- if len(hookDecisions) != len(req.Updates) {
- return nil, fmt.Errorf("hook returned %d decisions for %d updates", len(hookDecisions), len(req.Updates))
- }
-
- for i, decision := range hookDecisions {
- if decision.Accept {
- continue
- }
-
- if decisions[i].Accept {
- decisions[i].Message = decision.Message
- }
-
- decisions[i].Accept = false
- }
- }
-
- return decisions, nil
- }
-}
diff --git a/receivepack/hooks/doc.go b/receivepack/hooks/doc.go
deleted file mode 100644
index bef2baf9..00000000
--- a/receivepack/hooks/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// Package hooks provides a few pre-defined hooks that callers might find useful.
-package hooks
diff --git a/receivepack/hooks/reject_force_push.go b/receivepack/hooks/reject_force_push.go
deleted file mode 100644
index e6b112ea..00000000
--- a/receivepack/hooks/reject_force_push.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package hooks
-
-import (
- "context"
- "errors"
- "fmt"
-
- "codeberg.org/lindenii/furgit/commitquery"
- objectid "codeberg.org/lindenii/furgit/object/id"
- objectmix "codeberg.org/lindenii/furgit/object/storer/mix"
- receivepack "codeberg.org/lindenii/furgit/receivepack"
- refstore "codeberg.org/lindenii/furgit/ref/store"
-)
-
-// RejectForcePush rejects updates whose new value is not a fast-forward of the
-// currently resolved reference.
-func RejectForcePush() receivepack.Hook {
- return func(
- ctx context.Context,
- req receivepack.HookRequest,
- ) ([]receivepack.UpdateDecision, error) {
- _ = ctx
-
- objects := objectmix.New(req.QuarantinedObjects, req.ExistingObjects)
-
- decisions := make([]receivepack.UpdateDecision, len(req.Updates))
- for i := range decisions {
- decisions[i].Accept = true
- }
-
- for i, update := range req.Updates {
- if update.OldID == objectid.Zero(update.OldID.Algorithm()) || update.NewID == objectid.Zero(update.NewID.Algorithm()) {
- continue
- }
-
- current, err := req.Refs.ResolveToDetached(update.Name)
- switch {
- case err == nil:
- case errors.Is(err, refstore.ErrReferenceNotFound):
- continue
- default:
- return nil, fmt.Errorf("resolve %s: %w", update.Name, err)
- }
-
- if current.ID == update.NewID {
- continue
- }
-
- ok, err := commitquery.New(objects, nil).IsAncestor(current.ID, update.NewID)
- if err != nil {
- return nil, fmt.Errorf("check fast-forward %s: %w", update.Name, err)
- }
-
- if !ok {
- decisions[i] = receivepack.UpdateDecision{
- Accept: false,
- Message: "non-fast-forward",
- }
- }
- }
-
- return decisions, nil
- }
-}