vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Tail run logs in the browser and make steps accordions
34d6fd7a9210fca265ea4aea1d5733b3eeeb2569 · Keenan Nemetz · 10d ago · parent 5ece70a5
Tail run logs in the browser and make steps accordions The log endpoint now serves from a byte offset and marks an attempt's log final, so the run page can poll only while the job runs. The job output accordion follows the stream; each step is its own accordion with its slice or a clear empty state. The steps table is gone; the logs card is the whole viewer.
server/web/static/vole.css +41−1
| @@ -1449,6 +1449,47 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1449 | 1449 | color: var(--fg); | |
| 1450 | 1450 | border-bottom: 1px solid var(--border); | |
| 1451 | 1451 | } | |
| 1452 | .run-log-card { | ||
| 1453 | padding: 0; | ||
| 1454 | overflow: hidden; | ||
| 1455 | } | ||
| 1456 | .run-log-card > .run-log { | ||
| 1457 | margin: 0; | ||
| 1458 | border: 0; | ||
| 1459 | border-bottom: 1px solid var(--border); | ||
| 1460 | border-radius: 0; | ||
| 1461 | } | ||
| 1462 | .run-log-card > .run-log:last-child { border-bottom: 0; } | ||
| 1463 | .run-log-title { flex: 1; color: var(--fg); font-weight: 500; } | ||
| 1464 | .run-log-meta { | ||
| 1465 | margin-left: auto; | ||
| 1466 | color: var(--fg-faint); | ||
| 1467 | font-size: calc(12.1px * var(--font-scale)); | ||
| 1468 | font-variant-numeric: tabular-nums; | ||
| 1469 | } | ||
| 1470 | .run-step-num { | ||
| 1471 | color: var(--fg-faint); | ||
| 1472 | font-variant-numeric: tabular-nums; | ||
| 1473 | min-width: 2.5ch; | ||
| 1474 | } | ||
| 1475 | .run-step-name { | ||
| 1476 | flex: 1; | ||
| 1477 | color: var(--fg); | ||
| 1478 | overflow-wrap: anywhere; | ||
| 1479 | } | ||
| 1480 | .run-step-meta { | ||
| 1481 | margin-left: 8px; | ||
| 1482 | color: var(--fg-faint); | ||
| 1483 | font-size: calc(12.1px * var(--font-scale)); | ||
| 1484 | font-variant-numeric: tabular-nums; | ||
| 1485 | white-space: nowrap; | ||
| 1486 | } | ||
| 1487 | .run-log-empty { | ||
| 1488 | margin: 0; | ||
| 1489 | padding: 10px 12px; | ||
| 1490 | color: var(--fg-muted); | ||
| 1491 | font-size: calc(13.2px * var(--font-scale)); | ||
| 1492 | } | ||
| 1452 | 1493 | .run-log-text { | |
| 1453 | 1494 | margin: 0; | |
| 1454 | 1495 | padding: 10px 12px; | |
| @@ -1463,7 +1504,6 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1463 | 1504 | overflow: auto; | |
| 1464 | 1505 | white-space: pre; | |
| 1465 | 1506 | } | |
| 1466 | .run-step-log td { padding: 0 8px 8px; } | ||
| 1467 | 1507 | .run-logbar { | |
| 1468 | 1508 | display: flex; | |
| 1469 | 1509 | flex-wrap: wrap; | |