aboutsummaryrefslogtreecommitdiff
path: root/receivepack
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-08 03:40:00 +0800
committerGravatar Runxi Yu2026-03-08 03:40:00 +0800
commitcb207dc2c9ac9218f4e1e75ec3aa46616eaa6c87 (patch)
tree5a602996e40f01f522b6a3dcfec485ca65c204d0 /receivepack
parentformat/pack/ingest: Add more progress (diff)
signatureNo signature
receivepack/service, format/pack/ingest: Progress uniform
Diffstat (limited to 'receivepack')
-rw-r--r--receivepack/service/apply.go18
-rw-r--r--receivepack/service/execute.go7
-rw-r--r--receivepack/service/ingest_quarantine.go12
-rw-r--r--receivepack/service/run_hook.go21
4 files changed, 48 insertions, 10 deletions
diff --git a/receivepack/service/apply.go b/receivepack/service/apply.go
index f802e0e8..0f9e07f9 100644
--- a/receivepack/service/apply.go
+++ b/receivepack/service/apply.go
@@ -1,30 +1,38 @@
package service
import (
+ "codeberg.org/lindenii/furgit/internal/utils"
"codeberg.org/lindenii/furgit/objectid"
"codeberg.org/lindenii/furgit/refstore"
)
func (service *Service) applyAtomic(result *Result, commands []Command) error {
+ total := len(commands)
+ utils.WriteProgressf(service.opts.Progress, "updating refs: 0/%d\r", total)
+
tx, err := service.opts.Refs.BeginTransaction()
if err != nil {
return err
}
- for _, command := range commands {
+ for i, command := range commands {
err = queueWriteTransaction(tx, command)
if err != nil {
_ = tx.Abort()
fillCommandErrors(result, commands, err.Error())
+ utils.WriteProgressf(service.opts.Progress, "updating refs: failed at %d/%d\n", i+1, total)
return nil
}
+
+ utils.WriteProgressf(service.opts.Progress, "updating refs: %d/%d\r", i+1, total)
}
err = tx.Commit()
if err != nil {
fillCommandErrors(result, commands, err.Error())
+ utils.WriteProgressf(service.opts.Progress, "updating refs: failed at commit\n")
return nil
}
@@ -33,11 +41,15 @@ func (service *Service) applyAtomic(result *Result, commands []Command) error {
for _, command := range commands {
result.Commands = append(result.Commands, successCommandResult(command))
}
+ utils.WriteProgressf(service.opts.Progress, "updating refs: done.\n")
return nil
}
func (service *Service) applyBatch(result *Result, commands []Command) error {
+ total := len(commands)
+ utils.WriteProgressf(service.opts.Progress, "updating refs...\r")
+
batch, err := service.opts.Refs.BeginBatch()
if err != nil {
return err
@@ -49,6 +61,8 @@ func (service *Service) applyBatch(result *Result, commands []Command) error {
batchResults, err := batch.Apply()
if err != nil && len(batchResults) == 0 {
+ utils.WriteProgressf(service.opts.Progress, "updating refs: failed at apply\n")
+
return err
}
@@ -63,9 +77,11 @@ func (service *Service) applyBatch(result *Result, commands []Command) error {
}
result.Commands = append(result.Commands, item)
+ utils.WriteProgressf(service.opts.Progress, "updating refs: %d/%d\r", i+1, total)
}
result.Applied = appliedAny
+ utils.WriteProgressf(service.opts.Progress, "updating refs: done.\n")
return nil
}
diff --git a/receivepack/service/execute.go b/receivepack/service/execute.go
index 14468799..20a67763 100644
--- a/receivepack/service/execute.go
+++ b/receivepack/service/execute.go
@@ -3,6 +3,8 @@ package service
import (
"context"
"os"
+
+ "codeberg.org/lindenii/furgit/internal/utils"
)
// Execute validates one receive-pack request, optionally ingests its pack into
@@ -78,13 +80,18 @@ func (service *Service) Execute(ctx context.Context, req *Request) (*Result, err
if req.PackExpected {
// Git migrates quarantined objects into permanent storage immediately
// before starting ref updates.
+ utils.WriteProgressf(service.opts.Progress, "promoting quarantine...\r")
err = service.promoteQuarantine(quarantineName, quarantineRoot)
if err != nil {
+ utils.WriteProgressf(service.opts.Progress, "promoting quarantine: failed: %v\n", err)
+
result.UnpackError = err.Error()
fillCommandErrors(result, req.Commands, err.Error())
return result, nil
}
+
+ utils.WriteProgressf(service.opts.Progress, "promoting quarantine: done.\n")
}
if req.Atomic {
diff --git a/receivepack/service/ingest_quarantine.go b/receivepack/service/ingest_quarantine.go
index 8e592bb9..2956c51e 100644
--- a/receivepack/service/ingest_quarantine.go
+++ b/receivepack/service/ingest_quarantine.go
@@ -16,8 +16,6 @@ func (service *Service) ingestQuarantine(
return "", nil, true
}
- utils.WriteProgressf(service.opts.Progress, "receiving objects: ingesting pack\n")
-
if req.Pack == nil {
utils.WriteProgressf(service.opts.Progress, "receiving objects: unpack failed: missing pack stream\n")
@@ -36,6 +34,7 @@ func (service *Service) ingestQuarantine(
return "", nil, false
}
+ utils.WriteProgressf(service.opts.Progress, "creating quarantine...\r")
quarantineName, quarantineRoot, err := service.createQuarantineRoot()
if err != nil {
utils.WriteProgressf(service.opts.Progress, "receiving objects: unpack failed: %v\n", err)
@@ -58,6 +57,8 @@ func (service *Service) ingestQuarantine(
return "", nil, false
}
+ utils.WriteProgressf(service.opts.Progress, "creating quarantine: done.\n")
+ utils.WriteProgressf(service.opts.Progress, "receiving objects: unpacking...\r")
ingested, err := ingest.Ingest(
req.Pack,
@@ -85,12 +86,7 @@ func (service *Service) ingestQuarantine(
return "", nil, false
}
- utils.WriteProgressf(
- service.opts.Progress,
- "receiving objects: unpack ok, %d objects (%s)\n",
- ingested.ObjectCount,
- ingested.PackHash,
- )
+ utils.WriteProgressf(service.opts.Progress, "receiving objects: unpacking: done (%d objects, %s).\n", ingested.ObjectCount, ingested.PackHash)
result.Ingest = &ingested
diff --git a/receivepack/service/run_hook.go b/receivepack/service/run_hook.go
index 3c76906e..1c265f52 100644
--- a/receivepack/service/run_hook.go
+++ b/receivepack/service/run_hook.go
@@ -1,6 +1,10 @@
package service
-import "context"
+import (
+ "context"
+
+ "codeberg.org/lindenii/furgit/internal/utils"
+)
func (service *Service) runHook(
ctx context.Context,
@@ -26,8 +30,12 @@ func (service *Service) runHook(
return allowedCommands, allowedIndices, rejected, true, ""
}
+ utils.WriteProgressf(service.opts.Progress, "running hooks...\r")
+
quarantinedObjects, err := service.openQuarantinedObjects(quarantineName)
if err != nil {
+ utils.WriteProgressf(service.opts.Progress, "running hooks: failed: %v\n", err)
+
return nil, nil, nil, false, err.Error()
}
@@ -44,10 +52,14 @@ func (service *Service) runHook(
IO: service.opts.HookIO,
})
if err != nil {
+ utils.WriteProgressf(service.opts.Progress, "running hooks: failed: %v\n", err)
+
return nil, nil, nil, false, err.Error()
}
if len(decisions) != len(commands) {
+ utils.WriteProgressf(service.opts.Progress, "running hooks: failed: wrong decision count\n")
+
return nil, nil, nil, false, "hook returned wrong number of update decisions"
}
@@ -70,5 +82,12 @@ func (service *Service) runHook(
rejected[index] = message
}
+ utils.WriteProgressf(
+ service.opts.Progress,
+ "running hooks: done (%d/%d accepted).\n",
+ len(allowedCommands),
+ len(commands),
+ )
+
return allowedCommands, allowedIndices, rejected, true, ""
}