repo-rule-detector: expand ruleset pull_request fields

This commit is contained in:
2026-03-08 09:17:31 +10:00
parent dc79cec2e3
commit 234fbd73fd
+41 -25
View File
@@ -13,6 +13,15 @@
* node scripts/repo-rule-detector.mjs owner/repo * node scripts/repo-rule-detector.mjs owner/repo
* node scripts/repo-rule-detector.mjs owner/repo --branch main * node scripts/repo-rule-detector.mjs owner/repo --branch main
* *
* Example:
* node scripts/repo-rule-detector.mjs microsoft/vscode
*
* Output notes:
* - rulesets[].rules.pull_request prints fields like:
* required_review_thread_resolution, allowed_merge_methods,
* required_approving_review_count
* - rulesets[].rules.required_linear_history / non_fast_forward are booleans
*
* Requires: * Requires:
* - gh auth * - gh auth
*/ */
@@ -72,6 +81,7 @@ function main() {
'required_review_thread_resolution', 'required_review_thread_resolution',
'allowed_merge_methods', 'allowed_merge_methods',
'required_approving_review_count', 'required_approving_review_count',
// extras (kept for convenience / debugging)
'require_code_owner_review', 'require_code_owner_review',
'dismiss_stale_reviews_on_push', 'dismiss_stale_reviews_on_push',
'require_last_push_approval' 'require_last_push_approval'
@@ -94,32 +104,38 @@ function main() {
const prParams = prRule?.parameters ? pick(prRule.parameters, PULL_REQUEST_PARAM_KEYS) : null; const prParams = prRule?.parameters ? pick(prRule.parameters, PULL_REQUEST_PARAM_KEYS) : null;
return { return {
pull_request: prParams pull_request: prParams,
? { present: true, parameters: prParams } required_linear_history: hasRuleType(rules, 'required_linear_history'),
: { present: false, parameters: null }, non_fast_forward: hasRuleType(rules, 'non_fast_forward'),
required_linear_history: { present: hasRuleType(rules, 'required_linear_history') }, deletion: hasRuleType(rules, 'deletion')
non_fast_forward: { present: hasRuleType(rules, 'non_fast_forward') },
deletion: { present: hasRuleType(rules, 'deletion') }
}; };
} }
const relevantRulesets = rulesets const relevantRulesets = [];
.filter(rs => rs?.enforcement && rs.enforcement !== 'disabled') for (const rs of rulesets) {
.filter(rs => { if (!rs?.enforcement || rs.enforcement === 'disabled') continue;
const targets = rs?.conditions?.ref_name?.include ?? [];
return targets.length === 0 || targets.includes('~DEFAULT_BRANCH') || targets.includes(branch) || targets.includes(`refs/heads/${branch}`); const details = fetchRulesetDetails(rs.id);
}) const refCond = details?.conditions?.ref_name ?? null;
.map(rs => { const targets = refCond?.include ?? [];
const details = fetchRulesetDetails(rs.id);
const rulesSummary = summarizeRulesetRules(details?.rules ?? []); const isRelevant =
return { targets.length === 0 ||
id: rs.id, targets.includes('~ALL') ||
name: rs.name, targets.includes('~DEFAULT_BRANCH') ||
enforcement: rs.enforcement, targets.includes(branch) ||
target: rs?.conditions?.ref_name ?? null, targets.includes(`refs/heads/${branch}`);
rules: rulesSummary
}; if (!isRelevant) continue;
relevantRulesets.push({
id: rs.id,
name: rs.name,
enforcement: rs.enforcement,
target: refCond,
rules: summarizeRulesetRules(details?.rules ?? [])
}); });
}
const allowedMergeMethods = { const allowedMergeMethods = {
mergeCommit: !!repoInfo.allow_merge_commit, mergeCommit: !!repoInfo.allow_merge_commit,
@@ -128,9 +144,9 @@ function main() {
}; };
const rulesetsRulePresence = { const rulesetsRulePresence = {
required_linear_history: relevantRulesets.some(rs => rs?.rules?.required_linear_history?.present), required_linear_history: relevantRulesets.some(rs => !!rs?.rules?.required_linear_history),
non_fast_forward: relevantRulesets.some(rs => rs?.rules?.non_fast_forward?.present), non_fast_forward: relevantRulesets.some(rs => !!rs?.rules?.non_fast_forward),
deletion: relevantRulesets.some(rs => rs?.rules?.deletion?.present) deletion: relevantRulesets.some(rs => !!rs?.rules?.deletion)
}; };
const out = { const out = {