Skip to content

No test holds the P1 call that unpushed spans tags #475

Closed

Description

@blooop

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.

Activity

  1. blooop commented on Aug 28, 2026

    @blooop
    OwnerAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions