vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Compact the change request target controls
41d1fee900568b1bff5c7cff3b4c52942f47fabd · Keenan Nemetz · 13d ago · parent e050e14a
Compact the change request target controls Replace the separate base and head forms and the duplicated labels with one row: base picker, head picker, update. The pickers preselect the current targets, and a pinned head appears as the current commit. Collapse the help text to one line. Post both targets to one /target handler and write them in one metadata commit. Either change invalidates approvals; keeping the current value is allowed even if its branch has gone missing so the other side can still be repaired.
server/web/static/vole.css +33
| @@ -1672,6 +1672,39 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1672 | 1672 | } | |
| 1673 | 1673 | .meta-list dt { color: var(--fg-faint); } | |
| 1674 | 1674 | .meta-list dd { margin: 0; min-width: 0; overflow-wrap: anywhere; } | |
| 1675 | |||
| 1676 | /* The request target is one row: base, head, update. The selects carry the | ||
| 1677 | current values, so the sidebar needs no separate labels above them. */ | ||
| 1678 | .request-target { margin: 2px 0 0; } | ||
| 1679 | .request-target .target-row { | ||
| 1680 | display: grid; | ||
| 1681 | grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto; | ||
| 1682 | align-items: center; | ||
| 1683 | gap: 6px; | ||
| 1684 | } | ||
| 1685 | .request-target select { | ||
| 1686 | min-width: 0; | ||
| 1687 | width: 100%; | ||
| 1688 | min-height: 28px; | ||
| 1689 | padding: 3px 6px; | ||
| 1690 | font-size: 12px; | ||
| 1691 | } | ||
| 1692 | .request-target button { | ||
| 1693 | display: inline-flex; | ||
| 1694 | align-items: center; | ||
| 1695 | justify-content: center; | ||
| 1696 | min-height: 28px; | ||
| 1697 | padding: 3px 7px; | ||
| 1698 | } | ||
| 1699 | .request-target p { margin: 6px 0 0; font-size: 11.5px; } | ||
| 1700 | .target-summary { | ||
| 1701 | display: flex; | ||
| 1702 | flex-wrap: wrap; | ||
| 1703 | align-items: center; | ||
| 1704 | gap: 5px; | ||
| 1705 | margin: 0; | ||
| 1706 | font-size: 12px; | ||
| 1707 | } | ||
| 1675 | 1708 | .label-row { display: inline-flex; flex-wrap: wrap; gap: 4px; } | |
| 1676 | 1709 | .label-row .label { margin-left: 0; } | |
| 1677 | 1710 | ||