You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
No test holds the P1 call that unpushed spans tags #475
Closing #471 took a deliberate trade under principle 1: Git::unpushed_commits asks log --oneline --all --not --remotes, and --all spans refs/tags, so a tag the remote carries that no remote branch reaches reads as unpushed forever. The direction is towards keeping, which is why it was taken.
Question
Nothing in the tree creates a tag, so no test fails if someone narrows that question back. A later tidy-the-report change to --branches or --no-tags would silently reverse a principle-1 decision and every check would stay green. This repo pins argv order elsewhere for exactly this reason.
Two facts the #474 review measured that sharpen it:
Through devlaunch's real clone topology the false positive is stronger than the doc says. The bare cache keeps refs/tags/v1 after upstream deletes both the branch and the tag (Confirm the bare object stores are bounded #453's tag monotonicity), the workspace clone inherits the tag while refs/remotes/* gets pruned, so every clone of that repo made afterwards reports 1 unpushed commit permanently.
The same widening reaches refs/notes/commits (a permanent false positive in any git-notes clone) and refs/bisect/*. rust/devlaunch-core/src/clients/git.rs:501 names neither.
Work
A test that fails if the question narrows: a clone whose only unpushed-looking thing is a tag, asserting the guard reports it rather than NothingToLose. Red first, by narrowing the argv and watching it fail. Name notes and bisect in the doc comment while you are there.
Out of scope: changing the trade. Principle 1 decided it and #471 recorded the reasoning; this ticket only stops it being reversed by accident.
Closing as superseded by PR #486, which deliberately reversed the #471 trade: the red test this ticket asks for (a clone whose only unpushed-looking ref is a tag, asserting the guard reports it) would now assert the opposite of shipped behavior. unpushed_commits passes --exclude=refs/tags/*, and #486 pins that shape with a_tag_no_remote_branch_reaches_any_more_is_not_unsaved_work; the anti-narrowing protection this ticket wanted exists as the argv pin (git/tests.rs:147) plus the detached-worktree-HEAD test, and commit 6ab79dd added one more. What #486 gives up (a commit only an unpushed tag reaches) is #487's ticket. Residual not done anywhere: the doc comment still names neither refs/notes/commits nor refs/bisect/*, which remain inside --all after the tag exclusion; that false-positive class belongs with #487's territory rather than holding this open.
Activity
blooop commentedon Aug 28, 2026
Closing as superseded by PR #486, which deliberately reversed the #471 trade: the red test this ticket asks for (a clone whose only unpushed-looking ref is a tag, asserting the guard reports it) would now assert the opposite of shipped behavior.
unpushed_commitspasses--exclude=refs/tags/*, and #486 pins that shape witha_tag_no_remote_branch_reaches_any_more_is_not_unsaved_work; the anti-narrowing protection this ticket wanted exists as the argv pin (git/tests.rs:147) plus the detached-worktree-HEAD test, and commit 6ab79dd added one more. What #486 gives up (a commit only an unpushed tag reaches) is #487's ticket. Residual not done anywhere: the doc comment still names neitherrefs/notes/commitsnorrefs/bisect/*, which remain inside--allafter the tag exclusion; that false-positive class belongs with #487's territory rather than holding this open.