feat: [12] Auto-Merge per Label (Snapshot-frei) fuer PR-Triage #54

Merged
hobbypunk merged 2 commits from enhancement/12_auto_merge_label into main 2026-09-27 16:29:27 +00:00
Owner

Schließt die Auto-Merge-Snapshot-Falle aus der #12-Kette.

Problem

Beim Aktivieren des Auto-Merge über den UI-Dialog speichert Forgejo Titel + Message als Momentaufnahme – spätere PR-Umbenennungen (z. B. durch den Conventional-Title) erreichen den Squash-Commit nicht mehr. Einen geplanten Merge per API zu lesen gibt es nicht (nur HTML-Scraping – keine Option).

Lösung: Label als Source of Truth + planen ohne Titel

Neue Composite Action pr-auto-merge, als dritter Schritt in der Triage-Kette:

  • auto-merge-Label am PR → Schedule per POST /pulls/{n}/merge mit merge_when_checks_succeed: true
  • Label entfernt → DELETE auf derselben Route cancelt den Schedule
  • Ohne Titel/Message geplant: Der Merge-Service komponiert den Squash-Commit erst zum Merge-Zeitpunkt aus dem dann aktuellen PR-Titel – die Snapshot-Falle existiert für diesen Pfad schlicht nicht mehr
  • Cancel+Re-Schedule ist idempotent (kein Lesen des Schedules nötig)
  • Konflikte (405/409) warnen nur – der nächste Triage-Lauf retries nach Rebase

Bedienung ab jetzt

Statt des UI-Buttons (der bleibt technisch möglich, hat aber den Snapshot-Bug): auto-merge-Label an den PR hängen – Labeler/Tri­age erledigen den Rest, und der Squash trägt immer den finalen konventionellen Titel.

Das Label auto-merge existiert im Repo bereits. 🏷️

Getestet

6 Cases gegen Mock-API: Schedule (inkl. Prüfung, dass keine Titel-Felder im POST-Body stehen), Cancel bei Label-Entfernung, No-Op ohne Schedule, No-OP bei gemergtem PR, Konflikt-Warnung, Auth-Fehler.

**Schließt die Auto-Merge-Snapshot-Falle aus der #12-Kette.** ## Problem Beim Aktivieren des Auto-Merge über den UI-Dialog speichert Forgejo Titel + Message als Momentaufnahme – spätere PR-Umbenennungen (z. B. durch den Conventional-Title) erreichen den Squash-Commit nicht mehr. Einen geplanten Merge per API zu **lesen** gibt es nicht (nur HTML-Scraping – keine Option). ## Lösung: Label als Source of Truth + planen ohne Titel Neue Composite Action `pr-auto-merge`, als dritter Schritt in der Triage-Kette: - **`auto-merge`-Label am PR** → Schedule per `POST /pulls/{n}/merge` mit `merge_when_checks_succeed: true` - **Label entfernt** → `DELETE` auf derselben Route cancelt den Schedule - **Ohne Titel/Message geplant**: Der Merge-Service komponiert den Squash-Commit erst zum Merge-Zeitpunkt aus dem **dann aktuellen** PR-Titel – die Snapshot-Falle existiert für diesen Pfad schlicht nicht mehr - Cancel+Re-Schedule ist idempotent (kein Lesen des Schedules nötig) - Konflikte (405/409) warnen nur – der nächste Triage-Lauf retries nach Rebase ## Bedienung ab jetzt Statt des UI-Buttons (der bleibt technisch möglich, hat aber den Snapshot-Bug): **`auto-merge`-Label an den PR hängen** – Labeler/Tri­age erledigen den Rest, und der Squash trägt immer den finalen konventionellen Titel. Das Label `auto-merge` existiert im Repo bereits. 🏷️ ## Getestet 6 Cases gegen Mock-API: Schedule (inkl. Prüfung, dass **keine** Titel-Felder im POST-Body stehen), Cancel bei Label-Entfernung, No-Op ohne Schedule, No-OP bei gemergtem PR, Konflikt-Warnung, Auth-Fehler.
[12] Auto-Merge per Label (Snapshot-frei) fuer PR-Triage
All checks were successful
PR Triage / triage (pull_request) Successful in 34s
CI / scan_ruby (pull_request) Successful in 3m25s
CI / lint (pull_request) Successful in 3m30s
CI / test (pull_request) Successful in 3m44s
CI / system-test (pull_request) Successful in 3m50s
CI / coverage (pull_request) Successful in 29s
6a4fa75e0b
---------

Co-Authored-By: opencode (Mistral GLM) <opencode-agent[bot]@hoppe-dev.eu>
forgejo-actions changed title from [12] Auto-Merge per Label (Snapshot-frei) fuer PR-Triage to feat: [12] Auto-Merge per Label (Snapshot-frei) fuer PR-Triage 2026-09-27 16:23:35 +00:00

📊 Coverage

Metrik Abdeckung
Zeilen 97.69% (2619/2681)
Branches 81.46% (637/782)
Methoden 96.95% (413/426)

Patch-Coverage: keine getrackten Zeilen geändert

Schwächste Dateien im Projekt

Datei Abdeckung
app/models/concerns/has_uuid_v7.rb 54.55%
app/components/form/select.rb 72.41%
app/components/layout/flash.rb 84.0%
app/components/concerns/actionable.rb 86.67%
app/components/layout/sidebar.rb 89.47%
app/controllers/settings/security_controller.rb 90.24%
app/controllers/sessions_controller.rb 90.32%
app/components/concerns/inferrable.rb 90.63%
app/components/users/avatar.rb 91.23%
app/controllers/settings/security/otps_controller.rb 91.67%

🔍 Report im Browser ansehen · 📄 Run-Artifact „coverage-report“

<!-- coverage-report --> ## 📊 Coverage | Metrik | Abdeckung | |---|---| | Zeilen | 97.69% (2619/2681) | | Branches | 81.46% (637/782) | | Methoden | 96.95% (413/426) | **Patch-Coverage**: keine getrackten Zeilen geändert **Schwächste Dateien im Projekt** | Datei | Abdeckung | |---|---| | app/models/concerns/has_uuid_v7.rb | 54.55% | | app/components/form/select.rb | 72.41% | | app/components/layout/flash.rb | 84.0% | | app/components/concerns/actionable.rb | 86.67% | | app/components/layout/sidebar.rb | 89.47% | | app/controllers/settings/security_controller.rb | 90.24% | | app/controllers/sessions_controller.rb | 90.32% | | app/components/concerns/inferrable.rb | 90.63% | | app/components/users/avatar.rb | 91.23% | | app/controllers/settings/security/otps_controller.rb | 91.67% | [🔍 Report im Browser ansehen](https://pages.hoppe-dev.eu/hobbypunk/rails-base_app/pr-54/coverage) · [📄 Run-Artifact „coverage-report“](https://code.hoppe-dev.eu/hobbypunk/rails-base_app/actions/runs/1562/artifacts/coverage-report)
[12] Auto-Merge: frischen Titel explizit planen, edited-Trigger re-scheduled
All checks were successful
PR Triage / triage (pull_request) Successful in 16s
CI / lint (pull_request) Successful in 36s
CI / scan_ruby (pull_request) Successful in 37s
CI / test (pull_request) Successful in 54s
CI / system-test (pull_request) Successful in 1m0s
CI / coverage (pull_request) Successful in 28s
1503a5fe58
---------

Co-Authored-By: opencode (Mistral GLM) <opencode-agent[bot]@hoppe-dev.eu>
hobbypunk deleted branch enhancement/12_auto_merge_label 2026-09-27 16:29:27 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
hobbypunk/rails-base_app!54
No description provided.