diff --git a/README.md b/README.md index 1efdfca..0bf002e 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,9 @@ repositories: : read | triage | write | maintain | admin # Public vs Private repository, no value is assumed to mean public visibility: public | private + # Should the repo be archived, defaults to false + # Will unarchive the repo if changed from true to false + archived: ``` #### Generating your initial configuration diff --git a/src/permissions/generate.ts b/src/permissions/generate.ts index e3bbb6e..c984d7b 100644 --- a/src/permissions/generate.ts +++ b/src/permissions/generate.ts @@ -76,6 +76,7 @@ async function main(spinner: ora.Ora) { }})`; const repoConfig: RepositoryConfig = { name: repo.name, + archived: repo.archived, }; const [currentTeams, currentCollaborators] = await Promise.all([ octokit.paginate('GET /repos/{owner}/{repo}/teams', { diff --git a/src/permissions/run.ts b/src/permissions/run.ts index e4b1fa3..dd48f30 100644 --- a/src/permissions/run.ts +++ b/src/permissions/run.ts @@ -118,6 +118,7 @@ const validateConfigFast = async (config: PermissionsConfig) => { has_wiki: Joi.boolean(), }).optional(), visibility: Joi.string().only('public', 'private').optional(), + archived: Joi.boolean().optional(), }) .required(), }); @@ -989,6 +990,25 @@ async function checkRepository( } } + const shouldBeArchived = repo.archived || false; + if (octoRepo.archived !== shouldBeArchived) { + if (shouldBeArchived) { + builder.addContext(`:file_cabinet: Archiving \`${octoRepo.name}\``); + console.info(chalk.yellow('Archiving'), chalk.cyan(octoRepo.name)); + } else { + builder.addContext(`:file_cabinet: Unarchiving \`${octoRepo.name}\``); + console.info(chalk.yellow('Unarchiving'), chalk.cyan(octoRepo.name)); + } + if (!IS_DRY_RUN) { + const octokit = await getOctokit(config.organization); + await octokit.repos.update({ + owner: config.organization, + repo: octoRepo.name, + archived: shouldBeArchived, + }); + } + } + for (const supposedCollaboratorName of Object.keys(repo.external_collaborators || {})) { // Supposed collaborator is not currently in the repo and should be added if ( diff --git a/src/permissions/types.ts b/src/permissions/types.ts index 9e36496..a564868 100644 --- a/src/permissions/types.ts +++ b/src/permissions/types.ts @@ -12,6 +12,7 @@ export interface RepositoryConfig { external_collaborators?: Record; settings?: Partial; visibility?: 'public' | 'private'; + archived?: boolean; } export interface RepoSettings {