aboutsummaryrefslogtreecommitdiff
path: root/receivepack/service/run_hook.go
diff options
context:
space:
mode:
Diffstat (limited to 'receivepack/service/run_hook.go')
-rw-r--r--receivepack/service/run_hook.go74
1 files changed, 66 insertions, 8 deletions
diff --git a/receivepack/service/run_hook.go b/receivepack/service/run_hook.go
index 1270a833..bdf7ec8b 100644
--- a/receivepack/service/run_hook.go
+++ b/receivepack/service/run_hook.go
@@ -2,8 +2,13 @@ package service
import (
"context"
+ "os"
"codeberg.org/lindenii/furgit/internal/utils"
+ "codeberg.org/lindenii/furgit/objectstore"
+ "codeberg.org/lindenii/furgit/objectstore/loose"
+ objectmix "codeberg.org/lindenii/furgit/objectstore/mix"
+ "codeberg.org/lindenii/furgit/objectstore/packed"
)
func (service *Service) runHook(
@@ -32,16 +37,69 @@ func (service *Service) runHook(
utils.BestEffortFprintf(service.opts.Progress, "running hooks...\r")
- quarantinedObjects, err := service.openQuarantinedObjects(quarantineName)
- if err != nil {
- utils.BestEffortFprintf(service.opts.Progress, "running hooks: failed: %v.\n", err)
+ quarantinedObjects := service.opts.ExistingObjects
+ var (
+ quarantineObjectsStore objectstore.Store
+ quarantineLooseRoot *os.Root
+ quarantinePackRoot *os.Root
+ err error
+ )
- return nil, nil, nil, false, err.Error()
- }
+ if quarantineName != "" {
+ quarantineLooseRoot, err = service.opts.ObjectsRoot.OpenRoot(quarantineName)
+ if err != nil {
+ utils.BestEffortFprintf(service.opts.Progress, "running hooks: failed: %v.\n", err)
+
+ return nil, nil, nil, false, err.Error()
+ }
+
+ quarantineLooseStore, err := loose.New(quarantineLooseRoot, service.opts.Algorithm)
+ if err != nil {
+ _ = quarantineLooseRoot.Close()
+ utils.BestEffortFprintf(service.opts.Progress, "running hooks: failed: %v.\n", err)
+
+ return nil, nil, nil, false, err.Error()
+ }
- defer func() {
- _ = quarantinedObjects.Close()
- }()
+ quarantineObjectsStore = quarantineLooseStore
+ quarantinedObjects = quarantineLooseStore
+
+ quarantinePackRoot, err = quarantineLooseRoot.OpenRoot("pack")
+ if err == nil {
+ quarantinePackedStore, packedErr := packed.New(quarantinePackRoot, service.opts.Algorithm, packed.Options{})
+ if packedErr != nil {
+ _ = quarantineLooseStore.Close()
+ _ = quarantinePackRoot.Close()
+ _ = quarantineLooseRoot.Close()
+ utils.BestEffortFprintf(service.opts.Progress, "running hooks: failed: %v.\n", packedErr)
+
+ return nil, nil, nil, false, packedErr.Error()
+ }
+
+ quarantineObjectsStore = objectmix.New(quarantineLooseStore, quarantinePackedStore)
+ quarantinedObjects = quarantineObjectsStore
+ } else if !os.IsNotExist(err) {
+ _ = quarantineLooseStore.Close()
+ _ = quarantineLooseRoot.Close()
+ utils.BestEffortFprintf(service.opts.Progress, "running hooks: failed: %v.\n", err)
+
+ return nil, nil, nil, false, err.Error()
+ }
+
+ defer func() {
+ if quarantineObjectsStore != nil {
+ _ = quarantineObjectsStore.Close()
+ }
+
+ if quarantinePackRoot != nil {
+ _ = quarantinePackRoot.Close()
+ }
+
+ if quarantineLooseRoot != nil {
+ _ = quarantineLooseRoot.Close()
+ }
+ }()
+ }
decisions, err := service.opts.Hook(ctx, HookRequest{
Refs: service.opts.Refs,