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
121 changes: 120 additions & 1 deletion action/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -229423,10 +229423,129 @@ var orgSettingsCycle = {
}
};

// src/cycles/repo-settings.ts
var MANAGED_REPO_KEYS = [
"description",
"websiteUrl",
"private",
"hasIssues",
"hasProjects",
"hasWiki",
"defaultBranch",
"allowSquashMerge",
"allowMergeCommit",
"allowRebaseMerge",
"deleteBranchOnMerge",
"topics"
];
function hasManagedRepoSettings(repo) {
return MANAGED_REPO_KEYS.some((k) => repo[k] !== void 0);
}
function mapRepoToLive(raw) {
const live = {};
if (raw.description != null) live.description = raw.description;
if (raw.homepage != null) live.websiteUrl = raw.homepage;
if (typeof raw.private === "boolean") live.private = raw.private;
if (typeof raw.has_issues === "boolean") live.hasIssues = raw.has_issues;
if (typeof raw.has_projects === "boolean") live.hasProjects = raw.has_projects;
if (typeof raw.has_wiki === "boolean") live.hasWiki = raw.has_wiki;
if (raw.default_branch != null) live.defaultBranch = raw.default_branch;
if (typeof raw.allow_squash_merge === "boolean") live.allowSquashMerge = raw.allow_squash_merge;
if (typeof raw.allow_merge_commit === "boolean") live.allowMergeCommit = raw.allow_merge_commit;
if (typeof raw.allow_rebase_merge === "boolean") live.allowRebaseMerge = raw.allow_rebase_merge;
if (typeof raw.delete_branch_on_merge === "boolean") live.deleteBranchOnMerge = raw.delete_branch_on_merge;
if (Array.isArray(raw.topics)) live.topics = raw.topics;
return live;
}
function buildRepoPatchBody(desired) {
const body = {};
if (desired.description !== void 0) body.description = desired.description;
if (desired.websiteUrl !== void 0) body.homepage = desired.websiteUrl;
if (desired.private !== void 0) body.private = desired.private;
if (desired.hasIssues !== void 0) body.has_issues = desired.hasIssues;
if (desired.hasProjects !== void 0) body.has_projects = desired.hasProjects;
if (desired.hasWiki !== void 0) body.has_wiki = desired.hasWiki;
if (desired.defaultBranch !== void 0) body.default_branch = desired.defaultBranch;
if (desired.allowSquashMerge !== void 0) body.allow_squash_merge = desired.allowSquashMerge;
if (desired.allowMergeCommit !== void 0) body.allow_merge_commit = desired.allowMergeCommit;
if (desired.allowRebaseMerge !== void 0) body.allow_rebase_merge = desired.allowRebaseMerge;
if (desired.deleteBranchOnMerge !== void 0) body.delete_branch_on_merge = desired.deleteBranchOnMerge;
return body;
}
var repoSettingsCycle = {
name: "repo-settings",
// ── Part 2: fetchLive ──────────────────────────────────────────────────────
async fetchLive(client, orgLogin, scope, budget) {
if (budget.exhausted) {
const { BudgetExhaustedError: BudgetExhaustedError2 } = await Promise.resolve().then(() => (init_runner(), runner_exports));
throw new BudgetExhaustedError2();
}
const repos = scope.repos;
if (!repos || Object.keys(repos).length === 0) {
return { repos: {} };
}
return fetchLiveRepoSettings(client, orgLogin, repos, budget);
},
// ── Part 3: buildDesired ───────────────────────────────────────────────────
buildDesired(orgConfig, _orgLogin, _scope) {
if (!orgConfig.repos) return {};
const repos = {};
for (const [name, repoConfig] of Object.entries(orgConfig.repos)) {
if (!hasManagedRepoSettings(repoConfig)) continue;
const stripped = {};
for (const key of MANAGED_REPO_KEYS) {
if (repoConfig[key] !== void 0) {
stripped[key] = repoConfig[key];
}
}
repos[name] = stripped;
}
return { repos };
},
// ── Part 4: apply ──────────────────────────────────────────────────────────
async apply(client, entry, orgLogin, _scope, budget) {
if (entry.resourceType !== "repo") {
return;
}
if (entry.kind === "delete") return;
const repoName = entry.key;
const desired = entry.after;
const body = buildRepoPatchBody(desired);
if (Object.keys(body).length > 0) {
budget.use(1);
await client.request("PATCH", `/repos/${orgLogin}/${repoName}`, body);
}
if (desired.topics !== void 0) {
budget.use(1);
await client.request("PUT", `/repos/${orgLogin}/${repoName}/topics`, {
names: desired.topics
});
}
}
};
async function fetchLiveRepoSettings(client, orgLogin, repos, budget) {
const liveRepos = {};
for (const [name, repoConfig] of Object.entries(repos)) {
if (!hasManagedRepoSettings(repoConfig)) continue;
if (budget.exhausted) break;
budget.use(1);
let raw;
try {
raw = await client.request("GET", `/repos/${orgLogin}/${name}`);
} catch (err) {
if (err instanceof Error && err.message.includes("404")) continue;
throw err;
}
liveRepos[name] = mapRepoToLive(raw);
}
return { repos: liveRepos };
}

// src/cli/registry.ts
var CYCLE_REGISTRY = {
[branchProtectionCycle.name]: branchProtectionCycle,
[orgSettingsCycle.name]: orgSettingsCycle
[orgSettingsCycle.name]: orgSettingsCycle,
[repoSettingsCycle.name]: repoSettingsCycle
};

// node_modules/@intentius/chant/src/audit/fetch.ts
Expand Down
2 changes: 2 additions & 0 deletions src/cli/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import type { Cycle } from "../reconcile/runner.js";
import { branchProtectionCycle } from "../cycles/branch-protection.js";
import { orgSettingsCycle } from "../cycles/org-settings.js";
import { repoSettingsCycle } from "../cycles/repo-settings.js";

/**
* Registry of all available governance cycles, keyed by the name accepted by
Expand All @@ -22,4 +23,5 @@ import { orgSettingsCycle } from "../cycles/org-settings.js";
export const CYCLE_REGISTRY: Record<string, Cycle> = {
[branchProtectionCycle.name]: branchProtectionCycle,
[orgSettingsCycle.name]: orgSettingsCycle,
[repoSettingsCycle.name]: repoSettingsCycle,
};
Loading
Loading