Release Notes
Improved
-
A JSON bool or null nested in a
varsvalue renders asTrue,False, orNone: minijinja 2.22 adopted Jinja2's spelling for all three, so{{ vars.<key>.<field> }}into an object set bywt config state vars setprints those words. A var whose whole value istruestays a string. (Breaking: the old spellings weretrue,false, andnone.) (#3795) -
wt config approvals add --yesrecords approvals without a terminal: the command refused every non-interactive run, so a container or CI job could not pre-approve a project it had just cloned.--yesnow lists what it trusts and writes it, and a save it cannot make fails the command rather than warning and exiting 0. (#3819) -
remote_reponames the repository as the remote spells it:repois the directory on disk, so a renamed clone reports the new name.{{ remote_repo }}takes it from the primary remote's URL, available everywhereowneris and unset when no remote parses. (#3745, thanks @canac)
Fixed
-
wt remove --forcedeleted a live worktree moved onto another's registered path: the ownership gate asked which repository the occupant belonged to, which a sibling worktree of this repo satisfies, so the directory went to trash with its uncommitted work. The directory and the registration must now name each other, asgit worktree removerequires. Also reacheswt merge,wt step prune, and picker removal, and refuses a bare repository's path that--forcepreviously deleted. (#3808) -
wt step copy-ignoredskips a source file that vanishes mid-copy: the walk collects leaves, then copies them in parallel, so a file removed in between — a concurrent build rewritingtarget/, say — aborted the batch, under--forceafter deleting the destination. The source is stat'd before anything is removed now. (#3744, fixes #3743, thanks @dataders for reporting and fixing) -
wt step promoterefuses to delete a source it did not fully copy: across filesystems the move copies then deletes, and an entry with no copy — a socket or FIFO, or a file a concurrent build rewrote mid-walk — was deleted anyway. The copy now reports what it skipped, and a non-zero count fails the move. (#3820) -
An
ssh://remote's host comes from the authority, not a later path segment: the search for the userinfo@covered the whole remainder, sossh://git@attacker.example/owner/repo@github.com/org/repo.gitresolved togithub.comand borrowed that repository's approvals while git dialed the attacker. Every URL form now splits the authority first, so@in a namespace parses instead of being rejected. (#3813) -
WORKTRUNK_*env vars and--config-setoutrank a[projects."…"]entry: layer and specificity resolved separately, so a project entry answered for the global key whichever layer set it —WORKTRUNK_WORKTREE_PATHcould not override a project'sworktree-path. Both invocation layers now apply at either scope, and the help text gained a precedence section. (#3790, fixes #3788, thanks @jeremy0dell for reporting) -
Shell completions register under the
--cmdname:wt config shell init zsh --cmd wotrenamed the wrapper, but clap emitted the registration underwt. Bash and zsh completed nothing and regenerated the script on every TAB, PowerShell registered the wrong command, and zsh'scompdefhanded worktrunk's completer to the otherwt. (#3817, fixes #3816, thanks @sbarre for reporting)
Documentation
- The picker's
Alt-xnever forces: the keybinding table readRemove selected worktree/branch, which sent a reader looking for a force-remove that isn't there. (#3811, raised in #3809, thanks @josh-burton)
Internal
- Library API rework (Breaking library API):
GitError::WorktreePathNotOursgained anoccupant_registered_atfield, andWorkingTree::ensure_belongs_to_repois nowensure_holds_this_worktree. (#3808)
Install worktrunk 0.74.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.74.0/worktrunk-installer.sh | sh && wt config shell installInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/max-sixty/worktrunk/releases/download/v0.74.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.74.0
| File | Platform | Checksum |
|---|---|---|
| worktrunk-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| worktrunk-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| worktrunk-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| worktrunk-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| worktrunk-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Install via Cargo
cargo install worktrunk && wt config shell installInstall via Winget (Windows)
winget install max-sixty.worktrunk && git-wt config shell installInstall via AUR (Arch Linux)
paru worktrunk-bin && wt config shell install