Skip to content

v0.28.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 03:33
· 142 commits to main since this release
e1d85b6

A release about safety and speed: abort and undo now protect your uncommitted work, and the Git layer was rebuilt around batched reads and writes so most commands spawn far fewer git processes.

Highlights

  • abort restores uncommitted work and only undoes its own command. When a halted modify, create, absorb, or split is aborted, the work it consumed comes back with the original staged/unstaged split, and abort now rolls back only that command's own snapshot, never an unrelated newer one.
  • undo restores your working tree too. Undo now brings back captured uncommitted and untracked changes along with refs and metadata, and undo history is kept per worktree.
  • Batched Git layer. Revisions, commits, diffs, metadata reads/writes, restack planning, and worktree ownership lookups now go through batched APIs, and the quadratic stack-graph traversal is gone. Large stacks see noticeably fewer git subprocesses; benchmarks are in docs/benchmarks*.md.
  • Dashboard search. The web dashboard header can now search stacks by title, scope, branch name, PR title, and more, with a streamlined layout.
  • get respects other worktrees. get skips branches checked out in another worktree (and reports them) and never rebases a re-anchored branch whose landed-parent anchor is unknown.

Behavior changes

  • stackit abort only rolls back the halted command's own snapshot. A conflict paused by v0.27.1 (or a merge conflict) carries no bound snapshot, so abort unwinds Git but leaves branches as they are; use stackit undo to roll back further. Finish or abort any in-flight conflict before upgrading to avoid this.
  • stackit undo refuses to run while you have tracked uncommitted changes; commit or stash them first.
  • Remote metadata updates for multiple branches are now applied atomically. A single corrupt local metadata record fails the batch (for example, submit reports "failed to update metadata") instead of being silently replaced with empty metadata.

Features

  • Added dashboard search and refined the dashboard layout, including repository search in the header (#1735, #1736).

Fixes

  • Restored uncommitted work on abort and bound abort to the command that halted (#1674).
  • Kept stale continuation state from hijacking abort (#1800).
  • get now skips branches held by another worktree and never rebases an unanchored branch (#1730).
  • Never reused a stale metadata compare-and-swap expectation, and dropped stale expectations after in-process ref moves (#1812, #1802).
  • Failed closed on malformed worktree registrations (#1801).
  • Ignored log.showSignature when parsing Git output (#1799).
  • Gated info --patch on its own revision error (#1803).
  • Preserved explicit zero hunk counts when parsing diff headers (#1807).
  • Made PR merge/CI polling loops respect context cancellation (#1795).
  • Closed the editor temp file on write error to avoid an fd leak (#1787).
  • Corrected benchmark timing and exercised real mutations (#1783).

Performance

  • Removed quadratic work from stack graph traversal (#1744).
  • Batched worktree ownership lookups instead of per-branch Git reads (#1754).
  • Batched rebase replay metadata reads (#1769).
  • Batched revision lookups for tree --short --shas (#1781).
  • Batched commit history and restack planning reads (#1784).
  • Batched metadata writes in remote sync into a single commit, and loaded the remote metadata cache with one batched object read (#1791).
  • Captured untracked files only when a command stages them (#1797).
  • Avoided duplicate commit reads when generating the default PR title and body (#1798).

Refactors

  • Consolidated the internal Git API around batched, plural operations: one revision read API, batched commit author/date and metadata reads, plural blob writes and ref mutations, consolidated fetch-merge and remote deletion, and one push API with per-branch lease policies (#1771, #1772, #1773, #1774, #1775, #1776, #1777, #1778).
  • Batched metadata transactions through a dedicated store (#1780).
  • Modeled batched reads and restack decisions with types (#1785).
  • Batched PR info upserts during PR cleanup (#1767).
  • Replaced boolean parameters with typed modes across engine, submit, worktree, and freeze code (#1761, #1764, #1765, #1766, #1806).
  • Dropped unused context parameters from rerere (#1762, #1768).

Docs

  • Updated rules and help text for the internal Git API refactor (#1796).

Chore

  • Added a CLI benchmark suite (#1782).
  • Removed dead code in the combiner and metadata store (#1790).
  • Updated Go and web dependencies, including go-github v92 (#1763, #1788, #1808, #1809).
  • Added test coverage for /view remote status and for get across both worktree kinds and all merge methods (#1690, #1810).

What's Changed

  • perf: remove quadratic work from stack graph traversal by @jonnii in #1744
  • perf: batch worktree ownership lookups instead of per-branch git reads by @jonnii in #1754
  • test(api): pin /view remote status to one ls-remote across stacks by @jonnii in #1690
  • fix(get): skip branches held elsewhere, never rebase an unanchored one by @jonnii in #1730
  • feat: add dashboard search and refine the layout by @jonnii in #1735
  • feat: streamline dashboard layout and repository search by @jonnii in #1736
  • refactor(engine): replace rebuildInternal bool with typed refresh mode by @jonnii in #1761
  • chore: update frontend and backend dependencies to latest by @jonnii in #1763
  • refactor(rerere): drop unused ctx parameter from ensureEnabled by @jonnii in #1762
  • refactor(worktree): replace unclear rollback bool with ChildRestoreMode by @jonnii in #1766
  • refactor(rerere): drop unused ctx parameter from public EnsureEnabled by @jonnii in #1768
  • refactor: batch PR info upserts during PR cleanup by @jonnii in #1767
  • perf: keep missing revision lookups batched by @jonnii in #1770
  • perf: batch rebase replay metadata reads by @jonnii in #1769
  • refactor: define consistent batched revision reads by @jonnii in #1771
  • Merging 7 PRs by @jonnii in #1779
  • refactor: use one Git revision read API by @jonnii in #1772
  • refactor: batch commit author and date reads by default by @jonnii in #1773
  • refactor: use batched metadata reads for every caller by @jonnii in #1774
  • refactor: expose only plural blob writes by @jonnii in #1775
  • refactor: consolidate Git ref mutations into plural APIs by @jonnii in #1776
  • refactor: consolidate fetch merge and remote deletion APIs by @jonnii in #1777
  • refactor: use one plural push API with per-branch lease policies by @jonnii in #1778
  • refactor: batch metadata transactions through a dedicated store by @jonnii in #1780
  • chore: add CLI benchmark suite by @jonnii in #1782
  • chore: update backend and frontend dependencies to latest by @jonnii in #1788
  • fix(editor): close temp file on write error to avoid fd leak by @jonnii in #1787
  • Merging 3 PRs by @jonnii in #1789
  • fix: correct benchmark timing and exercise real mutations by @jonnii in #1783
  • perf: batch commit history and restack planning reads by @jonnii in #1784
  • refactor: model batched reads and restack decisions with types by @jonnii in #1785
  • refactor(submit): replace bool params on pad with typed nameStyle by @jonnii in #1764
  • chore: remove dead code in combiner and metadata store by @jonnii in #1790
  • refactor(worktree): replace bool param on ensureWarmStartParents with typed mode by @jonnii in #1765
  • fix: restore uncommitted work and bind abort to its command by @jonnii in #1674
  • perf: batch revision lookups for tree --short --shas by @jonnii in #1781
  • docs: update rules and help text for the internal/git API refactor by @jonnii in #1796
  • perf: capture untracked files only when a command stages them by @jonnii in #1797
  • Merging 5 PRs by @jonnii in #1804
  • fix: ignore log.showSignature when parsing git output by @jonnii in #1799
  • fix: keep stale continuation state from hijacking abort by @jonnii in #1800
  • fix: fail closed on malformed worktree registrations by @jonnii in #1801
  • fix: drop stale CAS expectation after in-process ref moves by @jonnii in #1802
  • fix: gate info --patch on its own revision error by @jonnii in #1803
  • chore: update web app dependencies to latest by @jonnii in #1809
  • fix: preserve explicit zero hunk counts in diff header parsing by @jonnii in #1807
  • refactor: replace SetFrozen bool parameter with typed FreezeState by @jonnii in #1806
  • perf: avoid duplicate commit reads when generating default PR title and body by @jonnii in #1798
  • chore: update Go dependencies to latest by @jonnii in #1808
  • fix: make PR merge/CI polling loops respect context cancellation by @jonnii in #1795
  • fix: never reuse a stale metadata CAS expectation by @jonnii in #1812
  • test: cover both worktree kinds and all merge methods in get by @jonnii in #1810
  • perf: batch metadata writes in remote sync into a single commit by @jonnii in #1791

Full Changelog: v0.27.1...v0.28.0