shithub: furgit

Download patch

ref: cb207dc2c9ac9218f4e1e75ec3aa46616eaa6c87
parent: 74584d2dee4f349b5b3535669fa304b95f0f6e52
author: Runxi Yu <me@runxiyu.org>
date: Sat Mar 7 22:40:00 EST 2026

receivepack/service, format/pack/ingest: Progress uniform

--- a/format/pack/ingest/ingest.go
+++ b/format/pack/ingest/ingest.go
@@ -51,7 +51,7 @@
 		return Result{}, err
 	}
 
-	utils.WriteProgressf(state.opts.Progress, "writing index: start\n")
+	utils.WriteProgressf(state.opts.Progress, "writing index...\r")
 	err = state.packFile.Sync()
 	if err != nil {
 		return Result{}, &DestinationWriteError{Op: fmt.Sprintf("sync pack: %v", err)}
@@ -61,10 +61,10 @@
 	if err != nil {
 		return Result{}, err
 	}
-	utils.WriteProgressf(state.opts.Progress, "writing index: done\n")
+	utils.WriteProgressf(state.opts.Progress, "writing index: done.\n")
 
 	if state.opts.WriteRev {
-		utils.WriteProgressf(state.opts.Progress, "writing reverse index: start\n")
+		utils.WriteProgressf(state.opts.Progress, "writing reverse index...\r")
 	}
 	err = writeRev(state)
 	if err != nil {
@@ -71,7 +71,7 @@
 		return Result{}, err
 	}
 	if state.opts.WriteRev {
-		utils.WriteProgressf(state.opts.Progress, "writing reverse index: done\n")
+		utils.WriteProgressf(state.opts.Progress, "writing reverse index: done.\n")
 	}
 
 	return finalizeArtifacts(state)
--- a/format/pack/ingest/scan.go
+++ b/format/pack/ingest/scan.go
@@ -21,10 +21,12 @@
 		state.algo.Size(),
 	)
 
+	utils.WriteProgressf(state.opts.Progress, "validating pack header...\r")
 	err = readAndValidatePackHeader(state)
 	if err != nil {
 		return err
 	}
+	utils.WriteProgressf(state.opts.Progress, "validating pack header: done.\n")
 
 	state.records = make([]objectRecord, 0, state.objectCountHeader)
 	state.ofsDeltas = make([]ofsDeltaRef, 0, state.objectCountHeader)
--- 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 @@
 	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 @@
 
 	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 @@
 		}
 
 		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
 }
--- a/receivepack/service/execute.go
+++ b/receivepack/service/execute.go
@@ -3,6 +3,8 @@
 import (
 	"context"
 	"os"
+
+	"codeberg.org/lindenii/furgit/internal/utils"
 )
 
 // Execute validates one receive-pack request, optionally ingests its pack into
@@ -78,13 +80,18 @@
 	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 {
--- a/receivepack/service/ingest_quarantine.go
+++ b/receivepack/service/ingest_quarantine.go
@@ -16,8 +16,6 @@
 		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 @@
 		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 @@
 
 		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 @@
 		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
 
--- a/receivepack/service/run_hook.go
+++ b/receivepack/service/run_hook.go
@@ -1,7 +1,11 @@
 package service
 
-import "context"
+import (
+	"context"
 
+	"codeberg.org/lindenii/furgit/internal/utils"
+)
+
 func (service *Service) runHook(
 	ctx context.Context,
 	req *Request,
@@ -26,8 +30,12 @@
 		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 @@
 		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"
 	}
 
@@ -69,6 +81,13 @@
 
 		rejected[index] = message
 	}
+
+	utils.WriteProgressf(
+		service.opts.Progress,
+		"running hooks: done (%d/%d accepted).\n",
+		len(allowedCommands),
+		len(commands),
+	)
 
 	return allowedCommands, allowedIndices, rejected, true, ""
 }
--