aboutsummaryrefslogtreecommitdiff
path: root/internal/progress
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-04-02 06:23:30 +0000
committerGravatar Runxi Yu2026-04-02 06:28:39 +0000
commita041d523de389b65b98a5373a8034041db2a8d83 (patch)
tree7b423dc735f463be616045f2c3c2095a7737aca7 /internal/progress
parentresearch: Add dynamic pack resources (diff)
signatureNo signature
*: Remove
Diffstat (limited to 'internal/progress')
-rw-r--r--internal/progress/constants.go11
-rw-r--r--internal/progress/consume.go15
-rw-r--r--internal/progress/counters.go23
-rw-r--r--internal/progress/doc.go2
-rw-r--r--internal/progress/humanize.go22
-rw-r--r--internal/progress/meter.go30
-rw-r--r--internal/progress/new.go21
-rw-r--r--internal/progress/options.go22
-rw-r--r--internal/progress/refresh.go25
-rw-r--r--internal/progress/render.go38
-rw-r--r--internal/progress/set.go39
-rw-r--r--internal/progress/stop.go20
12 files changed, 0 insertions, 268 deletions
diff --git a/internal/progress/constants.go b/internal/progress/constants.go
deleted file mode 100644
index c73adb2e..00000000
--- a/internal/progress/constants.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package progress
-
-import "time"
-
-const (
- // DefaultDelay is the default delayed-progress interval.
- DefaultDelay = time.Second
-
- updateInterval = time.Second
- throughputInterval = 500 * time.Millisecond
-)
diff --git a/internal/progress/consume.go b/internal/progress/consume.go
deleted file mode 100644
index fa142f49..00000000
--- a/internal/progress/consume.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package progress
-
-import "time"
-
-func (meter *Meter) consumeUpdateTick(now time.Time) bool {
- if now.Before(meter.nextUpdateAt) {
- return false
- }
-
- for !now.Before(meter.nextUpdateAt) {
- meter.nextUpdateAt = meter.nextUpdateAt.Add(updateInterval)
- }
-
- return true
-}
diff --git a/internal/progress/counters.go b/internal/progress/counters.go
deleted file mode 100644
index 7c7a5085..00000000
--- a/internal/progress/counters.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package progress
-
-import (
- "fmt"
-
- "codeberg.org/lindenii/furgit/internal/intconv"
-)
-
-func (meter *Meter) renderCounters() string {
- if meter.total > 0 {
- u, err := intconv.Uint64ToInt(meter.lastDone * 100 / meter.total)
- if err != nil {
- return "overflow"
- // TODO
- }
-
- meter.lastPercent = u
-
- return fmt.Sprintf("%3d%% (%d/%d)%s", meter.lastPercent, meter.lastDone, meter.total, meter.throughputSuffix)
- }
-
- return fmt.Sprintf("%d%s", meter.lastDone, meter.throughputSuffix)
-}
diff --git a/internal/progress/doc.go b/internal/progress/doc.go
deleted file mode 100644
index 964ebdec..00000000
--- a/internal/progress/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// Package progress supplies meters intended to be used on sideband 2.
-package progress
diff --git a/internal/progress/humanize.go b/internal/progress/humanize.go
deleted file mode 100644
index f13845f7..00000000
--- a/internal/progress/humanize.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package progress
-
-import "fmt"
-
-func humanizeBytes(n uint64) string {
- const unit = 1024
- if n < unit {
- return fmt.Sprintf("%d B", n)
- }
-
- value := float64(n)
-
- units := []string{"KiB", "MiB", "GiB", "TiB", "PiB"}
- for i := range units {
- value /= unit
- if value < unit || i == len(units)-1 {
- return fmt.Sprintf("%.2f %s", value, units[i])
- }
- }
-
- return fmt.Sprintf("%d B", n)
-}
diff --git a/internal/progress/meter.go b/internal/progress/meter.go
deleted file mode 100644
index bdf0e613..00000000
--- a/internal/progress/meter.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package progress
-
-import (
- "time"
-
- "codeberg.org/lindenii/furgit/common/iowrap"
-)
-
-// Meter renders one in-place progress line.
-type Meter struct {
- writer iowrap.WriteFlusher
-
- title string
- total uint64
- delay time.Duration
- sparse bool
- throughput bool
-
- startedAt time.Time
- nextUpdateAt time.Time
- nextThroughput time.Time
-
- lastDone uint64
- lastBytes uint64
- lastPercent int
- lastCounterW int
- sawValue bool
-
- throughputSuffix string
-}
diff --git a/internal/progress/new.go b/internal/progress/new.go
deleted file mode 100644
index 2c304279..00000000
--- a/internal/progress/new.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package progress
-
-import "time"
-
-// New creates one progress meter.
-func New(opts Options) *Meter {
- now := time.Now()
-
- return &Meter{
- writer: opts.Writer,
- title: opts.Title,
- total: opts.Total,
- delay: max(opts.Delay, time.Duration(0)),
- sparse: opts.Sparse,
- throughput: opts.Throughput,
- startedAt: now,
- nextUpdateAt: now.Add(updateInterval),
- nextThroughput: now.Add(throughputInterval),
- lastPercent: -1,
- }
-}
diff --git a/internal/progress/options.go b/internal/progress/options.go
deleted file mode 100644
index 40dd9758..00000000
--- a/internal/progress/options.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package progress
-
-import (
- "time"
-
- "codeberg.org/lindenii/furgit/common/iowrap"
-)
-
-// Options configures one progress meter.
-type Options struct {
- Writer iowrap.WriteFlusher
-
- Title string
- Total uint64
-
- // Delay suppresses progress output until Delay has elapsed since Start.
- Delay time.Duration
- // Sparse forces one final 100% line at Stop when the caller sampled updates.
- Sparse bool
- // Throughput appends ", <total> | <rate>/s" and refreshes rate every 500ms.
- Throughput bool
-}
diff --git a/internal/progress/refresh.go b/internal/progress/refresh.go
deleted file mode 100644
index ed1782db..00000000
--- a/internal/progress/refresh.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package progress
-
-import "time"
-
-func (meter *Meter) refreshThroughput(now time.Time) {
- if !meter.throughput {
- return
- }
-
- if meter.nextThroughput.After(now) && meter.throughputSuffix != "" {
- return
- }
-
- for !now.Before(meter.nextThroughput) {
- meter.nextThroughput = meter.nextThroughput.Add(throughputInterval)
- }
-
- elapsed := now.Sub(meter.startedAt)
- if elapsed <= 0 {
- return
- }
-
- rate := uint64(float64(meter.lastBytes) / elapsed.Seconds())
- meter.throughputSuffix = ", " + humanizeBytes(meter.lastBytes) + " | " + humanizeBytes(rate) + "/s"
-}
diff --git a/internal/progress/render.go b/internal/progress/render.go
deleted file mode 100644
index ae188c0e..00000000
--- a/internal/progress/render.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package progress
-
-import (
- "strings"
- "time"
-
- "codeberg.org/lindenii/furgit/internal/utils"
-)
-
-func (meter *Meter) render(now time.Time, eol string) {
- if meter.delay > 0 && now.Sub(meter.startedAt) < meter.delay && eol == "\r" {
- return
- }
-
- meter.refreshThroughput(now)
-
- counters := meter.renderCounters()
-
- clear1 := 0
- if len(counters) < meter.lastCounterW {
- clear1 = meter.lastCounterW - len(counters) + 1
- }
-
- meter.lastCounterW = len(counters)
-
- line := meter.title + ": " + counters
- if clear1 > 0 {
- line += strings.Repeat(" ", clear1)
- }
-
- line += eol
-
- utils.BestEffortFprintf(meter.writer, "%s", line)
-
- if meter.writer != nil {
- _ = meter.writer.Flush()
- }
-}
diff --git a/internal/progress/set.go b/internal/progress/set.go
deleted file mode 100644
index 06cf889d..00000000
--- a/internal/progress/set.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package progress
-
-import (
- "time"
-
- "codeberg.org/lindenii/furgit/internal/intconv"
-)
-
-// Set records current progress and renders when percent changed or the 1s tick
-// elapsed.
-func (meter *Meter) Set(done uint64, bytes uint64) {
- meter.lastDone = done
- meter.lastBytes = bytes
- meter.sawValue = true
-
- if meter.writer == nil {
- return
- }
-
- now := time.Now()
- forced := meter.consumeUpdateTick(now)
-
- percentChanged := false
-
- if meter.total > 0 {
- percent, err := intconv.Uint64ToInt(done * 100 / meter.total)
- if err != nil {
- return // TODO
- }
-
- percentChanged = percent != meter.lastPercent
- }
-
- if !percentChanged && !forced {
- return
- }
-
- meter.render(now, "\r")
-}
diff --git a/internal/progress/stop.go b/internal/progress/stop.go
deleted file mode 100644
index fdc3f9af..00000000
--- a/internal/progress/stop.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package progress
-
-import "time"
-
-// Stop forces the final progress line and appends ", <msg>.".
-func (meter *Meter) Stop(msg string) {
- if !meter.sawValue || meter.writer == nil {
- return
- }
-
- if msg == "" {
- msg = "done"
- }
-
- if meter.sparse && meter.total > 0 && meter.lastDone != meter.total {
- meter.lastDone = meter.total
- }
-
- meter.render(time.Now(), ", "+msg+".\n")
-}