aboutsummaryrefslogtreecommitdiff
path: root/receivepack/receivepack.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-07 21:15:54 +0800
committerGravatar Runxi Yu2026-03-07 21:16:32 +0800
commitb82515530f10dfebbf99dca501890570f3466910 (patch)
tree9574dc49fa7239f7f0c131471f4a6708fd7041d5 /receivepack/receivepack.go
parentreceivepack: Set permissions properly (diff)
signatureNo signature
receivepack: Add hooks
Diffstat (limited to 'receivepack/receivepack.go')
-rw-r--r--receivepack/receivepack.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/receivepack/receivepack.go b/receivepack/receivepack.go
index 5a70715d..eb518935 100644
--- a/receivepack/receivepack.go
+++ b/receivepack/receivepack.go
@@ -74,6 +74,7 @@ func ReceivePack(
PromotedObjectPermissions: translatePromotedObjectPermissions(
opts.PromotedObjectPermissions,
),
+ Hook: translateHook(opts.Hook),
})
result, err := svc.Execute(ctx, serviceReq)
@@ -106,3 +107,41 @@ func translatePromotedObjectPermissions(
FileMode: perms.FileMode,
}
}
+
+func translateHook(hook Hook) service.Hook {
+ if hook == nil {
+ return nil
+ }
+
+ return func(ctx context.Context, req service.HookRequest) ([]service.UpdateDecision, error) {
+ translatedUpdates := make([]RefUpdate, 0, len(req.Updates))
+ for _, update := range req.Updates {
+ translatedUpdates = append(translatedUpdates, RefUpdate{
+ Name: update.Name,
+ OldID: update.OldID,
+ NewID: update.NewID,
+ })
+ }
+
+ decisions, err := hook(ctx, HookRequest{
+ Refs: req.Refs,
+ ExistingObjects: req.ExistingObjects,
+ QuarantinedObjects: req.QuarantinedObjects,
+ Updates: translatedUpdates,
+ PushOptions: append([]string(nil), req.PushOptions...),
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ out := make([]service.UpdateDecision, 0, len(decisions))
+ for _, decision := range decisions {
+ out = append(out, service.UpdateDecision{
+ Accept: decision.Accept,
+ Message: decision.Message,
+ })
+ }
+
+ return out, nil
+ }
+}