diff options
Diffstat (limited to 'receivepack/service/run_hook.go')
| -rw-r--r-- | receivepack/service/run_hook.go | 74 |
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, |
