ref: ab174c473618dd3743881cf44e02c2db4d1ecd5f
dir: /network/receivepack/service/ingest_quarantine.go/
package service
import (
"codeberg.org/lindenii/furgit/internal/utils"
objectstore "codeberg.org/lindenii/furgit/object/store"
)
func (service *Service) ingestQuarantine(
result *Result,
commands []Command,
req *Request,
) (objectstore.Quarantine, bool) {
if !req.PackExpected {
return nil, true
}
if req.Pack == nil {
utils.BestEffortFprintf(service.opts.Progress, "unpack failed: missing pack stream.\n")
result.UnpackError = "missing pack stream"
fillCommandErrors(result, commands, "missing pack stream")
return nil, false
}
if service.opts.ObjectIngress == nil {
utils.BestEffortFprintf(service.opts.Progress, "unpack failed: object ingress not configured.\n")
result.UnpackError = "object ingress not configured"
fillCommandErrors(result, commands, "object ingress not configured")
return nil, false
}
var err error
err = service.opts.ExistingObjects.Refresh()
if err != nil {
utils.BestEffortFprintf(service.opts.Progress, "unpack failed: refresh existing objects: %v.\n", err)
result.UnpackError = err.Error()
fillCommandErrors(result, commands, err.Error())
return nil, false
}
utils.BestEffortFprintf(service.opts.Progress, "creating quarantine...\r")
quarantine, err := service.opts.ObjectIngress.BeginQuarantine(objectstore.QuarantineOptions{})
if err != nil {
utils.BestEffortFprintf(service.opts.Progress, "unpack failed: %v.\n", err)
result.UnpackError = err.Error()
fillCommandErrors(result, commands, err.Error())
return nil, false
}
utils.BestEffortFprintf(service.opts.Progress, "creating quarantine: done.\n")
utils.BestEffortFprintf(service.opts.Progress, "unpacking...\r")
err = quarantine.WritePack(req.Pack, objectstore.PackWriteOptions{
ThinBase: service.opts.ExistingObjects,
Progress: service.opts.Progress,
RequireTrailingEOF: false,
})
if err != nil {
utils.BestEffortFprintf(service.opts.Progress, "unpack failed: %v.\n", err)
result.UnpackError = err.Error()
fillCommandErrors(result, commands, err.Error())
_ = quarantine.Discard()
return nil, false
}
utils.BestEffortFprintf(service.opts.Progress, "unpacking: done.\n")
return quarantine, true
}