Repository navigation
residue v0.0.13
Install
curl -fsSL https://residue.whiteheap.com/install.sh | sh
brew install whiteheap/tap/residueEither one; every other way is in docs/installation.md. The script also turns on automatic cleanup, which deletes worktrees without asking; residue restore brings each back for 30 days. To install without it, run curl -fsSL https://residue.whiteheap.com/install.sh | sh -s -- --no-service. Homebrew installs without it. Or download the file for your machine below. The packages and the FreeBSD archives arrive within half an hour of the release.
| Machine | File |
|---|---|
| macOS, Apple silicon | residue-v0.0.13-aarch64-apple-darwin.tar.gz |
| macOS, Intel | residue-v0.0.13-x86_64-apple-darwin.tar.gz |
| Linux, static (musl), x86_64 | residue-v0.0.13-x86_64-unknown-linux-musl.tar.gz |
| Linux, static (musl), arm64 | residue-v0.0.13-aarch64-unknown-linux-musl.tar.gz |
| Debian, Ubuntu | residue_amd64.deb, residue_arm64.deb |
| Fedora, RHEL | residue.x86_64.rpm, residue.aarch64.rpm |
| Arch Linux | residue-x86_64.pkg.tar.zst, residue-aarch64.pkg.tar.zst |
| FreeBSD, x86_64 | residue-v0.0.13-x86_64-unknown-freebsd.tar.gz |
| FreeBSD, aarch64 | residue-v0.0.13-aarch64-unknown-freebsd.tar.gz |
Check a download: shasum -a 256 -c SHA256SUMS --ignore-missing, then gh attestation verify FILE --repo whiteheap/residue-cli.
The Mac app: https://github.com/whiteheap/residue-ui/releases
Automatic cleanup on macOS and the BSDs no longer stops for good when watch runs out of open files, and a worktree with an ignored entry residue could not measure is kept.
- A running
watchon macOS and the BSDs no longer runs out of open files. kqueue holds an open file for each folderwatchwatches, and launchd starts a service with a limit of 256. With many branch folders underrefs/remotes, the watches took them all, and every pass after that failed withcould not start: Too many open files, so automatic cleanup stopped and removed nothing.watchnow raises its limit on open files and keeps 128 of it free for the Git and residue each pass starts (#168). - On macOS, residue spells each name in a path as Git does. Git precomposes each name on its own and keeps a name it cannot convert, such as one with an emoji, as stored. residue now does the same, name by name, so its walk measures an ignored folder below such names (#172).
- An ignored entry the walk did not reach is not judged. A rule that matches it no longer makes it regenerable: the
ignoredcheck isunknown(the walk did not reach it), which keeps the worktree (#172). - For scripts and integrations (changed from 0.0.12): such an entry is
"regenerable": false, withfilesandbytesnull as before, and theignoredcheck'sstatusisunknown(#172).
Details
Events::room(kqueue): the softRLIMIT_NOFILEis raised toward the hard limit, at most 10,240 (OPEN_MAXon macOS), and the watches stop 128 below it, as well as atMAX_WATCHES. inotify watches hold no open file and are unchanged. Tests:events::testsand.github/watch-smoke.shscenario 11, a running watch underulimit -n 256with 302 folders to watch, which removes a worktree whose upstream is pruned.fsinfo::git_pathconverts each name that holds a non-ASCII byte with Apple'siconvfrom UTF-8-MAC to UTF-8 on its own, keeps a name the conversion refuses or leaves alone, and gives the path as bytes, so the bucket lookup matches Git's path byte for byte.inspect::judgecalls an entryunknownwhen the walk did not reach it or could not run, before the environment-file check. Tests:fsinfo::tests::each_name_is_spelled_on_its_own_and_a_refused_one_is_kept,fsinfo::tests::git_spells_a_path_name_by_name_with_apples_converterandfsinfo::tests::a_bucket_in_gits_spelling_is_found_below_a_refused_name(macOS),inspect::tests::an_ignored_entry_the_walk_did_not_reach_is_not_judged, andscripts/contract-check.shsection 12b,ignored-mixed-names-env,ignored-mixed-names-env-swappedandignored-mixed-names-clean(macOS; skipped by name elsewhere).