Repository navigation
Cut per-frame work in the explore screen, and harden the git probe, link guard and file-table reader - #84
Open
armada45-pixel wants to merge 3 commits into
Open
Cut per-frame work in the explore screen, and harden the git probe, link guard and file-table reader#84armada45-pixel wants to merge 3 commits into
armada45-pixel wants to merge 3 commits into
Conversation
Switching the metric re-ranks the tree in place instead of cloning it, which on a whole disk is tens of millions of nodes copied to change an order. A frame builds label text only for the tiles whose labels it will draw, and reuses the set of marked crumbs until the marks or the tree change. The sibling menu names only the rows it shows, layout picks its kept children with a partial sort, and `Node::find` walks a real queue. The free-space ticker asks the volume off the UI thread, since a network or sleeping drive can take seconds to answer, and shift-scroll panning is clamped like every other way of moving the view. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The git probe sets GIT_ALLOW_PROTOCOL=none: a scanned checkout's own configuration could otherwise name a transport for git to run while disktree only meant to read its status. The removal guard no longer passes a path whose real location cannot be read while its parent is there to read; a link leading out of the scanned root could hide behind that failure. The NTFS file-table reader bounds what a crafted volume can make it do: attribute-list records are capped, a table that claims more than its runs hold is refused, and a directory graph with a cycle stops the walk so the scan falls back to the ordinary one. Byte totals saturate instead of overflowing; release builds check overflow, so a wrapped sum was a panic. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Actions are pinned to commit SHAs, checkouts keep no credentials, and the macOS signing secrets reach only the two steps that use them instead of every step of the job, the build's own scripts included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three commits, each reviewable on its own. None of this overlaps #80, #81 or #82 as far as I can tell; where it came close (a mark on a name that is not Unicode) I left it to #82.
Performance
Arc::make_mut) instead of deep-cloning it first. On a whole disk that clone is tens of millions of nodes.Marksgets a generation counter).(index, value)pairs and names only the 24 rows it shows.select_nth_unstable_byand sorts only those, instead of sorting every child of a directory with 100k entries to keep 96.space_infoon the background executor. A network or sleeping drive can take seconds, and that was the UI thread.Fixes
Node::findtakes from the front of aVecDeque. Popping the back of aVecsearched depth-first, so a deep match in a late branch could be found before a shallow one.saturating_add. The release profile hasoverflow-checks = true, so a wrapped sum was a panic.Hardening
GIT_ALLOW_PROTOCOL=none. WithGIT_NO_LAZY_FETCHalready set this is a second lock on the same door: a scanned checkout's config must not be able to name a transport for git to run. The Unix test with anext::promisor remote passes on git ≥ 2.44 with or without this line (lazy fetch is already off there); it is a regression guard, not a proof.removal::linked: when a path's real location cannot be read but its parent is still there, the path is refused instead of passed. Before, a failedcanonicalizewas treated as "nothing to compare", which fails open.mft.rs: bounds for a crafted volume — attribute-list records are capped, a table whose runs are shorter than it claims is refused, and a directory cycle stops the walk so the scan falls back to the ordinary one.release.yml: actions pinned to SHAs,persist-credentials: false, and the macOS signing secrets moved from job-levelenvto the two steps that use them. Not exercised: I cannot run the release workflow, so this one needs a careful look, or drop the commit.Testing
Windows 11, Rust 1.97.1:
cargo xtask lintgreen,cargo xtask testgreen (68 app, 157 core, 1 ignored). Not run on Linux or macOS; the new git test is#[cfg(unix)]and so has only been compiled out here — CI will be its first run.🤖 Generated with Claude Code