Files
ngit-grasp/tests
DanConwayDev 9b8a36c1fc fix(git): preserve per-ref outcomes for mixed deletion pushes
The completed-push shortcut required every target to be satisfied and treated
verification as all-or-nothing even without atomic negotiation. A completed
deletion mixed with new work still failed, and post-push promotion could apply
refs that receive-pack had just rejected despite exiting successfully.

Replace the shortcut with an unsigned receive-pack plan. Verify satisfied refs
without writes when completed deletions are present, forward remaining commands
and original pack/options to Git, and merge per-ref statuses. Non-atomic checks
complete independently; atomic checks retain prepared verification locks until
Git exits, and abort before execution on verification failure. Native statuses
remain authoritative for actual updates. Zero-to-zero deletes never reach Git.

Keep whole-request signed-state authorization and independent PR validation.
Accept branch/tag deletion only when absent from the authorizing state. Capture
native per-ref failures on ordinary unsigned pushes too, retain successful tips,
and defer immediate state promotion after rejection. Background reconciliation
of authorized state is unchanged; signed/malformed requests retain their path.

Stream sideband progress while retaining the status report for finalization;
preserve status-v2 options and honor clients that did not request a report.
Own subprocess cleanup and verification locks together across upload awaits,
and stop Git on client cancellation before releasing those locks.

Validation: the 956-test library suite passed, followed by all ten final plan
regressions including cancellation and lock cleanup. All 208 selected Git,
authorization, PR-hosting and streaming integrations passed after the final
changes. Real Git tests cover mixed success, update-hook partial rejection and
atomic rejection with and without completed deletions. Streaming fixtures now
emit valid Git packets and retain bounded readiness/finalization checks.
Strict all-target Clippy passed.

Assisted-by: GPT-6
2026-09-25 14:13:11 +00:00
..