diff --git a/README.md b/README.md index 67c4ba3fd..f930eb1ab 100644 --- a/README.md +++ b/README.md @@ -60,5 +60,7 @@ jobs: stale-issue-message: 'Stale issue message' stale-pr-message: 'Stale issue message' stale-issue-label: 'no-issue-activity' + exempt-issue-label: 'awaiting-approval' stale-pr-label: 'no-pr-activity' + exempt-pr-label: 'awaiting-approval' ``` diff --git a/action.yml b/action.yml index a03cfa9c9..b2bb534d0 100644 --- a/action.yml +++ b/action.yml @@ -18,9 +18,13 @@ inputs: stale-issue-label: description: 'The label to apply when an issue is stale' default: 'Stale' + exempt-issue-label: + description: 'The label to apply when an issue is exempt from being marked stale' stale-pr-label: description: 'The label to apply when a pull request is stale' default: 'Stale' + exempt-pr-label: + description: 'The label to apply when a pull request is exempt from being marked stale' operations-per-run: description: 'The maximum number of operations per run, used to control rate limiting' default: 30 diff --git a/src/main.ts b/src/main.ts index e2524b932..b24d62871 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,7 +12,9 @@ type Args = { daysBeforeStale: number; daysBeforeClose: number; staleIssueLabel: string; + exemptIssueLabel: string; stalePrLabel: string; + exemptPrLabel: string; operationsPerRun: number; }; @@ -59,8 +61,11 @@ async function processIssues( } let staleLabel = isPr ? args.stalePrLabel : args.staleIssueLabel; + let exemptLabel = isPr ? args.exemptPrLabel : args.exemptIssueLabel; - if (isLabeledStale(issue, staleLabel)) { + if (exemptLabel && isLabeled(issue, exemptLabel)) { + continue; + } else if (isLabeled(issue, staleLabel)) { if (wasLastUpdatedBefore(issue, args.daysBeforeClose)) { operationsLeft -= await closeIssue(client, issue); } else { @@ -85,7 +90,7 @@ async function processIssues( return await processIssues(client, args, operationsLeft, page + 1); } -function isLabeledStale(issue: Issue, label: string): boolean { +function isLabeled(issue: Issue, label: string): boolean { const labelComparer: (l: IssueLabel) => boolean = l => label.localeCompare(l.name, undefined, {sensitivity: 'accent'}) === 0; return issue.labels.filter(labelComparer).length > 0; @@ -151,7 +156,9 @@ function getAndValidateArgs(): Args { core.getInput('days-before-close', {required: true}) ), staleIssueLabel: core.getInput('stale-issue-label', {required: true}), + exemptIssueLabel: core.getInput('exempt-issue-label'), stalePrLabel: core.getInput('stale-pr-label', {required: true}), + exemptPrLabel: core.getInput('exempt-pr-label'), operationsPerRun: parseInt( core.getInput('operations-per-run', {required: true}) )