Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions scripts/coordination/frozen_campaigns.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@
# ci-dessus le 2026-09-23 (fermes au titre du veto, solde markdown net > 0).
FROZEN_BRANCH_PREFIXES = {"wt/vibe-": "13410"}

# Campagnes AUTORISEES apres le veto qui reutilisent les memes relais
# ``wt/vibe-*`` : le prefixe de branche ne dit plus a lui seul « campagne
# gelee ». 17636 = resorption des mesures d'artefact en prose markdown (GO
# ai-01 du 2026-09-27, recette #17636 c.5860054240) : elle RETIRE des chiffres,
# elle ne vise aucun seuil. Mesure fondatrice (2026-09-28) : #18252, #18283 et
# #18316 portaient `fix(prose,#17636)` en titre et aucun #13410, et restaient
# gelees par leur seule branche. La levee se lit sur le TITRE (le body peut
# citer n'importe quoi) et tombe des qu'un parapluie gele est cite.
BRANCH_PREFIX_RELEASES = {"wt/vibe-": ("17636",)}

# Redressements EXEMPTES du gel, sur le TITRE seul (insensible a la casse) :
# une PR qui REPREARE les degats d'une campagne gelee cite le parapluie comme
# n'importe quelle PR de la campagne -- le filtre par citation la gelerait
Expand All @@ -51,15 +61,24 @@ def frozen_umbrella_exclusion(
un TITRE de redressement exempte (``FROZEN_EXEMPT_TITLE_PATTERNS``), pour
que les PRs qui reparerent les degats restent mergeables malgre la
citation. ``#134100`` ne vaut pas ``#13410``. Une branche d'une famille
gelee (``FROZEN_BRANCH_PREFIXES``) suffit aussi, meme muette -- et sans
exemption.
gelee (``FROZEN_BRANCH_PREFIXES``) suffit aussi, meme muette -- sauf si
le TITRE nomme une campagne autorisee sur ces relais
(``BRANCH_PREFIX_RELEASES``) et qu'aucun parapluie gele n'est cite.
"""
text = " ".join((title or "", body or ""))
cites_frozen = any(
re.search(rf"#{umbrella}(?!\d)", text) for umbrella in FROZEN_UMBRELLAS
)
for prefix, umbrella in FROZEN_BRANCH_PREFIXES.items():
if (head_ref or "").startswith(prefix):
return f"frozen:#{umbrella}(veto #{FROZEN_UMBRELLAS[umbrella]},branch {prefix}*)"
released = not cites_frozen and any(
re.search(rf"#{campaign}(?!\d)", title or "")
for campaign in BRANCH_PREFIX_RELEASES.get(prefix, ())
)
if not released:
return f"frozen:#{umbrella}(veto #{FROZEN_UMBRELLAS[umbrella]},branch {prefix}*)"
if title and any(p.search(title) for p in FROZEN_EXEMPT_TITLE_PATTERNS):
return None
text = " ".join((title or "", body or ""))
for umbrella, veto in FROZEN_UMBRELLAS.items():
if re.search(rf"#{umbrella}(?!\d)", text):
return f"frozen:#{umbrella}(veto #{veto})"
Expand Down
38 changes: 38 additions & 0 deletions scripts/tests/test_frozen_campaigns.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,41 @@ def test_umbrella_in_body_freezes_despite_ordinary_title():
fc.frozen_umbrella_exclusion("fix(x): ordinaire", "See #11601 (densite QC).")
== "frozen:#11601(veto #17040)"
)


# Titre reel de #18283 (2026-09-28) : relais wt/vibe-* d'une campagne
# autorisee apres le veto, sans aucune citation de #13410.
RELEASED_TITLE = (
"fix(prose,#17636): Tweety g2d -- 27 mesures d'artefact resorbees en "
"prose markdown, 3 KEEP (recit fige PR #10450)"
)


def test_authorized_campaign_title_releases_vibe_branch():
assert (
fc.frozen_umbrella_exclusion(RELEASED_TITLE, "See #17636", "wt/vibe-g2d-tweety")
is None
)


def test_release_falls_when_a_frozen_umbrella_is_cited():
# Le body cite la campagne gelee : la branche regele la PR.
assert (
fc.frozen_umbrella_exclusion(RELEASED_TITLE, "suite de #13410", "wt/vibe-g2d-tweety")
== "frozen:#13410(veto #17040,branch wt/vibe-*)"
)


def test_release_is_title_only():
# #17636 dans le body seul ne libere pas un relais muet.
assert (
fc.frozen_umbrella_exclusion("Densite Lab13", "See #17636", "wt/vibe-g62-density-9")
== "frozen:#13410(veto #17040,branch wt/vibe-*)"
)


def test_release_needs_exact_campaign_number():
assert (
fc.frozen_umbrella_exclusion("fix(prose,#176360): x", None, "wt/vibe-g2x")
== "frozen:#13410(veto #17040,branch wt/vibe-*)"
)
Loading