Compare commits

..

9 Commits

Author SHA1 Message Date
Luke Tomlinson
be24587b3c Use minutes for debugging 2021-07-26 10:06:14 -04:00
Falk Puschner
86507610fb 🎨 improve changelog (#531) 2021-07-15 09:55:05 -04:00
Falk Puschner
ceeedec52e 🔥 using v4 & remove token (#530) 2021-07-15 09:48:15 -04:00
dependabot[bot]
0156089d02 Merge pull request #479 from actions/dependabot/npm_and_yarn/vercel/ncc-0.28.6 2021-07-14 18:31:11 +00:00
Luke Tomlinson
cdf15f641a Prep for v4 (#510)
* Update dist for v4 release

* Create CHANGELOG.md

* Update CHANGELOG.md

Co-authored-by: Geoffrey Testelin <geoffrey.testelin@gmail.com>

* Update CHANGELOG.md

Co-authored-by: Geoffrey Testelin <geoffrey.testelin@gmail.com>

* Update CHANGELOG.md

Co-authored-by: Geoffrey Testelin <geoffrey.testelin@gmail.com>

* Update CHANGELOG.md

Co-authored-by: Geoffrey Testelin <geoffrey.testelin@gmail.com>

* Update CHANGELOG.md

Co-authored-by: Geoffrey Testelin <geoffrey.testelin@gmail.com>

* Update CHANGELOG.md

* Update index.js

Co-authored-by: Geoffrey Testelin <geoffrey.testelin@gmail.com>
2021-07-14 10:21:39 -04:00
Luke Tomlinson
a78d0b721e Make label comparison case insensitive (#517)
* Make label comparison case insensitive

* PR Feedback
2021-07-12 13:56:58 -04:00
Luke Tomlinson
d901397e11 Filter comments by content instead of actor (#519)
* Filter comments by content instead of actor

* Remove dead actor code

* WIP fix tests

* Fix test
2021-07-12 10:37:47 -04:00
Geoffrey Testelin
678bfc7a59 docs(readme): update the permissions docs to reflect the requirements of the default config (#512)
Fixes #511
2021-06-24 16:30:27 -04:00
dependabot[bot]
4b47cddc05 build(deps-dev): bump @vercel/ncc from 0.27.0 to 0.28.6
Bumps [@vercel/ncc](https://github.com/vercel/ncc) from 0.27.0 to 0.28.6.
- [Release notes](https://github.com/vercel/ncc/releases)
- [Commits](https://github.com/vercel/ncc/compare/0.27.0...0.28.6)

---
updated-dependencies:
- dependency-name: "@vercel/ncc"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-14 14:09:26 +00:00
16 changed files with 146 additions and 285 deletions

24
CHANGELOG.md Normal file
View File

@@ -0,0 +1,24 @@
# Changelog
Starting in version 4.0.0 we will maintain a changelog
## [4.0.0](https://github.com/actions/stale/compare/v3.0.19...v4.0.0) (2021-07-14)
### Features
* **options:** simplify config by removing skip stale message options ([#457](https://github.com/actions/stale/issues/457)) ([6ec637d](https://github.com/actions/stale/commit/6ec637d238067ab8cc96c9289dcdac280bbd3f4a)), closes [#405](https://github.com/actions/stale/issues/405) [#455](https://github.com/actions/stale/issues/455)
* **output:** print output parameters ([#458](https://github.com/actions/stale/issues/458)) ([3e6d35b](https://github.com/actions/stale/commit/3e6d35b685f0b2fa1a69be893fa07d3d85e05ee0))
### Bug Fixes
* **dry-run:** forbid mutations in dry-run ([#500](https://github.com/actions/stale/issues/500)) ([f1017f3](https://github.com/actions/stale/commit/f1017f33dd159ea51366375120c3e6981d7c3097)), closes [#499](https://github.com/actions/stale/issues/499)
* **logs:** coloured logs ([#465](https://github.com/actions/stale/issues/465)) ([5fbbfba](https://github.com/actions/stale/commit/5fbbfba142860ea6512549e96e36e3540c314132))
* **operations:** fail fast the current batch to respect the operations limit ([#474](https://github.com/actions/stale/issues/474)) ([5f6f311](https://github.com/actions/stale/commit/5f6f311ca6aa75babadfc7bac6edf5d85fa3f35d)), closes [#466](https://github.com/actions/stale/issues/466)
* **label comparison**: make label comparison case insensitive [#517](https://github.com/actions/stale/pull/517), closes [#516](https://github.com/actions/stale/pull/516)
* **filtering comments by actor could have strange behavior**: "stale" comments are now detected based on if the message is the stale message not _who_ made the comment([#519](https://github.com/actions/stale/pull/519)), fixes [#441](https://github.com/actions/stale/pull/441), [#509](https://github.com/actions/stale/pull/509), [#518](https://github.com/actions/stale/pull/518)
### Breaking Changes
* The options `skip-stale-issue-message` and `skip-stale-pr-message` were removed. Instead, setting the options `stale-issue-message` and `stale-pr-message` will be enough to let the stale workflow add a comment. If the options are unset, a comment will not be added which was the equivalent of setting `skip-stale-issue-message` to `true`.
* The `operations-per-run` option will be more effective. After migrating, you could face a failed-fast process workflow if you let the default value (30) or set it to a small number. In that case, you will see a warning at the end of the logs (if enabled) indicating that the workflow was stopped sooner to avoid consuming too much API calls. In most cases, you can just increase this limit to make sure to process everything in a single run.

View File

@@ -11,17 +11,8 @@ The default configuration will:
## Recommended permissions
For the execution of this action, it must be able to fetch all issues and pull requests from your repository.
This can be achieved with the following [configuration in the action](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions) if the permissions are restricted:
```yaml
permissions:
issues: read
pull-requests: read
```
In addition, based on the provided configuration, the action could require more permission(s) (e.g.: add label, remove label, comment, close, etc.).
You can find more information about the required permissions under the corresponding options that you wish to use.
However, if don't want to bother, you can use these permissions:
This can be achieved with the following [configuration in the action](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions) if the permissions are restricted:
```yaml
permissions:
@@ -29,6 +20,8 @@ permissions:
pull-requests: write
```
You can find more information about the required permissions under the corresponding options that you wish to use.
## All options
### List of input options
@@ -496,7 +489,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
stale-issue-message: 'Message to comment on stale issues. If none provided, will not mark issues stale'
stale-pr-message: 'Message to comment on stale PRs. If none provided, will not mark PRs stale'
@@ -514,7 +507,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
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.'
days-before-stale: 30
@@ -533,9 +526,8 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
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-pr-message: 'This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 10 days.'
close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
@@ -556,9 +548,8 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
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-pr-message: 'This PR is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 10 days.'
close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
@@ -581,7 +572,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
stale-issue-message: 'Stale issue message'
stale-pr-message: 'Stale pull request message'
@@ -604,7 +595,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
start-date: '2020-18-04T00:00:00Z' # ISO 8601 or RFC 2822
```
@@ -621,7 +612,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
exempt-issue-milestones: 'future,alpha,beta'
exempt-pr-milestones: 'bugfix,improvement'
@@ -639,7 +630,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
exempt-all-pr-milestones: true
```
@@ -656,7 +647,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
any-of-labels: 'needs-more-info,needs-demo'
# You can opt for 'only-labels' instead if your use-case requires all labels
@@ -675,7 +666,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
exempt-issue-assignees: 'marco,polo'
exempt-pr-assignees: 'marco'
@@ -693,7 +684,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
- uses: actions/stale@v4
with:
exempt-all-pr-assignees: true
```

View File

@@ -1139,7 +1139,6 @@ class IssuesProcessorBuilder {
build(): IssuesProcessorMock {
return new IssuesProcessorMock(
this._options,
async () => 'abot',
async p => (p === 1 ? this._issues : []),
async () => [],
async () => new Date().toDateString()

View File

@@ -48,7 +48,6 @@ describe('assignees options', (): void => {
const setProcessor = () => {
processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? testIssueList : []),
async () => [],
async () => new Date().toDateString()

View File

@@ -6,7 +6,6 @@ import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-opt
export class IssuesProcessorMock extends IssuesProcessor {
constructor(
options: IIssuesProcessorOptions,
getActor?: () => Promise<string>,
getIssues?: (page: number) => Promise<Issue[]>,
listIssueComments?: (
issueNumber: number,
@@ -19,10 +18,6 @@ export class IssuesProcessorMock extends IssuesProcessor {
) {
super(options);
if (getActor) {
this.getActor = getActor;
}
if (getIssues) {
this.getIssues = getIssues;
}

View File

@@ -16,7 +16,6 @@ test('processing an issue with no label will make it stale and close it, if it i
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -48,7 +47,6 @@ test('processing an issue with no label and a start date as ECMAScript epoch in
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -80,7 +78,6 @@ test('processing an issue with no label and a start date as ECMAScript epoch in
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -112,7 +109,6 @@ test('processing an issue with no label and a start date as ECMAScript epoch in
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -144,7 +140,6 @@ test('processing an issue with no label and a start date as ECMAScript epoch in
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -176,7 +171,6 @@ test('processing an issue with no label and a start date as ISO 8601 being befor
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -208,7 +202,6 @@ test('processing an issue with no label and a start date as ISO 8601 being after
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -240,7 +233,6 @@ test('processing an issue with no label and a start date as RFC 2822 being befor
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -272,7 +264,6 @@ test('processing an issue with no label and a start date as RFC 2822 being after
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -296,7 +287,6 @@ test('processing an issue with no label will make it stale and close it, if it i
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -321,7 +311,6 @@ test('processing an issue with no label will make it stale and not close it, if
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -344,7 +333,6 @@ test('processing an issue with no label will make it stale and not close it if d
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -368,7 +356,6 @@ test('processing an issue with no label will make it stale and not close it if d
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -392,7 +379,6 @@ test('processing an issue with no label will not make it stale if days-before-st
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -417,7 +403,6 @@ test('processing an issue with no label will not make it stale if days-before-st
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -445,7 +430,6 @@ test('processing an issue with no label will make it stale but not close it', as
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -476,7 +460,6 @@ test('processing a stale issue will close it', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -507,7 +490,6 @@ test('processing a stale issue containing a space in the label will close it', a
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -538,7 +520,6 @@ test('processing a stale issue containing a slash in the label will close it', a
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -570,7 +551,6 @@ test('processing a stale issue will close it when days-before-issue-stale overri
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -601,7 +581,6 @@ test('processing a stale PR will close it', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -633,7 +612,6 @@ test('processing a stale PR will close it when days-before-pr-stale override day
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -665,7 +643,6 @@ test('processing a stale issue will close it even if configured not to mark as s
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -698,7 +675,6 @@ test('processing a stale issue will close it even if configured not to mark as s
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -730,7 +706,6 @@ test('processing a stale PR will close it even if configured not to mark as stal
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -763,7 +738,6 @@ test('processing a stale PR will close it even if configured not to mark as stal
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -791,7 +765,6 @@ test('closed issues will not be marked stale', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => []
);
@@ -818,7 +791,6 @@ test('stale closed issues will not be closed', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -846,7 +818,6 @@ test('closed prs will not be marked stale', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -874,7 +845,6 @@ test('stale closed prs will not be closed', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -901,10 +871,8 @@ test('locked issues will not be marked stale', async () => {
true
)
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : [])
const processor = new IssuesProcessorMock(DefaultProcessorOptions, async p =>
p === 1 ? TestIssueList : []
);
// process our fake issue list
@@ -930,7 +898,6 @@ test('stale locked issues will not be closed', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -957,10 +924,8 @@ test('locked prs will not be marked stale', async () => {
true
)
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : [])
const processor = new IssuesProcessorMock(DefaultProcessorOptions, async p =>
p === 1 ? TestIssueList : []
);
// process our fake issue list
@@ -986,7 +951,6 @@ test('stale locked prs will not be closed', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1016,7 +980,6 @@ test('exempt issue labels will not be marked stale', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1046,7 +1009,6 @@ test('exempt issue labels will not be marked stale (multi issue label with space
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1075,7 +1037,6 @@ test('exempt issue labels will not be marked stale (multi issue label)', async (
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1122,7 +1083,6 @@ test('exempt pr labels will not be marked stale', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1151,14 +1111,14 @@ test('exempt issue labels will not be marked stale and will remove the existing
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [
{
user: {
login: 'notme',
type: 'User'
}
},
body: 'Body'
}
], // return a fake comment to indicate there was an update
async () => new Date().toDateString()
@@ -1206,7 +1166,6 @@ test('stale issues should not be closed if days is set to -1', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1234,14 +1193,14 @@ test('stale label should be removed if a comment was added to a stale issue', as
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [
{
user: {
login: 'notme',
type: 'User'
}
},
body: 'Body'
}
], // return a fake comment to indicate there was an update
async () => new Date().toDateString()
@@ -1275,14 +1234,14 @@ test('when the option "labelsToAddWhenUnstale" is set, the labels should be adde
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [
{
user: {
login: 'notme',
type: 'User'
}
},
body: 'Body'
}
], // return a fake comment to indicate there was an update
async () => new Date().toDateString()
@@ -1315,14 +1274,14 @@ test('stale label should not be removed if a comment was added by the bot (and t
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [
{
user: {
login: 'abot',
type: 'User'
}
},
body: 'This issue is stale'
}
], // return a fake comment to indicate there was an update by the bot
async () => new Date().toDateString()
@@ -1355,9 +1314,8 @@ test('stale label containing a space should be removed if a comment was added to
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [{user: {login: 'notme', type: 'User'}}], // return a fake comment to indicate there was an update
async () => [{user: {login: 'notme', type: 'User'}, body: 'Body'}], // return a fake comment to indicate there was an update
async () => new Date().toDateString()
);
@@ -1387,7 +1345,6 @@ test('stale issues should not be closed until after the closed number of days',
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1420,7 +1377,6 @@ test('stale issues should be closed if the closed nubmer of days (additive) is a
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1452,7 +1408,6 @@ test('stale issues should not be closed until after the closed number of days (l
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1485,7 +1440,6 @@ test('skips stale message on issues when stale-issue-message is empty', async ()
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1530,7 +1484,6 @@ test('send stale message on issues when stale-issue-message is not empty', async
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1575,7 +1528,6 @@ test('skips stale message on prs when stale-pr-message is empty', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1620,7 +1572,6 @@ test('send stale message on prs when stale-pr-message is not empty', async () =>
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1662,7 +1613,6 @@ test('git branch is deleted when option is enabled', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1692,7 +1642,6 @@ test('git branch is not deleted when issue is not pull request', async () => {
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1724,7 +1673,6 @@ test('an issue without a milestone will be marked as stale', async () => {
];
const processor = new IssuesProcessorMock(
DefaultProcessorOptions,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1758,7 +1706,6 @@ test('an issue without an exempted milestone will be marked as stale', async ()
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1792,7 +1739,6 @@ test('an issue with an exempted milestone will not be marked as stale', async ()
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1826,7 +1772,6 @@ test('an issue with an exempted milestone will not be marked as stale (multi mil
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1860,7 +1805,6 @@ test('an issue with an exempted milestone will not be marked as stale (multi mil
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1895,7 +1839,6 @@ test('an issue with an exempted milestone but without an exempted issue mileston
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1930,7 +1873,6 @@ test('an issue with an exempted milestone but with another exempted issue milest
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1965,7 +1907,6 @@ test('an issue with an exempted milestone and with an exempted issue milestone w
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -1993,7 +1934,6 @@ test('processing an issue opened since 2 days and with the option "daysBeforeIss
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2020,7 +1960,6 @@ test('processing an issue opened since 2 days and with the option "daysBeforeIss
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2047,7 +1986,6 @@ test('processing an issue opened since 2 days and with the option "daysBeforeIss
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2081,7 +2019,6 @@ test('processing a pull request opened since 2 days and with the option "daysBef
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2115,7 +2052,6 @@ test('processing a pull request opened since 2 days and with the option "daysBef
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2149,7 +2085,6 @@ test('processing a pull request opened since 2 days and with the option "daysBef
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2186,7 +2121,6 @@ test('processing a previously closed issue with a close label will remove the cl
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2222,7 +2156,6 @@ test('processing a closed issue with a close label will not remove the close lab
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2258,7 +2191,6 @@ test('processing a locked issue with a close label will not remove the close lab
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async () => [],
async () => new Date().toDateString()
@@ -2298,7 +2230,6 @@ test('processing an issue stale since less than the daysBeforeStale with a stale
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async (): Promise<IComment[]> => Promise.resolve([]),
async () => labelCreatedAt.toDateString()
@@ -2339,7 +2270,6 @@ test('processing an issue stale since less than the daysBeforeStale without a st
];
const processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? TestIssueList : []),
async (): Promise<IComment[]> => Promise.resolve([]),
async () => new Date().toDateString()

View File

@@ -39,7 +39,6 @@ describe('milestones options', (): void => {
const setProcessor = () => {
processor = new IssuesProcessorMock(
opts,
async () => 'abot',
async p => (p === 1 ? testIssueList : []),
async () => [],
async () => new Date().toDateString()

View File

@@ -1139,7 +1139,6 @@ class IssuesProcessorBuilder {
build(): IssuesProcessorMock {
return new IssuesProcessorMock(
this._options,
async () => 'abot',
async p => (p === 1 ? this._issues : []),
async () => [],
async () => new Date().toDateString()

View File

@@ -205,7 +205,6 @@ class SUT {
private async _setProcessor(): Promise<number> {
this.processor = new IssuesProcessorMock(
this._opts,
async () => 'abot',
async p => (p === 1 ? this._testIssueList : []),
async () => [],
async () => new Date().toDateString()

View File

@@ -539,14 +539,14 @@ class IssuesProcessorBuilder {
build(): IssuesProcessorMock {
return new IssuesProcessorMock(
this._options,
async () => 'abot',
async p => (p === 1 ? this._issues : []),
async () => [
{
user: {
login: 'notme',
type: 'User'
}
},
body: 'body'
}
],
async () => new Date().toDateString()

190
dist/index.js vendored
View File

@@ -233,6 +233,7 @@ const is_date_more_recent_than_1 = __nccwpck_require__(1473);
const is_valid_date_1 = __nccwpck_require__(891);
const is_boolean_1 = __nccwpck_require__(8236);
const is_labeled_1 = __nccwpck_require__(6792);
const clean_label_1 = __nccwpck_require__(7752);
const should_mark_when_stale_1 = __nccwpck_require__(2461);
const words_to_list_1 = __nccwpck_require__(1883);
const assignees_1 = __nccwpck_require__(7236);
@@ -266,8 +267,8 @@ class IssuesProcessor {
this._statistics = new statistics_1.Statistics();
}
}
static _updatedSince(timestamp, num_days) {
const daysInMillis = 1000 * 60 * num_days; //temporarily number of minutes
static _updatedSince(timestamp, num_minutes) {
const daysInMillis = 1000 * 60 * num_minutes;
const millisSinceLastUpdated = new Date().getTime() - new Date(timestamp).getTime();
return millisSinceLastUpdated <= daysInMillis;
}
@@ -291,7 +292,6 @@ class IssuesProcessor {
return __awaiter(this, void 0, void 0, function* () {
// get the next batch of issues
const issues = yield this.getIssues(page);
const actor = yield this.getActor();
if (issues.length <= 0) {
this._logger.info(logger_service_1.LoggerService.green(`No more issues found to process. Exiting...`));
(_a = this._statistics) === null || _a === void 0 ? void 0 : _a.setOperationsCount(this.operations.getConsumedOperationsCount()).logStats();
@@ -309,7 +309,7 @@ class IssuesProcessor {
}
const issueLogger = new issue_logger_1.IssueLogger(issue);
yield issueLogger.grouping(`$$type #${issue.number}`, () => __awaiter(this, void 0, void 0, function* () {
yield this.processIssue(issue, actor, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale);
yield this.processIssue(issue, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale);
}));
}
if (!this.operations.hasRemainingOperations()) {
@@ -323,7 +323,7 @@ class IssuesProcessor {
return this.processIssues(page + 1);
});
}
processIssue(issue, actor, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale) {
processIssue(issue, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
(_a = this._statistics) === null || _a === void 0 ? void 0 : _a.incrementProcessedItemsCount(issue);
@@ -472,7 +472,7 @@ class IssuesProcessor {
// Process the issue if it was marked stale
if (issue.isStale) {
issueLogger.info(`This $$type is already stale`);
yield this._processStaleIssue(issue, staleLabel, actor, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale, closeMessage, closeLabel);
yield this._processStaleIssue(issue, staleLabel, staleMessage, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale, closeMessage, closeLabel);
}
IssuesProcessor._endIssueProcessing(issue);
});
@@ -499,20 +499,6 @@ class IssuesProcessor {
}
});
}
// get the actor from the GitHub token or context
getActor() {
return __awaiter(this, void 0, void 0, function* () {
let actor;
try {
this.operations.consumeOperation();
actor = yield this.client.users.getAuthenticated();
}
catch (error) {
return github_1.context.actor;
}
return actor.data.login;
});
}
// grab issues from github in batches of 100
getIssues(page) {
var _a;
@@ -555,8 +541,7 @@ class IssuesProcessor {
});
const events = yield this.client.paginate(options);
const reversedEvents = events.reverse();
issueLogger.info(`Reversed Events: ${JSON.stringify(reversedEvents)}`);
const staleLabeledEvent = reversedEvents.find(event => event.event === 'labeled' && event.label.name === label);
const staleLabeledEvent = reversedEvents.find(event => event.event === 'labeled' && clean_label_1.cleanLabel(event.label.name) === clean_label_1.cleanLabel(label));
if (!staleLabeledEvent) {
// Must be old rather than labeled
return undefined;
@@ -565,12 +550,12 @@ class IssuesProcessor {
});
}
// handle all of the stale issue logic when we find a stale issue
_processStaleIssue(issue, staleLabel, actor, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale, closeMessage, closeLabel) {
_processStaleIssue(issue, staleLabel, staleMessage, labelsToAddWhenUnstale, labelsToRemoveWhenUnstale, closeMessage, closeLabel) {
return __awaiter(this, void 0, void 0, function* () {
const issueLogger = new issue_logger_1.IssueLogger(issue);
const markedStaleOn = (yield this.getLabelCreationDate(issue, staleLabel)) || issue.updated_at;
issueLogger.info(`$$type marked stale on: ${logger_service_1.LoggerService.cyan(markedStaleOn)}`);
const issueHasComments = yield this._hasCommentsSince(issue, markedStaleOn, actor);
const issueHasComments = yield this._hasCommentsSince(issue, markedStaleOn, staleMessage);
issueLogger.info(`$$type has been commented on: ${logger_service_1.LoggerService.cyan(issueHasComments)}`);
const daysBeforeClose = issue.isPullRequest
? this._getDaysBeforePrClose()
@@ -615,7 +600,7 @@ class IssuesProcessor {
});
}
// checks to see if a given issue is still stale (has had activity on it)
_hasCommentsSince(issue, sinceDate, actor) {
_hasCommentsSince(issue, sinceDate, staleMessage) {
return __awaiter(this, void 0, void 0, function* () {
const issueLogger = new issue_logger_1.IssueLogger(issue);
issueLogger.info(`Checking for comments on $$type since: ${logger_service_1.LoggerService.cyan(sinceDate)}`);
@@ -624,10 +609,9 @@ class IssuesProcessor {
}
// find any comments since the date
const comments = yield this.listIssueComments(issue.number, sinceDate);
core.debug(`The actor is: ${actor}`);
core.debug(`The comments are ${JSON.stringify(comments)}`);
const filteredComments = comments.filter(comment => comment.user.type === 'User' && comment.body !== IssuesProcessor._getStaleMessageUsedOptionName(issue));
issueLogger.info(`Comments not made by actor or another bot: ${logger_service_1.LoggerService.cyan(filteredComments.length)}`);
const filteredComments = comments.filter(comment => comment.user.type === 'User' &&
comment.body.toLowerCase() !== staleMessage.toLowerCase());
issueLogger.info(`Comments that are not the stale comment or another bot: ${logger_service_1.LoggerService.cyan(filteredComments.length)}`);
// if there are any user comments returned
return filteredComments.length > 0;
});
@@ -1748,6 +1732,33 @@ var Option;
})(Option = exports.Option || (exports.Option = {}));
/***/ }),
/***/ 7752:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.cleanLabel = void 0;
const lodash_deburr_1 = __importDefault(__nccwpck_require__(1601));
/**
* @description
* Clean a label by lowercasing it and deburring it for consistency
*
* @param {string} label A raw GitHub label
*
* @return {string} A lowercased, deburred version of the passed in label
*/
function cleanLabel(label) {
return lodash_deburr_1.default(label.toLowerCase());
}
exports.cleanLabel = cleanLabel;
/***/ }),
/***/ 965:
@@ -1834,16 +1845,13 @@ exports.isBoolean = isBoolean;
/***/ }),
/***/ 6792:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.isLabeled = void 0;
const lodash_deburr_1 = __importDefault(__nccwpck_require__(1601));
const clean_label_1 = __nccwpck_require__(7752);
/**
* @description
* Check if the given label is listed as a label of the given issue
@@ -1855,13 +1863,10 @@ const lodash_deburr_1 = __importDefault(__nccwpck_require__(1601));
*/
function isLabeled(issue, label) {
return !!issue.labels.find((issueLabel) => {
return cleanLabel(label) === cleanLabel(issueLabel.name);
return clean_label_1.cleanLabel(label) === clean_label_1.cleanLabel(issueLabel.name);
});
}
exports.isLabeled = isLabeled;
function cleanLabel(label) {
return lodash_deburr_1.default(label.toLowerCase());
}
/***/ }),
@@ -5795,16 +5800,13 @@ ansiEscapes.iTerm = {
/***/ }),
/***/ 2068:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __nccwpck_require__) => {
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
__nccwpck_require__.r(__webpack_exports__);
/* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => __WEBPACK_DEFAULT_EXPORT__
/* harmony export */ });
const ANSI_BACKGROUND_OFFSET = 10;
/* module decorator */ module = __nccwpck_require__.nmd(module);
const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`;
const ANSI_BACKGROUND_OFFSET = 10;
const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
@@ -5899,10 +5901,8 @@ function assembleStyles() {
styles.color.close = '\u001B[39m';
styles.bgColor.close = '\u001B[49m';
styles.color.ansi = wrapAnsi16();
styles.color.ansi256 = wrapAnsi256();
styles.color.ansi16m = wrapAnsi16m();
styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
@@ -5957,67 +5957,17 @@ function assembleStyles() {
hexToAnsi256: {
value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
enumerable: false
},
ansi256ToAnsi: {
value: code => {
if (code < 8) {
return 30 + code;
}
if (code < 16) {
return 90 + (code - 8);
}
let red;
let green;
let blue;
if (code >= 232) {
red = (((code - 232) * 10) + 8) / 255;
green = red;
blue = red;
} else {
code -= 16;
const remainder = code % 36;
red = Math.floor(code / 36) / 5;
green = Math.floor(remainder / 6) / 5;
blue = (remainder % 6) / 5;
}
const value = Math.max(red, green, blue) * 2;
if (value === 0) {
return 30;
}
let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));
if (value === 2) {
result += 60;
}
return result;
},
enumerable: false
},
rgbToAnsi: {
value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
enumerable: false
},
hexToAnsi: {
value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
enumerable: false
}
});
return styles;
}
const ansiStyles = assembleStyles();
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ansiStyles);
// Make the export immutable
Object.defineProperty(module, 'exports', {
enumerable: true,
get: assembleStyles
});
/***/ }),
@@ -9008,8 +8958,8 @@ module.exports = require("zlib");;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ id: moduleId,
/******/ loaded: false,
/******/ exports: {}
/******/ };
/******/
@@ -9022,36 +8972,20 @@ module.exports = require("zlib");;
/******/ if(threw) delete __webpack_module_cache__[moduleId];
/******/ }
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ /* webpack/runtime/node module decorator */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __nccwpck_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__nccwpck_require__.o(definition, key) && !__nccwpck_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __nccwpck_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __nccwpck_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ __nccwpck_require__.nmd = (module) => {
/******/ module.paths = [];
/******/ if (!module.children) module.children = [];
/******/ return module;
/******/ };
/******/ })();
/******/

6
package-lock.json generated
View File

@@ -2141,9 +2141,9 @@
}
},
"@vercel/ncc": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.27.0.tgz",
"integrity": "sha512-DllIJQapnU2YwewIhh/4dYesmMQw3h2cFtabECc/zSJHqUbNa0eJuEkRa6DXbZvh1YPWBtYQoPV17NlDpBw1Vw==",
"version": "0.28.6",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.28.6.tgz",
"integrity": "sha512-t4BoSSuyK8BZaUE0gV18V6bkFs4st7baumtFGa50dv1tMu2GDBEBF8sUZaKBdKiL6DzJ2D2+XVCwYWWDcQOYdQ==",
"dev": true
},
"JSONStream": {

View File

@@ -49,7 +49,7 @@
"@types/semver": "^7.3.5",
"@typescript-eslint/eslint-plugin": "^4.26.0",
"@typescript-eslint/parser": "^4.26.1",
"@vercel/ncc": "^0.27.0",
"@vercel/ncc": "^0.28.6",
"ansi-styles": "5.2.0",
"eslint": "^7.28.0",
"eslint-plugin-github": "^4.1.2",

View File

@@ -8,6 +8,7 @@ import {isDateMoreRecentThan} from '../functions/dates/is-date-more-recent-than'
import {isValidDate} from '../functions/dates/is-valid-date';
import {isBoolean} from '../functions/is-boolean';
import {isLabeled} from '../functions/is-labeled';
import { cleanLabel } from '../functions/clean-label';
import {shouldMarkWhenStale} from '../functions/should-mark-when-stale';
import {wordsToList} from '../functions/words-to-list';
import {IComment} from '../interfaces/comment';
@@ -28,8 +29,8 @@ import {LoggerService} from '../services/logger.service';
* Handle processing of issues for staleness/closure.
*/
export class IssuesProcessor {
private static _updatedSince(timestamp: string, num_days: number): boolean {
const daysInMillis = 1000 * 60 * num_days; //temporarily number of minutes
private static _updatedSince(timestamp: string, num_minutes: number): boolean {
const daysInMillis = 1000 * 60 * num_minutes;
const millisSinceLastUpdated =
new Date().getTime() - new Date(timestamp).getTime();
@@ -105,7 +106,6 @@ export class IssuesProcessor {
async processIssues(page: Readonly<number> = 1): Promise<number> {
// get the next batch of issues
const issues: Issue[] = await this.getIssues(page);
const actor: string = await this.getActor();
if (issues.length <= 0) {
this._logger.info(
@@ -145,7 +145,6 @@ export class IssuesProcessor {
await issueLogger.grouping(`$$type #${issue.number}`, async () => {
await this.processIssue(
issue,
actor,
labelsToAddWhenUnstale,
labelsToRemoveWhenUnstale
);
@@ -184,7 +183,6 @@ export class IssuesProcessor {
async processIssue(
issue: Issue,
actor: string,
labelsToAddWhenUnstale: Readonly<string>[],
labelsToRemoveWhenUnstale: Readonly<string>[]
): Promise<void> {
@@ -455,7 +453,7 @@ export class IssuesProcessor {
await this._processStaleIssue(
issue,
staleLabel,
actor,
staleMessage,
labelsToAddWhenUnstale,
labelsToRemoveWhenUnstale,
closeMessage,
@@ -488,20 +486,6 @@ export class IssuesProcessor {
}
}
// get the actor from the GitHub token or context
async getActor(): Promise<string> {
let actor;
try {
this.operations.consumeOperation();
actor = await this.client.users.getAuthenticated();
} catch (error) {
return context.actor;
}
return actor.data.login;
}
// grab issues from github in batches of 100
async getIssues(page: number): Promise<Issue[]> {
// generate type for response
@@ -551,10 +535,9 @@ export class IssuesProcessor {
const events: IIssueEvent[] = await this.client.paginate(options);
const reversedEvents = events.reverse();
issueLogger.info(`Reversed Events: ${JSON.stringify(reversedEvents)}`)
const staleLabeledEvent = reversedEvents.find(
event => event.event === 'labeled' && event.label.name === label
event => event.event === 'labeled' && cleanLabel(event.label.name) === cleanLabel(label)
);
if (!staleLabeledEvent) {
@@ -569,7 +552,7 @@ export class IssuesProcessor {
private async _processStaleIssue(
issue: Issue,
staleLabel: string,
actor: string,
staleMessage: string,
labelsToAddWhenUnstale: Readonly<string>[],
labelsToRemoveWhenUnstale: Readonly<string>[],
closeMessage?: string,
@@ -585,7 +568,7 @@ export class IssuesProcessor {
const issueHasComments: boolean = await this._hasCommentsSince(
issue,
markedStaleOn,
actor
staleMessage
);
issueLogger.info(
`$$type has been commented on: ${LoggerService.cyan(issueHasComments)}`
@@ -673,7 +656,7 @@ export class IssuesProcessor {
private async _hasCommentsSince(
issue: Issue,
sinceDate: string,
actor: string
staleMessage: string
): Promise<boolean> {
const issueLogger: IssueLogger = new IssueLogger(issue);
@@ -688,14 +671,14 @@ export class IssuesProcessor {
// find any comments since the date
const comments = await this.listIssueComments(issue.number, sinceDate);
core.debug(`The actor is: ${actor}`)
core.debug(`The comments are ${JSON.stringify(comments)}`)
const filteredComments = comments.filter(
comment => comment.user.type === 'User' && comment.body !== IssuesProcessor._getStaleMessageUsedOptionName(issue)
comment =>
comment.user.type === 'User' &&
comment.body.toLowerCase() !== staleMessage.toLowerCase()
);
issueLogger.info(
`Comments not made by actor or another bot: ${LoggerService.cyan(
`Comments that are not the stale comment or another bot: ${LoggerService.cyan(
filteredComments.length
)}`
);

View File

@@ -0,0 +1,14 @@
import deburr from 'lodash.deburr';
import { CleanLabel } from '../types/clean-label';
/**
* @description
* Clean a label by lowercasing it and deburring it for consistency
*
* @param {string} label A raw GitHub label
*
* @return {string} A lowercased, deburred version of the passed in label
*/
export function cleanLabel(label: Readonly<string>): CleanLabel {
return deburr(label.toLowerCase());
}

View File

@@ -1,7 +1,6 @@
import deburr from 'lodash.deburr';
import {Issue} from '../classes/issue';
import {ILabel} from '../interfaces/label';
import {CleanLabel} from '../types/clean-label';
import {cleanLabel} from './clean-label';
/**
* @description
@@ -20,7 +19,3 @@ export function isLabeled(
return cleanLabel(label) === cleanLabel(issueLabel.name);
});
}
function cleanLabel(label: Readonly<string>): CleanLabel {
return deburr(label.toLowerCase());
}