Compare commits

...
Author SHA1 Message Date
sneak 46da71dd2c TODO.md: drop work logs, keep only open work (closes #20)
check / check (push) Successful in 2m16s
Removes the Status section, which listed work already landed on next,
and the Next Step section, whose two items are done: the milestone PR
merged and the binary has run on a Mac. The Workflow section stays.

Model: opus-5-5
2026-11-11 00:10:58 +00:00
sneak 5b16fd3310 Merge pull request 'Show UTC as the first header clock instead of hardcoded Los Angeles time' (#19) from header-utc-clock into next
check / check (push) Successful in 2m10s
Reviewed-on: #19
2026-11-07 05:23:53 +01:00
sneak 8746591889 Merge branch 'next' into header-utc-clock
check / check (push) Successful in 2m6s
2026-11-07 05:23:40 +01:00
sneak bbceab0b24 Show UTC as the first header clock instead of hardcoded Los Angeles time
check / check (push) Successful in 2m0s
The header drew the host's local time and then America/Los_Angeles
time, so on a Mac in that zone both clocks read the same and neither
was UTC. The first clock is now UTC and the second the host's local
time, which also drops the hardcoded zone and its load-failure path.
2026-11-06 19:12:41 -08:00
4 changed files with 42 additions and 34 deletions

No files matched your search

-24
View File
@@ -15,27 +15,3 @@ from `main` onto `prod`; `prod` never follows `main` automatically.
Other issue branches do not touch this file; it changes only in its own PR to
`next`, because every branch editing `TODO.md` conflicts with every other.
# Status
On `next`:
- Repo standards (https://git.eeqj.de/sneak/rtnetmon/issues/1): the `script/`
entrypoints, the vendored `.golangci.yml`, and `REPO_POLICIES.md`.
- Interface detection on Linux and macOS
(https://git.eeqj.de/sneak/rtnetmon/issues/2).
- The fix for macOS VPN detection (https://git.eeqj.de/sneak/rtnetmon/issues/8).
- Starlink status lines (https://git.eeqj.de/sneak/rtnetmon/issues/3).
- A version stamp: built with `make build` or a plain `docker build .`, the
binary logs its git tag or short commit at startup
(https://git.eeqj.de/sneak/rtnetmon/issues/10).
- CI that runs `script/cibuild` on every push to a branch
(https://git.eeqj.de/sneak/rtnetmon/issues/12).
# Next Step
- `sneak` merges the milestone PR, https://git.eeqj.de/sneak/rtnetmon/pulls/6,
carrying `next` into `main`.
- A first run on a real Mac of what is on `next` now. The fix for
https://git.eeqj.de/sneak/rtnetmon/issues/8 has not run on a Mac yet;
`sneak`'s first run on his Mac is its test.
+4
View File
@@ -2,6 +2,7 @@ package monitor
import (
"context"
"time"
"git.eeqj.de/sneak/rtnetmon/internal/starlink"
)
@@ -59,6 +60,9 @@ func (m *Monitor) TCPHosts() []string { return m.tcpHosts }
// Interfaces returns the monitored interfaces.
func (m *Monitor) Interfaces() []*InterfaceStatus { return m.interfaces }
// ClockStrings exposes clockStrings for external tests.
func ClockStrings(now time.Time) (string, string) { return clockStrings(now) }
// PingArgs exposes pingArgs for external tests.
func PingArgs(goos, iface, host string) []string { return pingArgs(goos, iface, host) }
+11 -10
View File
@@ -337,6 +337,15 @@ func drawICMPStats(scr tcell.Screen, y int, st *InterfaceStatus) int {
}
// uiLoop runs the UI event loop.
// clockFormat is the layout of both header clocks.
const clockFormat = time.RFC1123Z
// clockStrings renders the header clocks: UTC first, then the host's local
// time in whatever location now carries.
func clockStrings(now time.Time) (string, string) {
return now.UTC().Format(clockFormat), now.Format(clockFormat)
}
func (m *Monitor) uiLoop(ctx context.Context) {
m.logf("UI loop started")
@@ -348,13 +357,6 @@ func (m *Monitor) uiLoop(ctx context.Context) {
m.logf("Screen finalized")
}()
pstLoc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
m.logf("Error loading PST location: %v", err)
pstLoc = time.UTC
}
timestampSpinFrame := 0
lastTimestampSpinUpdate := time.Now()
@@ -365,8 +367,7 @@ func (m *Monitor) uiLoop(ctx context.Context) {
Put(m.screen, colLeft, rowTopRule, HLine(w), tcell.StyleDefault)
now := time.Now()
timeStr := now.Format(time.RFC1123Z)
pstTimeStr := now.In(pstLoc).Format(time.RFC1123Z)
timeStr, localTimeStr := clockStrings(now)
if time.Since(lastTimestampSpinUpdate) >= time.Second {
timestampSpinFrame = (timestampSpinFrame + 1) % len(brailleSpins())
@@ -380,7 +381,7 @@ func (m *Monitor) uiLoop(ctx context.Context) {
Put(m.screen, colSpinner, rowClock, string(brailleChar)+" ", tcell.StyleDefault)
DrawRainbowText(m.screen, colMeter, rowClock, timeStr, colors)
DrawRainbowText(m.screen, colMeter+len(timeStr)+clockGap, rowClock,
pstTimeStr, colors)
localTimeStr, colors)
Put(m.screen, colLeft, rowBottomRule, HLine(w), tcell.StyleDefault)
runtime := time.Since(m.startTime).Round(time.Second).String()
+27
View File
@@ -0,0 +1,27 @@
package monitor_test
import (
"testing"
"time"
"git.eeqj.de/sneak/rtnetmon/internal/monitor"
)
// TestClockStrings checks that the header shows UTC first and the host's
// local time second, so the two differ whenever the host is not on UTC.
func TestClockStrings(t *testing.T) {
t.Parallel()
berlin := time.FixedZone("CET", 3600)
now := time.Date(2026, time.November, 6, 20, 30, 0, 0, berlin)
utc, local := monitor.ClockStrings(now)
if want := "Fri, 06 Nov 2026 19:30:00 +0000"; utc != want {
t.Errorf("utc = %q, want %q", utc, want)
}
if want := "Fri, 06 Nov 2026 20:30:00 +0100"; local != want {
t.Errorf("local = %q, want %q", local, want)
}
}