Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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