From a9a384972649182c188396c5f996ae617d35188a Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Mon, 24 Aug 2026 12:07:30 +0200 Subject: Add progress bars to the long-running CLI processes (backtest, backfill, extract-osm) --- ride/store.go | 12 ++++++++++-- ride/store_test.go | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'ride') diff --git a/ride/store.go b/ride/store.go index 162b912..56cd087 100644 --- a/ride/store.go +++ b/ride/store.go @@ -91,7 +91,10 @@ func Save(db *sql.DB, r StoredRide) error { return err } -func Backfill(db *sql.DB) (int, error) { +// Backfill recomputes and persists stored ride values for every ride. An +// optional reporter is invoked with the number of rides processed and the +// total, so callers (e.g. the CLI) can render progress. +func Backfill(db *sql.DB, reporters ...func(current, total int)) (int, error) { rows, err := db.Query("SELECT " + columns + " FROM rides ORDER BY id") if err != nil { return 0, err @@ -113,7 +116,12 @@ func Backfill(db *sql.DB) (int, error) { return 0, err } backfilled := 0 - for _, item := range pending { + report := func(int, int) {} + if len(reporters) > 0 { + report = reporters[0] + } + for i, item := range pending { + report(i+1, len(pending)) if err := Save(db, item); err != nil { slog.Warn("Failed to backfill ride values", "ride", item.ExternalID, "file", item.GPXPath, "error", err) continue diff --git a/ride/store_test.go b/ride/store_test.go index 877f4e5..89c4830 100644 --- a/ride/store_test.go +++ b/ride/store_test.go @@ -197,6 +197,20 @@ func TestBackfill(t *testing.T) { assert.Equal(t, 1, count) } +func TestBackfillReportsProgress(t *testing.T) { + db := newTestDB(t) + require.NoError(t, Save(db, sampleRide(t))) + + var calls [][2]int + count, err := Backfill(db, func(current, total int) { + calls = append(calls, [2]int{current, total}) + }) + require.NoError(t, err) + assert.Equal(t, 1, count) + require.Len(t, calls, 1) + assert.Equal(t, [2]int{1, 1}, calls[0]) +} + func TestBackfillSkipsInvalidRide(t *testing.T) { db := newTestDB(t) _, err := db.Exec(` -- cgit v1.3