Fix log file sorting to handle both timestamp and sha formats
Some checks failed
CI / test (pull_request) Has been cancelled

Replace naive sort with explicit timestamp extraction that works for both the new timestamp_sha format and legacy sha_timestamp format. Extract log filename parsing into a reusable function for consistency.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Corey Johnson 2026-03-10 11:53:38 -07:00
parent a37dc8b503
commit 30a6b0c987
2 changed files with 31 additions and 5 deletions

View File

@ -50,11 +50,17 @@ function createLogFile(): string {
return `${logsDir}/${timestamp}_${releaseSha}.jsonl`
}
function extractTimestamp(filename: string): string {
const stem = filename.replace(".jsonl", "")
// New format: timestamp_sha, Old format: sha_timestamp
if (/^\d{4}-/.test(stem)) return stem.split("_").slice(0, -1).join("_")
return stem.split("_").pop() || ""
}
export function listLogFiles(): string[] {
return readdirSync(logsDir)
.filter((f) => f.endsWith(".jsonl"))
.sort()
.reverse()
.sort((a, b) => extractTimestamp(b).localeCompare(extractTimestamp(a)))
.slice(0, 20)
}

View File

@ -108,11 +108,32 @@ function EventRow({ event, index }: { event: StoredLogEvent; index: number }) {
)
}
function parseLogFilename(file: string): { sha: string; isoStr: string } {
const stem = file.replace(".jsonl", "")
// New format: timestamp_sha (e.g. 2026-03-10T18-06-23-561Z_cb10121)
// Old format: sha_timestamp (e.g. cb10121_2026-03-10T18-06-23-561Z)
const isNewFormat = /^\d{4}-/.test(stem)
const parts = stem.split("_")
let sha: string
let rawTimestamp: string
if (isNewFormat) {
sha = parts.pop() || "unknown"
rawTimestamp = parts.join("_")
} else {
rawTimestamp = parts.pop() || ""
sha = parts.join("_") || "unknown"
}
const isoStr = rawTimestamp.replace(/T(\d{2})-(\d{2})-(\d{2})-(\d+)Z/, "T$1:$2:$3.$4Z")
return { sha, isoStr }
}
function Sidebar({ files, selectedFile }: { files: string[]; selectedFile?: string }) {
// Group files by sha, sorted by most recent file in each group
const grouped: Record<string, string[]> = {}
for (const file of files) {
const sha = file.replace(".jsonl", "").split("_").pop() || "unknown"
const { sha } = parseLogFilename(file)
const list = grouped[sha] || (grouped[sha] = [])
list.push(file)
}
@ -130,8 +151,7 @@ function Sidebar({ files, selectedFile }: { files: string[]; selectedFile?: stri
<div style="padding: 4px 16px; color: #6b7280; font-size: 11px; font-family: monospace">{sha}</div>
{shaFiles.map((file) => {
const isSelected = file === selectedFile
// Parse ISO timestamp back from filename: 2026-03-10T02-56-59-938Z_sha.jsonl
const isoStr = file.replace(/_[^_]+\.jsonl$/, "").replace(/T(\d{2})-(\d{2})-(\d{2})-(\d+)Z/, "T$1:$2:$3.$4Z")
const { isoStr } = parseLogFilename(file)
const bg = isSelected ? "#2a2a2a" : "transparent"
return (
<a