Skip to content

v0.17.2

Latest

Choose a tag to compare

@jmf-pobox jmf-pobox released this 08 Sep 17:00
· 6 commits to main since this release
e0d224b

Fixed

  • An interrupted or partially-failed release now exits non-zero and says exactly what didn't land. Reconstructed from the vox v5.0.4 release, where Phase 9's post-release PR landed while all three Phase 10 propagators produced nothing and Phase 11 never ran: an operator interrupt during a Phase 10 check-wait hang left ThreadPoolExecutor.__exit__'s shutdown(wait=True) blocked for up to the full two-hour deadline (see DES-029), which is long enough that the process gets killed outright instead of waited out — bypassing run_release's cleanup entirely and leaving no record that anything failed. Three changes close this: (1) run_release now prints, on every non-success exit (interrupt or otherwise), the phase it stopped in, every phase from there to the end not confirmed landed, and the exact --resume-from command — previously only a subprocess.TimeoutExpired got a resume hint at all; (2) a Phase 9/10 failure is caught rather than raised immediately, so Phase 11 verify still runs against the actual post-propagation state and reports what's really out of sync, with the release still failing loudly afterward crediting --resume-from post-release (which re-enters both phases), not --resume-from verify (which would never retry propagation); (3) a Phase 10 leg failure is now recorded in the same SkipRecorder the end-of-run recap drains, so it appears in the "Manual action required" summary alongside recorded skips instead of only in the raised exception (pkit-d7mz).
  • RequiredChecksWaiter no longer hangs for two hours on a commit that will never register a check, and recognizes GitHub rulesets. A post-release commit carrying [skip ci] (or a workflow whose paths: filter excludes every changed file) leaves statusCheckRollup permanently null; the poll loop retried every 15s with no bound short of the full CI_WATCH deadline, which hung the ethos #496 release. RequiredChecksWaiter.wait now applies one bounded no-checks grace window (NO_CHECKS_GRACE, 5 minutes) to both zero-check states (a null rollup and an empty-but-present contexts list) and fails loudly, naming [skip ci]/path filters as likely causes, rather than merging on the strength of zero checks. Separately, has_ruleset queries gh api repos/{owner}/{repo}/rules/branches/main alongside the legacy branch-protection endpoint — a repo governed entirely by a modern ruleset (ethos: 2 required status checks + conversation resolution) previously tripped the "No branch protection configured" warning because the legacy API only ever sees the legacy feature. The waiter also now checks release.py's own interrupt event on every poll iteration, so a worker thread blocked here (Phase 4's PR, or a Phase 10 sibling PR) observes a SIGINT within one poll instead of only after the full deadline — see the paired pkit-d7mz entry below for why this matters (pkit-plxh).
  • Preflight now detects a prior release tag cut outside the release flow. For plugin/hybrid projects, Phase 1 inspects the highest existing v* tag's plugin.json (via git show <tag>:<manifest>) and warns loudly — without failing — when the name is still -dev-suffixed or the version does not equal the tag itself. Neither condition blocks the release under way (that release is exactly what corrects it; ethos v4.16.0 is the precedent), but an operator who did not expect the prior tag to be out of shape needs to know before the new tag lands on top of it. Silent when there are no tags, or when the manifest did not exist at that path at the tag (pkit-dlv6).
  • Regression coverage for the marketplace short-name/URL matching fix. pkit-d8ij was independently investigated and found already fixed on main by pkit-p328 (#328, merged before this work started) — MarketplacePropagator and Phase 11 already match marketplace entries via source.url plus the plugin's marketplace short name (ReleaseProject.marketplace_name()), not the dead source.repo key. That fix shipped with no test proving the short-name-diverges-from-repo case (punt/punt-kit) or the URL-with-vs-without-.git cases pkit-d8ij's acceptance criteria call for — added here, plus a not-found-entry regression test, with no source changes required (pkit-d8ij).