aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--format/pack/ingest/idx_write.go20
-rw-r--r--format/pack/ingest/progress_write.go1
-rw-r--r--format/pack/ingest/rev_write.go6
-rw-r--r--internal/progress/humanize.go1
-rw-r--r--internal/progress/render.go4
-rw-r--r--internal/progress/set.go1
-rw-r--r--objectstore/packed/idx_candidates_mru.go1
-rw-r--r--receivepack/receivepack.go1
8 files changed, 33 insertions, 2 deletions
diff --git a/format/pack/ingest/idx_write.go b/format/pack/ingest/idx_write.go
index 0523ac1d..91f70f3f 100644
--- a/format/pack/ingest/idx_write.go
+++ b/format/pack/ingest/idx_write.go
@@ -40,8 +40,11 @@ func writeIdx(state *ingestState) error {
return nil
}
- var scratch [8]byte
- var fanout [256]uint32
+ var (
+ scratch [8]byte
+ fanout [256]uint32
+ )
+
writeProgress(state, "writing index fanout...\r")
for _, recordIdx := range order {
@@ -51,6 +54,7 @@ func writeIdx(state *ingestState) error {
binary.BigEndian.PutUint32(scratch[:4], idxMagicV2)
binary.BigEndian.PutUint32(scratch[4:8], idxVersionV2)
+
err = write(scratch[:8])
if err != nil {
return err
@@ -66,9 +70,11 @@ func writeIdx(state *ingestState) error {
return err
}
}
+
writeProgress(state, "writing index fanout: done.\n")
largeOffsetCount := 0
+
for idx := range state.records {
if state.records[idx].offset >= 0x80000000 {
largeOffsetCount++
@@ -81,6 +87,7 @@ func writeIdx(state *ingestState) error {
Title: "writing index object ids",
Total: uint64(len(order)),
})
+
var oidDone uint64
for _, recordIdx := range order {
@@ -94,6 +101,7 @@ func writeIdx(state *ingestState) error {
oidDone++
oidMeter.Set(oidDone, 0)
}
+
if oidDone > 0 {
oidMeter.Stop("done")
}
@@ -104,6 +112,7 @@ func writeIdx(state *ingestState) error {
Title: "writing index crc32",
Total: uint64(len(order)),
})
+
var crcDone uint64
for _, recordIdx := range order {
@@ -117,6 +126,7 @@ func writeIdx(state *ingestState) error {
crcDone++
crcMeter.Set(crcDone, 0)
}
+
if crcDone > 0 {
crcMeter.Stop("done")
}
@@ -128,6 +138,7 @@ func writeIdx(state *ingestState) error {
Title: "writing index offsets",
Total: uint64(len(order)),
})
+
var offsetDone uint64
for _, recordIdx := range order {
@@ -155,6 +166,7 @@ func writeIdx(state *ingestState) error {
offsetDone++
offsetMeter.Set(offsetDone, 0)
}
+
if offsetDone > 0 {
offsetMeter.Stop("done")
}
@@ -165,7 +177,9 @@ func writeIdx(state *ingestState) error {
Title: "writing index large offsets",
Total: uint64(largeOffsetCount),
})
+
var largeOffsetDone uint64
+
for _, off := range largeOffsets {
binary.BigEndian.PutUint64(scratch[:8], off)
@@ -177,6 +191,7 @@ func writeIdx(state *ingestState) error {
largeOffsetDone++
largeOffsetMeter.Set(largeOffsetDone, 0)
}
+
if largeOffsetDone > 0 {
largeOffsetMeter.Stop("done")
}
@@ -199,6 +214,7 @@ func writeIdx(state *ingestState) error {
if err != nil {
return err
}
+
writeProgress(state, "writing index trailer: done.\n")
return nil
diff --git a/format/pack/ingest/progress_write.go b/format/pack/ingest/progress_write.go
index 3150032b..f372f9d0 100644
--- a/format/pack/ingest/progress_write.go
+++ b/format/pack/ingest/progress_write.go
@@ -4,6 +4,7 @@ import "codeberg.org/lindenii/furgit/internal/utils"
func writeProgress(state *ingestState, format string, args ...any) {
utils.BestEffortFprintf(state.opts.Progress, format, args...)
+
if state.opts.ProgressFlush != nil {
_ = state.opts.ProgressFlush()
}
diff --git a/format/pack/ingest/rev_write.go b/format/pack/ingest/rev_write.go
index 9ed8dc6c..9b9432dc 100644
--- a/format/pack/ingest/rev_write.go
+++ b/format/pack/ingest/rev_write.go
@@ -34,6 +34,7 @@ func writeRev(state *ingestState) error {
}
var scratch [8]byte
+
writeProgress(state, "writing reverse index header...\r")
binary.BigEndian.PutUint32(scratch[:4], revMagic)
@@ -55,6 +56,7 @@ func writeRev(state *ingestState) error {
if err != nil {
return err
}
+
writeProgress(state, "writing reverse index header: done.\n")
entriesMeter := progress.New(progress.Options{
@@ -63,6 +65,7 @@ func writeRev(state *ingestState) error {
Title: "writing reverse index entries",
Total: uint64(len(packOrder)),
})
+
var entriesDone uint64
for _, recordIdx := range packOrder {
@@ -77,9 +80,11 @@ func writeRev(state *ingestState) error {
if err != nil {
return err
}
+
entriesDone++
entriesMeter.Set(entriesDone, 0)
}
+
if entriesDone > 0 {
entriesMeter.Stop("done")
}
@@ -102,6 +107,7 @@ func writeRev(state *ingestState) error {
if err != nil {
return err
}
+
writeProgress(state, "writing reverse index trailer: done.\n")
return nil
diff --git a/internal/progress/humanize.go b/internal/progress/humanize.go
index fd68e1e9..f13845f7 100644
--- a/internal/progress/humanize.go
+++ b/internal/progress/humanize.go
@@ -9,6 +9,7 @@ func humanizeBytes(n uint64) string {
}
value := float64(n)
+
units := []string{"KiB", "MiB", "GiB", "TiB", "PiB"}
for i := range units {
value /= unit
diff --git a/internal/progress/render.go b/internal/progress/render.go
index a2395d98..36836cde 100644
--- a/internal/progress/render.go
+++ b/internal/progress/render.go
@@ -15,19 +15,23 @@ func (meter *Meter) render(now time.Time, eol string) {
meter.refreshThroughput(now)
counters := meter.renderCounters()
+
clear := 0
if len(counters) < meter.lastCounterW {
clear = meter.lastCounterW - len(counters) + 1
}
+
meter.lastCounterW = len(counters)
line := meter.title + ": " + counters
if clear > 0 {
line += strings.Repeat(" ", clear)
}
+
line += eol
utils.BestEffortFprintf(meter.writer, "%s", line)
+
if meter.flush != nil {
_ = meter.flush()
}
diff --git a/internal/progress/set.go b/internal/progress/set.go
index 3a580a63..b7ed5b28 100644
--- a/internal/progress/set.go
+++ b/internal/progress/set.go
@@ -17,6 +17,7 @@ func (meter *Meter) Set(done uint64, bytes uint64) {
forced := meter.consumeUpdateTick(now)
percentChanged := false
+
if meter.total > 0 {
percent := int(done * 100 / meter.total)
percentChanged = percent != meter.lastPercent
diff --git a/objectstore/packed/idx_candidates_mru.go b/objectstore/packed/idx_candidates_mru.go
index b0960df5..d0cc7052 100644
--- a/objectstore/packed/idx_candidates_mru.go
+++ b/objectstore/packed/idx_candidates_mru.go
@@ -88,6 +88,7 @@ func (store *Store) touchCandidate(packName string) {
}
node.prev = nil
+
node.next = store.mruHead
if store.mruHead != nil {
store.mruHead.prev = node
diff --git a/receivepack/receivepack.go b/receivepack/receivepack.go
index e85ac27f..aeec9370 100644
--- a/receivepack/receivepack.go
+++ b/receivepack/receivepack.go
@@ -89,6 +89,7 @@ func ReceivePack(
progressWriter := protoSession.ProgressWriter()
progressFlush := base.FlushIO
+
if req.Capabilities.Quiet {
progressWriter = io.Discard
progressFlush = nil