Compare commits

..

6 Commits

Author SHA1 Message Date
Ross Brodbeck
7a47124766 Default un-stale to true in new version 2020-05-11 10:34:40 -04:00
Ross Brodbeck
299593dff1 Add vscode debug settings 2020-05-11 10:30:00 -04:00
Ross Brodbeck
379e98cf36 Add a test for un-staling 2020-05-11 10:29:41 -04:00
Ross Brodbeck
51cc4676ff Add debugging, update tests and fix logic. 2020-05-11 09:44:50 -04:00
Ross Brodbeck
5a67f409c9 Fix up tests a bit to make this runnable (tests failing though) 2020-05-02 06:29:17 -04:00
Ross Brodbeck
cd198e6d88 First pass at ignorning issues with comments and allowing removal of the stale label 2020-05-02 06:04:09 -04:00
6 changed files with 33 additions and 70 deletions

View File

@@ -34,7 +34,7 @@ jobs:
stale: stale:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v3 - uses: actions/stale@v1.1.0
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Message to comment on stale issues. If none provided, will not mark issues stale' stale-issue-message: 'Message to comment on stale issues. If none provided, will not mark issues stale'
@@ -52,7 +52,7 @@ jobs:
stale: stale:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v3 - uses: actions/stale@v1.1.0
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days' stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days'
@@ -71,11 +71,11 @@ jobs:
stale: stale:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v3 - uses: actions/stale@v1.1.0
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Stale issue message' stale-issue-message: 'Stale issue message'
stale-pr-message: 'Stale pull request message' stale-pr-message: 'Stale issue message'
stale-issue-label: 'no-issue-activity' stale-issue-label: 'no-issue-activity'
exempt-issue-labels: 'awaiting-approval,work-in-progress' exempt-issue-labels: 'awaiting-approval,work-in-progress'
stale-pr-label: 'no-pr-activity' stale-pr-label: 'no-pr-activity'
@@ -84,4 +84,4 @@ jobs:
### Debugging ### Debugging
To see debug output from this action, you must set the secret `ACTIONS_STEP_DEBUG` to `true` in your repository. You can run this action in debug only mode (no actions will be taken on your issues) by passing `debug-only` `true` as an argument to the action. To see debug ouput from this action, you must set the secret `ACTIONS_STEP_DEBUG` to `true` in your repository. You can run this action in debug only mode (no actions will be taken on your issues) by passing `debug-only` `true` as an argument to the action.

View File

@@ -36,7 +36,7 @@ const DefaultProcessorOptions: IssueProcessorOptions = {
staleIssueMessage: 'This issue is stale', staleIssueMessage: 'This issue is stale',
stalePrMessage: 'This PR is stale', stalePrMessage: 'This PR is stale',
daysBeforeStale: 1, daysBeforeStale: 1,
daysBeforeClose: 30, daysBeforeClose: 1,
staleIssueLabel: 'Stale', staleIssueLabel: 'Stale',
exemptIssueLabels: '', exemptIssueLabels: '',
stalePrLabel: 'Stale', stalePrLabel: 'Stale',
@@ -62,7 +62,7 @@ test('empty issue list results in 1 operation', async () => {
expect(operationsLeft).toEqual(99); expect(operationsLeft).toEqual(99);
}); });
test('processing an issue with no label will make it stale and close it, if it is old enough', async () => { test('processing an issue with no label will make it stale', async () => {
const TestIssueList: Issue[] = [ const TestIssueList: Issue[] = [
generateIssue(1, 'An issue with no label', '2020-01-01T17:00:00Z') generateIssue(1, 'An issue with no label', '2020-01-01T17:00:00Z')
]; ];
@@ -77,30 +77,6 @@ test('processing an issue with no label will make it stale and close it, if it i
// process our fake issue list // process our fake issue list
await processor.processIssues(1); await processor.processIssues(1);
expect(processor.staleIssues.length).toEqual(1);
expect(processor.closedIssues.length).toEqual(1);
});
test('processing an issue with no label will make it stale but not close it', async () => {
// issue should be from 2 days ago so it will be
// stale but not close-able, based on default settings
let issueDate = new Date();
issueDate.setDate(issueDate.getDate() - 2);
const TestIssueList: Issue[] = [
generateIssue(1, 'An issue with no label', issueDate.toDateString())
];
const processor = new IssueProcessor(
DefaultProcessorOptions,
async p => (p == 1 ? TestIssueList : []),
async (num, dt) => [],
async (issue, label) => new Date().toDateString()
);
// process our fake issue list
await processor.processIssues(1);
expect(processor.staleIssues.length).toEqual(1); expect(processor.staleIssues.length).toEqual(1);
expect(processor.closedIssues.length).toEqual(0); expect(processor.closedIssues.length).toEqual(0);
}); });

18
dist/index.js vendored
View File

@@ -8510,21 +8510,15 @@ class IssueProcessor {
core.debug(`Skipping ${issueType} because it has an exempt label`); core.debug(`Skipping ${issueType} because it has an exempt label`);
continue; // don't process exempt issues continue; // don't process exempt issues
} }
// does this issue have a stale label? if (IssueProcessor.isLabeled(issue, staleLabel)) {
let isStale = IssueProcessor.isLabeled(issue, staleLabel);
// determine if this issue needs to be marked stale first
if (!isStale &&
!IssueProcessor.updatedSince(issue.updated_at, this.options.daysBeforeStale)) {
core.debug(`Marking ${issueType} stale because it was last updated on ${issue.updated_at} and it does not have a stale label`);
yield this.markStale(issue, staleMessage, staleLabel);
this.operationsLeft -= 2;
isStale = true; // this issue is now considered stale
}
// process any issues marked stale (including the issue above, if it was marked)
if (isStale) {
core.debug(`Found a stale ${issueType}`); core.debug(`Found a stale ${issueType}`);
yield this.processStaleIssue(issue, issueType, staleLabel); yield this.processStaleIssue(issue, issueType, staleLabel);
} }
else if (!IssueProcessor.updatedSince(issue.updated_at, this.options.daysBeforeStale)) {
core.debug(`Marking ${issueType} stale because it was last updated on ${issue.updated_at}`);
yield this.markStale(issue, staleMessage, staleLabel);
this.operationsLeft -= 2;
}
} }
// do the next batch // do the next batch
return this.processIssues(page + 1); return this.processIssues(page + 1);

6
package-lock.json generated
View File

@@ -55,9 +55,9 @@
} }
}, },
"@actions/http-client": { "@actions/http-client": {
"version": "1.0.8", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.7.tgz",
"integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", "integrity": "sha512-PY3ys/XH5WMekkHyZhYSa/scYvlE5T/TV/T++vABHuY5ZRgtiBZkn2L2tV5Pv/xDCl59lSZb9WwRuWExDyAsSg==",
"requires": { "requires": {
"tunnel": "0.0.6" "tunnel": "0.0.6"
} }

View File

@@ -26,7 +26,7 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.2.3", "@actions/core": "^1.2.3",
"@actions/github": "^2.2.0", "@actions/github": "^2.1.1",
"@octokit/rest": "^16.43.1", "@octokit/rest": "^16.43.1",
"semver": "^6.1.1" "semver": "^6.1.1"
}, },

View File

@@ -2,7 +2,7 @@ import * as core from '@actions/core';
import * as github from '@actions/github'; import * as github from '@actions/github';
import {Octokit} from '@octokit/rest'; import {Octokit} from '@octokit/rest';
type OctoKitIssueList = Octokit.Response<Octokit.IssuesListForRepoResponse>; type OcotoKitIssueList = Octokit.Response<Octokit.IssuesListForRepoResponse>;
export interface Issue { export interface Issue {
title: string; title: string;
@@ -150,29 +150,20 @@ export class IssueProcessor {
continue; // don't process exempt issues continue; // don't process exempt issues
} }
// does this issue have a stale label? if (IssueProcessor.isLabeled(issue, staleLabel)) {
let isStale = IssueProcessor.isLabeled(issue, staleLabel); core.debug(`Found a stale ${issueType}`);
await this.processStaleIssue(issue, issueType, staleLabel);
// determine if this issue needs to be marked stale first } else if (
if (
!isStale &&
!IssueProcessor.updatedSince( !IssueProcessor.updatedSince(
issue.updated_at, issue.updated_at,
this.options.daysBeforeStale this.options.daysBeforeStale
) )
) { ) {
core.debug( core.debug(
`Marking ${issueType} stale because it was last updated on ${issue.updated_at} and it does not have a stale label` `Marking ${issueType} stale because it was last updated on ${issue.updated_at}`
); );
await this.markStale(issue, staleMessage, staleLabel); await this.markStale(issue, staleMessage, staleLabel);
this.operationsLeft -= 2; this.operationsLeft -= 2;
isStale = true; // this issue is now considered stale
}
// process any issues marked stale (including the issue above, if it was marked)
if (isStale) {
core.debug(`Found a stale ${issueType}`);
await this.processStaleIssue(issue, issueType, staleLabel);
} }
} }
@@ -263,14 +254,16 @@ export class IssueProcessor {
// grab issues from github in baches of 100 // grab issues from github in baches of 100
private async getIssues(page: number): Promise<Issue[]> { private async getIssues(page: number): Promise<Issue[]> {
const issueResult: OctoKitIssueList = await this.client.issues.listForRepo({ const issueResult: OcotoKitIssueList = await this.client.issues.listForRepo(
owner: github.context.repo.owner, {
repo: github.context.repo.repo, owner: github.context.repo.owner,
state: 'open', repo: github.context.repo.repo,
labels: this.options.onlyLabels, state: 'open',
per_page: 100, labels: this.options.onlyLabels,
page per_page: 100,
}); page
}
);
return issueResult.data; return issueResult.data;
} }