Skip to content

Commit dd9c75d

Browse files
fix: address PR review findings
- Keep decodeErr as a hard failure in ensureDaemon even when ROBOREV_SKIP_VERSION_CHECK=1 is set, so non-daemon processes returning HTTP 200 are not falsely accepted. - Trim trailing newline in compact mode to prevent TUI layout overflow by one line on every render frame. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent aed022f commit dd9c75d

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

cmd/roborev/daemon_lifecycle.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,17 @@ func ensureDaemon() error {
143143
}
144144
decodeErr := json.NewDecoder(resp.Body).Decode(&status)
145145

146-
// Fail closed: restart if decode fails, version empty, or mismatch
147-
if !skipVersionCheck && (decodeErr != nil || status.Version == "" || status.Version != version.Version) {
146+
// Always fail on decode errors (response is not a valid daemon)
147+
if decodeErr != nil {
148148
if verbose {
149-
fmt.Printf("Daemon version mismatch or unreadable (daemon: %s, cli: %s), restarting...\n", status.Version, version.Version)
149+
fmt.Printf("Daemon response unreadable, restarting...\n")
150+
}
151+
return restartDaemon()
152+
}
153+
// Skip version mismatch check when env var is set
154+
if !skipVersionCheck && (status.Version == "" || status.Version != version.Version) {
155+
if verbose {
156+
fmt.Printf("Daemon version mismatch (daemon: %s, cli: %s), restarting...\n", status.Version, version.Version)
150157
}
151158
return restartDaemon()
152159
}
@@ -165,10 +172,17 @@ func ensureDaemon() error {
165172
}
166173
decodeErr := json.NewDecoder(resp.Body).Decode(&status)
167174

168-
// Fail closed: restart if decode fails, version empty, or mismatch
169-
if !skipVersionCheck && (decodeErr != nil || status.Version == "" || status.Version != version.Version) {
175+
// Always fail on decode errors (response is not a valid daemon)
176+
if decodeErr != nil {
177+
if verbose {
178+
fmt.Printf("Daemon response unreadable, restarting...\n")
179+
}
180+
return restartDaemon()
181+
}
182+
// Skip version mismatch check when env var is set
183+
if !skipVersionCheck && (status.Version == "" || status.Version != version.Version) {
170184
if verbose {
171-
fmt.Printf("Daemon version mismatch or unreadable (daemon: %s, cli: %s), restarting...\n", status.Version, version.Version)
185+
fmt.Printf("Daemon version mismatch (daemon: %s, cli: %s), restarting...\n", status.Version, version.Version)
172186
}
173187
return restartDaemon()
174188
}

cmd/roborev/tui/render_queue.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,10 +306,16 @@ func (m model) renderQueueView() string {
306306
b.WriteString(renderHelpTable(m.queueHelpRows(), m.width))
307307
}
308308

309-
b.WriteString("\x1b[K") // Clear to end of line (no newline at end)
310-
b.WriteString("\x1b[J") // Clear to end of screen to prevent artifacts
309+
output := b.String()
310+
if compact {
311+
// Trim trailing newline to avoid layout overflow (compact has no
312+
// help footer to consume the final line).
313+
output = strings.TrimSuffix(output, "\n")
314+
}
315+
output += "\x1b[K" // Clear to end of line (no newline at end)
316+
output += "\x1b[J" // Clear to end of screen to prevent artifacts
311317

312-
return b.String()
318+
return output
313319
}
314320
func (m model) calculateColumnWidths(idWidth int) columnWidths {
315321
// Fixed widths: ID (idWidth), Status (8), P/F (3), Queued (12), Elapsed (8), Addressed (9)

0 commit comments

Comments
 (0)