gitea: require no status on main, judge mesh/check in the merge tool instead (ADR 0534)

The forge's required status was a second copy of the gate mesh-delivery and
the merge tool already keep; a stuck status writer held it too (issues 1886,
1891) and only a hand change at the forge let a fix merge. Main keeps no push,
the tools' merge whitelist and no administrator override. The merge tool
judges mesh/check whether or not the branch requires it, and on a branch that
requires none merges only a head the operator's Approve names. The protection
tool loses its status argument.
This commit is contained in:
2026-10-23 12:01:57 +02:00
parent 6c0024e43b
commit d2036f2a63
15 changed files with 307 additions and 300 deletions
+10 -10
View File
@@ -699,9 +699,9 @@ export class GiteaClient {
};
}
/** Make a branch require these commit statuses to merge (novox/hq ADR 0237): the rule named for the
* branch is edited — its required statuses replaced by these, everything else it says kept unless
* asked — or created, refusing direct pushes unless asked otherwise. Answers the rule as it is now. */
/** Protect a branch (novox/hq ADR 0237): the rule named for the branch is edited — its required statuses taken
* off (ADR 0534 §5), everything else it says kept unless asked — or created, refusing direct pushes unless asked
* otherwise. Answers the rule as it is now. */
async setBranchProtection(owner: string, repo: string, branch: string, want: ProtectionWanted): Promise<{ created: boolean; rule: BranchProtection }> {
const had = await this.branchProtection(owner, repo, branch);
const body = protectionBody(want, !had, branch);
@@ -932,9 +932,9 @@ export class GiteaAdmin {
return Array.isArray(res.body) ? res.body : [];
}
/** Put main's rule right in every repository of an organisation (novox/hq ADR 0398 §2, issue 948): no push, and
* only the tools' account merges. The rule there is edited, its statuses left as they are; a repository with no
* rule for main gets one that requires none. Answers the repositories it touched. With the administrator's login:
/** Put main's rule right in every repository of an organisation (novox/hq ADR 0398 §2, issue 948): no push, only
* the tools' account merges, and no status required (ADR 0534 §1). The rule there is edited; a repository with no
* rule for main gets one. Answers the repositories it touched. With the administrator's login:
* the tools' account is no repository's administrator, so no tool can do this (ADR 0365 §2). */
async ensureMainMerges(org: string): Promise<string[]> {
const repos: string[] = [];
@@ -954,11 +954,11 @@ export class GiteaAdmin {
if (patch.status !== 200) GiteaAdmin.fail(rule, patch);
continue;
}
// A rule named exactly main is matched before any glob rule, so it would hide the statuses, approvals and
// administrator limit a glob rule covering main asks: they are copied into it (issue 948, review round 1).
// A rule named exactly main is matched before any glob rule, so it would hide the approvals and administrator
// limit a glob rule covering main asks: they are copied into it (issue 948, review round 1). Its statuses are
// not: main requires none (ADR 0534 §1).
const covering = rules.filter((r) => ruleCovers(String(r.rule_name ?? r.branch_name ?? ""), MAIN_BRANCH));
const checks = [...new Set(covering.filter((r) => r.enable_status_check).flatMap((r) => (r.status_check_contexts ?? []).filter(Boolean)))];
const copied: Record<string, unknown> = { enable_status_check: checks.length > 0, status_check_contexts: checks };
const copied: Record<string, unknown> = {};
const approvals = Math.max(0, ...covering.map((r) => Number(r.required_approvals ?? 0)));
if (approvals > 0) copied.required_approvals = approvals;
if (covering.some((r) => r.block_admin_merge_override === true)) copied.block_admin_merge_override = true;