Skip to content

residue v0.0.13

Choose a tag to compare

@github-actions github-actions released this 09 Nov 21:02
· 34 commits to main since this release
v0.0.13
2090ca8

Install

curl -fsSL https://residue.whiteheap.com/install.sh | sh
brew install whiteheap/tap/residue

Either 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 watch on macOS and the BSDs no longer runs out of open files. kqueue holds an open file for each folder watch watches, and launchd starts a service with a limit of 256. With many branch folders under refs/remotes, the watches took them all, and every pass after that failed with could not start: Too many open files, so automatic cleanup stopped and removed nothing. watch now 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 ignored check is unknown (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, with files and bytes null as before, and the ignored check's status is unknown (#172).

Details

  • Events::room (kqueue): the soft RLIMIT_NOFILE is raised toward the hard limit, at most 10,240 (OPEN_MAX on macOS), and the watches stop 128 below it, as well as at MAX_WATCHES. inotify watches hold no open file and are unchanged. Tests: events::tests and .github/watch-smoke.sh scenario 11, a running watch under ulimit -n 256 with 302 folders to watch, which removes a worktree whose upstream is pruned.
  • fsinfo::git_path converts each name that holds a non-ASCII byte with Apple's iconv from 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::judge calls an entry unknown when 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_converter and fsinfo::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, and scripts/contract-check.sh section 12b, ignored-mixed-names-env, ignored-mixed-names-env-swapped and ignored-mixed-names-clean (macOS; skipped by name elsewhere).