auto-update: dev-util/worktrunk - #118
Open
divoxx-bot[bot] wants to merge 1 commit into
Open
Conversation
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.
Automated upstream version bump for
dev-util/worktrunk.What changed
worktrunk 0.72.0
Improved
A host carrying a forge's name anywhere resolves to that forge again: 0.71.0 required
github,gitlab, orgiteaas a whole dot-separated label, which read as an ownership check but wasn't one — an attacker controls their own DNS — while shutting out self-hosters with hyphenated names.github-enterprise.acme.com,mygithub.com, and thegithub-personalSSH alias classify again, so CI status,wt switch --prs, andrepo.providerwork with no config. (#3673)One
[projects."…"]entry can cover every repository on a host, and can set the forge: A key containing*matches any run of characters,/included, so[projects."git.company.example/*"]covers a whole host; every matching entry applies, least- to most-specific. The table also gainedforge.platformandforge.hostname, so a self-hosted host needs one entry here rather than a block in every repo. Docs (#3701, thanks @chrishas35 for the request and @witt-bit for the workspace-scoped case it partly serves)wt mergeandwt step pushleave the target worktree's uncommitted changes in place: The autostash that held a dirty target's changes restored them as unstaged; both now advance the target with a compare-and-swapupdate-refandread-tree -m -u, which leaves uncommitted work untouched. (Breaking: the fast-forward path no longer runsgit push, sopre-pushand the receive-side hooks no longer fire, and a failed sync errors with the ref rolled back.) (#3703, #3684, #3693, thanks @gubasso for reporting)Approval state and branch-removal outcomes are machine-readable:
wt config approvals list --format=jsonreports whether a non-interactive run would stop for approval.wt removeandwt step prunereplacebranch_deletedwithbranch_outcome:deleted,deferred,not_attempted,retained_unmerged,retained_checked_out,retained_raced,retained_failed. (Breaking.) (#3710, thanks @NathanaelRea for the requests)Every commit hash worktrunk prints follows
core.abbrev: Thewt listtable,wt switch --prs'slogtab, andwt config state's CI cache table sliced to 8 characters while--format=jsoncarried git's%h. All now ask git how wide it abbreviates in this repo. (#3676, #3677)wt list --format=jsonschema 2 has a published JSON Schema: worktrunk.dev/schema/list-v2.json holds the contract, andwt list --print-schemaprints the same document. Four fields that were bare strings are now enumerated vocabularies; the emitted JSON is unchanged. (#3747)A detached worktree is named by its commit, not
-: The Branch cell hardcoded-, which reads as missing data rather than a state; it now carries the row's abbreviated HEAD, and the picker and statusline name the worktree the same way. (#3675)Fixed
Piped output is plain and no longer panics:
wt list | head -3exited 101 withfailed printing to stdout: Broken pipe, andwt listwrote ANSI to a pipe unconditionally. Every stdout surface now exits cleanly, and the human-read ones are plain when piped unlessCLICOLOR_FORCE=1. (#3746, #3766)A CI check that hasn't finished no longer reads as passed: Each forge's status parser missed documented values, so a GitHub PR parked on an approval gate showed green, and GitLab's
cancelingand Azure DevOps'spostponedread as no CI at all. (#3741, #3740)The shell wrappers survive an
rmalias and a failing--execute: Aliases bake into the wrapper at parse time, soalias rm='rm -v'reached its cleanup — noise on zsh and bash, and on nushell an abort that leaked three temp files, as a failing--executebody also did. (#3714, thanks @Ar4l), (#3732, #3734)An alias or hook wrapping
wt switchorwt removekeeps your subdirectory: The user's position came from thewtprocess's cwd, which inside an alias body is the worktree root, so an aliasedwt removefromfeature/apps/gatewaylanded at the primary worktree's root. Fixes #3723. (#3724, thanks @vivienm for reporting)wt mergeandwt step pushrefuse a target worktree parked mid-operation: The two-tree sync refuses an unmerged index but not a stopped cherry-pick or rebase whose conflict was already staged, so the push range could land in a paused target and be committed by--continue. (#3759)The Claude plugin's worktree-remove hook resolves against the worktree path: The hook anchored at
CLAUDE_PROJECT_DIR, which theclaude agentsview routinely leaves outside any repository, sowt removedied withnot a git repositoryand the session became undeletable. Its guard now also requires a.gitentry. (#3754, #3767, thanks @judewang for the fix and the report)A Gitea API error is reported as one, not as a parse failure:
tea apiexits 0 whatever the HTTP status, so both call sites guessed from the body's shape and blamed an API change for an API error.--includesurfaces the status instead. (#3713, #3600)--print-schemaand the doc-generation help flags name the right command: All three found the subcommand by scanningargvfor a/wtsuffix, which never matcheswt.exeunder a backslash path, so on Windows they read the binary's own path as the command. (#3762)A multibyte shell name no longer panics:
extract_filename_from_pathsliced atlen() - 4to test for.exewith no char-boundary check:SHELL=/bin/日本語 wt config showpanicked, and on macOS every process name goes through it during shell detection. (#3727)wtinstalled under a dotted name generates shell integration for that name:binary_nameusedfile_stem, which cuts at the last dot, sowt config shell init bashunderwt.oldemitted a wrapper forwt. It now strips only the executable suffix. (#3719)Concurrent
wt step pruneremovals no longer race the worktree registry:git worktree removereads every sibling under.git/worktrees/, so two overlapping removals could have one read a sibling mid-teardown. Registry-mutating removals now serialize behind a second lock. (#3692)The
wt switchfirst-run offer previews the legacy files it removes: Accepting "Install shell integration?" could delete a deprecated worktrunk-managed wrapper the prompt never named. What gets removed is unchanged. (#3656)wt config create --projectwrites a resolvable link: The comment it writes into.config/wt.tomlcarried a raw Zola target, because the link-conversion regex stopped at the first]— here the one closing a nested code span. (#3731)wt list --branchescounts a local branch containing/as local: The summary tally classified branch-only rows bybranch.contains('/'), so a localfeature/logincounted under "N remote branches". (#3687)wt step relocate's human summary counts template-error branches as skipped:--format=jsonalready folded them intoskipped; the human tally undercounted by the number of branches whoseworktree-pathtemplate failed to expand. (#3688)Documentation
SignPath attribution appears with the artifacts it describes: The code-signing notice and a route to the policy now sit in the install section's Windows block on the README and the docs landing page, as SignPath Foundation's OSS program requires. (#3709)
wt step copy-ignored's--require-includeexample renders as a terminal block: It was the onlyconsoleblock in the command's long help missing the$prefix. (#3706)Internal
Library API rework (Breaking library API):
cargo-semver-checksfails five lints —LegacyForgeAliasandRepository::legacy_forge_aliasremoved with the forge-classification revert,Repository::forge_platform_overrideremoved for one shared resolver,stage_worktree_removalgained two parameters,UserProjectOverridesgained aforgefield, and thereal-repo-benchesfeature was removed. (#3673, #3694, #3701, #3721)One function owns the pre-removal gate:
stage_worktree_removalnow performs the dirty-worktree gate, the fsmonitor stop, and the rename into trash for both removal paths. (#3694)The test mock stub is the
wtbinary itself:cargo test --test integrationnever rebuilt the separatemock-stubpackage;wtis now linked under each mock's name instead. (#3712)-vvtraces report a normal run's fork count:prewarm_atfast-pathed on a cache key that-vv's own logging setup had populated, so every trace overstated a normal run's config forks. (#3705)Benchmarks are organized by repository shape: Groups select semantic
FixtureRecipes and share table-driven cases; separate fixtures remain only for a controlled contrast, a destructive precondition, or disproportionate setup cost. (#3721)azandteaspans group undernetworkinwt-perf timeline: The trace exporter'snetworkbucket recognized onlyghandglab. (#3689)Verification will run automatically via the verify workflow. The PR will be promoted from draft to ready when all checks pass.
Generated with Claude Code