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.
Open one file at a time on the commit page
628d45239eb09af4e46c9dc779d30144e96c7e6f · Keenan Nemetz · 11d ago · parent 816cc543
Open one file at a time on the commit page
A commit page rendered every patch it contained, so a broad commit turned one
page load into every blob it touched. It now opens the file tree beside the diff
of a single file, the same shape a change request's Files tab uses: the tree is
built from `git show --name-status`, only the selected path's patch is read, and
a tree click swaps the pane over HTMX. `/commit/{sha}/{path}` deep-links a file
and a 512 KiB cap still bounds one file's patch.
The file tree became one widget for three surfaces rather than two, so its
context gained a Commit field and its href/target/status rules moved onto the
view (Branch, Diff, Href).
The pane's header is now one row: the file's name on the left and its line
counts on the right, with the separate "1 file changed" summary line dropped
when a single file fills the pane. The total-line remains for the multi-file
diff a compare renders.
docs/ui-plan.md +14−10
| @@ -115,7 +115,8 @@ Status: `done` exists today · `wip` in progress · `todo` missing. | |||
| 115 | 115 | - done — a README's relative links and images resolve against the document's own | |
| 116 | 116 | directory and open on the code surface, so the same README works from the | |
| 117 | 117 | overview and from the code browser | |
| 118 | - done — commit history, commit view, parent links, diff | ||
| 118 | - done — commit history, commit view, parent links, and a diff per changed file | ||
| 119 | in the same file-tree-and-pane layout as a change's Files tab | ||
| 119 | 120 | - done — issues list/detail, comments, filters, close/reopen, labels and assignees (create and edit) | |
| 120 | 121 | - done — change-request list/detail with Conversation, Files and Runs tabs; one-level threaded discussion UI, approvals, file tree and diff, inline review comments, close/reopen | |
| 121 | 122 | - done — releases list/detail, artifacts, archives | |
| @@ -300,15 +301,18 @@ are read together. Four files hold what more than one surface uses: `chrome.html | |||
| 300 | 301 | (shell, global bar, repository header, error page), `components.html` (token | |
| 301 | 302 | input, commit list, file tree, pager), `diff.html`, and `role-picker.html`. All | |
| 302 | 303 | templates share one namespace, so a fragment name is prefixed with its surface | |
| 303 | (`issue_labels`, `code_main`, `review_main`); a fragment both surfaces render | ||
| 304 | keeps the shared name (`comment_thread`, `comment_card`). | ||
| 305 | |||
| 306 | The file tree is one widget for both browsers. The code browser and a change's | ||
| 307 | Files tab pass the same tree nodes through `treeContext`, and | ||
| 308 | `treeHref` decides whether a row opens a blob at a ref or the file's diff in a | ||
| 309 | change. The pager is likewise one control for issues, change requests, and the | ||
| 310 | instance feed: the handler supplies the URLs, the label, and (for HTMX) the | ||
| 311 | fragment to swap. | ||
| 304 | (`issue_labels`, `code_main`, `review_main`, `commit_main`); a fragment both | ||
| 305 | surfaces render keeps the shared name (`comment_thread`, `comment_card`). | ||
| 306 | |||
| 307 | The file tree is one widget for all three browsers. The code browser, a change's | ||
| 308 | Files tab and a commit page pass the same tree nodes through `treeContext` or | ||
| 309 | `commitTreeContext`, and `treeView.Href` decides whether a row opens a blob at a | ||
| 310 | ref, the file's diff in a change, or the file's diff in a commit. A commit is the | ||
| 311 | same shape as the Files tab because it answers the same question one file at a | ||
| 312 | time: the tree is built from `git show --name-status`, a single row's patch is | ||
| 313 | read on demand, and only the pane is swapped when a row is opened. The pager is | ||
| 314 | likewise one control for issues, change requests, and the instance feed: the | ||
| 315 | handler supplies the URLs, the label, and (for HTMX) the fragment to swap. | ||
| 312 | 316 | ||
| 313 | 317 | Static assets are served from `/static/` and embedded in the binary at build | |
| 314 | 318 | time; nothing is loaded from a CDN and no template inlines CSS or JS. The passkey | |