aboutsummaryrefslogtreecommitdiff
path: root/receivepack/hooks/reject_force_push.go
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/reject_force_push.go
parentobject/id: Empty tree (diff)
signatureNo signature
network/receivepack: Rename from receivepack
Diffstat (limited to 'receivepack/hooks/reject_force_push.go')
-rw-r--r--receivepack/hooks/reject_force_push.go64
1 files changed, 0 insertions, 64 deletions
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
- }
-}