mirror of
https://gitea.com/Lydanne/issues-helper.git
synced 2025-08-19 18:25:58 +08:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
576d7c4cb8 | ||
![]() |
b0e25793f1 | ||
![]() |
eb91801d3e | ||
![]() |
616c112b12 | ||
![]() |
1425c335af | ||
![]() |
f777971d6d | ||
![]() |
4c5e1fa83c | ||
![]() |
dcad795964 | ||
![]() |
37632245d8 | ||
![]() |
9018700e94 | ||
![]() |
11acd15e70 | ||
![]() |
7619e79b94 | ||
![]() |
c7cf5de709 | ||
![]() |
273b6abb78 | ||
![]() |
87bca14eb5 |
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
@@ -11,6 +11,9 @@ jobs:
|
||||
|
||||
- name: install
|
||||
run: yarn install
|
||||
|
||||
- name: format
|
||||
run: yarn format-check
|
||||
|
||||
- name: package
|
||||
run: yarn package
|
||||
|
4
.prettierignore
Normal file
4
.prettierignore
Normal file
@@ -0,0 +1,4 @@
|
||||
dist/
|
||||
lib/
|
||||
docs-dist/
|
||||
node_modules/
|
6
.prettierrc.js
Normal file
6
.prettierrc.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const fabric = require('@umijs/fabric');
|
||||
|
||||
module.exports = {
|
||||
...fabric.prettier,
|
||||
arrowParens: 'avoid',
|
||||
};
|
@@ -1,4 +1,4 @@
|
||||
export default {
|
||||
base: '/',
|
||||
publicPath: '/'
|
||||
publicPath: '/',
|
||||
};
|
||||
|
@@ -6,10 +6,8 @@ const name = 'issues-helper';
|
||||
export default defineConfig({
|
||||
title: 'Issue Helper',
|
||||
mode: 'site',
|
||||
favicon:
|
||||
'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
|
||||
logo:
|
||||
'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
|
||||
favicon: 'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
|
||||
logo: 'https://avatars1.githubusercontent.com/u/73879334?s=200&v=4',
|
||||
exportStatic: {},
|
||||
ssr: {},
|
||||
outputPath: 'docs-dist',
|
||||
@@ -38,7 +36,7 @@ export default defineConfig({
|
||||
{ title: 'Advanced', path: '/en-US/advanced' },
|
||||
{ title: 'Changelog', path: '/en-US/changelog' },
|
||||
{ title: 'GitHub', path: 'https://github.com/actions-cool/issues-helper' },
|
||||
]
|
||||
],
|
||||
},
|
||||
menus: {
|
||||
'/guide': [
|
||||
|
28
CHANGELOG.md
28
CHANGELOG.md
@@ -1,3 +1,31 @@
|
||||
## v2
|
||||
|
||||
`2021.01.26`
|
||||
|
||||
- refactor: add require-permission default. [#51](https://github.com/actions-cool/issues-helper/pull/51)
|
||||
|
||||
## v1.12
|
||||
|
||||
> It will be the last version of 1.x
|
||||
|
||||
`2021.01.26`
|
||||
|
||||
- feat: add require-permission. [#46](https://github.com/actions-cool/issues-helper/pull/46) [#48](https://github.com/actions-cool/issues-helper/pull/48)
|
||||
- feat: add lock-reason. [#49](https://github.com/actions-cool/issues-helper/pull/49)
|
||||
|
||||
## v1.11
|
||||
|
||||
`2021.01.14`
|
||||
|
||||
- feat: add question mark duplicate. [#38](https://github.com/actions-cool/issues-helper/pull/38)
|
||||
- perf: expand duplicate action. [#40](https://github.com/actions-cool/issues-helper/pull/40)
|
||||
|
||||
## v1.10
|
||||
|
||||
`2021.01.12`
|
||||
|
||||
- fix: duplicate labels set. [#36](https://github.com/actions-cool/issues-helper/pull/36)
|
||||
|
||||
## v1.9
|
||||
|
||||
`2021.01.11`
|
||||
|
@@ -5,9 +5,11 @@
|
||||
[](https://github.com/actions-cool/issues-helper/actions)
|
||||
[](https://github.com/marketplace/actions/issues-helper)
|
||||
[](https://github.com/umijs/dumi)
|
||||
[](https://github.com/prettier/prettier)
|
||||
[](https://github.com/actions-cool/issues-helper/releases)
|
||||
[](https://github.com/actions-cool/issues-helper/discussions)
|
||||
|
||||
[](https://github.com/actions-cool/issues-helper/stargazers)
|
||||
[](https://github.com/actions-cool/issues-helper/discussions)
|
||||
[](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)
|
||||
|
||||
A GitHub Action that easily helps you automatically manage issues
|
||||
@@ -54,11 +56,22 @@ Please leave a message at [**here**](https://github.com/actions-cool/issues-help
|
||||
<img src="https://avatars2.githubusercontent.com/u/33663932?s=200&v=4" width="46" />
|
||||
<div>material-ui</div>
|
||||
</a></td>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/ant-design/pro-components">
|
||||
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46" />
|
||||
<div>pro-components</div>
|
||||
</a></td>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/react-component">
|
||||
<img src="https://avatars3.githubusercontent.com/u/9441414?s=200&v=4" width="46" />
|
||||
<div>react-component</div>
|
||||
</a></td>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/lijinke666/react-music-player">
|
||||
<img src="https://github.com/lijinke666/react-music-player/blob/master/assetsImg/logo.png?raw=true" width="46" />
|
||||
<div>react-music-player</div>
|
||||
</a></td>
|
||||
</tr><tr>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/umijs/umi">
|
||||
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46" />
|
||||
@@ -69,15 +82,12 @@ Please leave a message at [**here**](https://github.com/actions-cool/issues-help
|
||||
<img src="https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png" width="46" />
|
||||
<div>vue-request</div>
|
||||
</a></td>
|
||||
</tr><tr>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/zoo-js/zoo">
|
||||
<img src="https://avatars1.githubusercontent.com/u/70757173?s=200&v=4" width="46" />
|
||||
<div>zoo</div>
|
||||
</a></td>
|
||||
<td align="center" width="180"></td>
|
||||
<td align="center" width="180"></td>
|
||||
<td align="center" width="180"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -134,7 +144,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Add assigness
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -176,7 +186,7 @@ jobs:
|
||||
if: contains(github.event.issue.body, 'xxx') == false
|
||||
steps:
|
||||
- name: Add labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -201,7 +211,7 @@ Close the specified issue.
|
||||
|
||||
```yml
|
||||
- name: Close issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -234,7 +244,7 @@ jobs:
|
||||
if: github.event.label.name == 'xxx'
|
||||
steps:
|
||||
- name: Create comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -278,7 +288,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Create issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -311,7 +321,7 @@ According to [`comment-id`](#comment-id) delete the specified comment.
|
||||
|
||||
```yml
|
||||
- name: Delete comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'delete-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -343,7 +353,7 @@ jobs:
|
||||
if: github.event.label.name == 'invalid'
|
||||
steps:
|
||||
- name: Lock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -355,26 +365,29 @@ jobs:
|
||||
| actions | Action type | string | ✔ |
|
||||
| token | [Token explain](#token) | string | ✔ |
|
||||
| issue-number | The number of issue | number | ✔ |
|
||||
| lock-reason | Reason for locking issue | string | ✖ |
|
||||
|
||||
- `lock-reason`: Optional values are `off-topic` `too heated` `resolved` `spam`
|
||||
|
||||
⏫ [Back to list](#List)
|
||||
|
||||
#### `mark-duplicate`
|
||||
|
||||
Quickly mark duplicate questions, only for issue new comments.
|
||||
Quickly mark duplicate questions, only for issue new comments or edit comments.
|
||||
|
||||
```yml
|
||||
name: Issue Mark Duplicate
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
types: [created, edited]
|
||||
|
||||
jobs:
|
||||
mark-duplicate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: mark-duplicate
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'mark-duplicate'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -390,9 +403,16 @@ jobs:
|
||||
| labels | Replace the labels of the issue | string | ✖ |
|
||||
| contents | Add [reaction](#reactions-types) for this comment | string | ✖ |
|
||||
| close-issue | Whether to close the issue at the same time | string | ✖ |
|
||||
| require-permission | Permission required, default is `write` | string | ✖ |
|
||||
|
||||
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`
|
||||
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`. Block content contains `?`
|
||||
- `labels`: Highest priority
|
||||
- `close-issue`: Both `true` or `'true'` can take effect
|
||||
- `require-permission`: Optional values are `admin`, `write`, `read`, `none`
|
||||
- If the team member sets the `read` permission, it is `read`
|
||||
- If the external Collaborator is set to `read` permission, it is `read`
|
||||
- Ordinary users have `read` permission
|
||||
- When set `write`, `admin` and `write` meet the conditions
|
||||
|
||||
⏫ [Back to list](#List)
|
||||
|
||||
@@ -402,7 +422,7 @@ Open the specified issue.
|
||||
|
||||
```yml
|
||||
- name: Open issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'open-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -423,7 +443,7 @@ Remove the person designated by issue.
|
||||
|
||||
```yml
|
||||
- name: Remove assignees
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -446,7 +466,7 @@ Remove the specified labels.
|
||||
|
||||
```yml
|
||||
- name: Remove labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -471,7 +491,7 @@ Replace the labels of issue.
|
||||
|
||||
```yml
|
||||
- name: Set labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'set-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -494,7 +514,7 @@ Unlock the specified issue.
|
||||
|
||||
```yml
|
||||
- name: Unlock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'unlock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -527,7 +547,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Update comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -555,7 +575,7 @@ Update the specified issue according to the `issue-number`.
|
||||
|
||||
```yml
|
||||
- name: Update issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -605,7 +625,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: welcome
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'welcome'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -648,7 +668,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-inactive
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-inactive'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -701,7 +721,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -740,7 +760,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: close-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -774,7 +794,7 @@ Find the current warehouse issue No. 1, the creator is k and the content contain
|
||||
|
||||
```yml
|
||||
- name: Find comments
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'find-comments'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -822,7 +842,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: lock-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -844,6 +864,7 @@ jobs:
|
||||
| body-includes | Body filtering | string | ✖ |
|
||||
| title-includes | Title filtering | string | ✖ |
|
||||
| inactive-day | Inactive days filtering | number | ✖ |
|
||||
| lock-reason | Reason for locking issue | string | ✖ |
|
||||
|
||||
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
|
||||
- `issue-state`: The default is `all`. Optional value `open` `closed`, when these 2 items are not, both are `all`
|
||||
@@ -868,7 +889,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: month-statistics
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'month-statistics'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -911,7 +932,7 @@ jobs:
|
||||
if: github.event.label.name == 'watch'
|
||||
steps:
|
||||
- name: find comments
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
id: fcid
|
||||
with:
|
||||
actions: 'find-comments'
|
||||
@@ -922,7 +943,7 @@ jobs:
|
||||
|
||||
- name: create comment
|
||||
if: ${{ steps.fcid.outputs.comments.length == 0 }}
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -931,7 +952,7 @@ jobs:
|
||||
|
||||
- name: update comment
|
||||
if: ${{ steps.fcid.outputs.comments.length == 1 }}
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -963,7 +984,7 @@ When the token is not filled in actions or the corresponding secrets are not add
|
||||
|
||||
```yml
|
||||
- name: Create issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
id: createissue
|
||||
with:
|
||||
actions: 'create-issue'
|
||||
@@ -1037,16 +1058,22 @@ Click the `···` icon in the upper right corner of a comment, select `Copy lin
|
||||
- Use two-level semantic version, such as v1, v1.1, v2, v2.1
|
||||
- v1 represents the initial version
|
||||
- The fixes and additions to the v1 version will be released to the v1.1 version
|
||||
- When the released v1.x runs stable for a certain period of time, release the advanced v2 version
|
||||
- When the released v1.x runs stable for a certain period of time or undergoes refactoring, release the advanced v2 version
|
||||
|
||||
- Version selection
|
||||
- It is recommended to use the latest releases version. It can be seen in [releases](https://github.com/actions-cool/issues-helper/releases)
|
||||
- You can also refer to the update log below to select the version
|
||||
- The latest v1.x release code will be merged into the 1.x branch
|
||||
- It also supports the direct use of branch versions. Such as:
|
||||
|
||||
```yml
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@main
|
||||
|
||||
# or
|
||||
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@1.x
|
||||
```
|
||||
|
||||
## Actions Template
|
||||
|
97
README.md
97
README.md
@@ -5,9 +5,11 @@
|
||||
[](https://github.com/actions-cool/issues-helper/actions)
|
||||
[](https://github.com/marketplace/actions/issues-helper)
|
||||
[](https://github.com/umijs/dumi)
|
||||
[](https://github.com/prettier/prettier)
|
||||
[](https://github.com/actions-cool/issues-helper/releases)
|
||||
[](https://github.com/actions-cool/issues-helper/discussions)
|
||||
|
||||
[](https://github.com/actions-cool/issues-helper/stargazers)
|
||||
[](https://github.com/actions-cool/issues-helper/discussions)
|
||||
[](https://github.com/actions-cool/issues-helper/blob/main/LICENSE)
|
||||
|
||||
一个轻松帮你自动管理 issues 的 GitHub Action
|
||||
@@ -54,11 +56,22 @@
|
||||
<img src="https://avatars2.githubusercontent.com/u/33663932?s=200&v=4" width="46" />
|
||||
<div>material-ui</div>
|
||||
</a></td>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/ant-design/pro-components">
|
||||
<img src="https://avatars1.githubusercontent.com/u/12101536?s=200&v=4" width="46" />
|
||||
<div>pro-components</div>
|
||||
</a></td>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/react-component">
|
||||
<img src="https://avatars3.githubusercontent.com/u/9441414?s=200&v=4" width="46" />
|
||||
<div>react-component</div>
|
||||
</a></td>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/lijinke666/react-music-player">
|
||||
<img src="https://github.com/lijinke666/react-music-player/blob/master/assetsImg/logo.png?raw=true" width="46" />
|
||||
<div>react-music-player</div>
|
||||
</a></td>
|
||||
</tr><tr>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/umijs/umi">
|
||||
<img src="https://avatars1.githubusercontent.com/u/33895495?s=200&v=4" width="46" />
|
||||
@@ -69,15 +82,12 @@
|
||||
<img src="https://raw.githubusercontent.com/AttoJS/art/master/vue-request-logo.png" width="46" />
|
||||
<div>vue-request</div>
|
||||
</a></td>
|
||||
</tr><tr>
|
||||
<td align="center" width="180">
|
||||
<a href="https://github.com/zoo-js/zoo">
|
||||
<img src="https://avatars1.githubusercontent.com/u/70757173?s=200&v=4" width="46" />
|
||||
<div>zoo</div>
|
||||
</a></td>
|
||||
<td align="center" width="180"></td>
|
||||
<td align="center" width="180"></td>
|
||||
<td align="center" width="180"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -134,7 +144,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Add assigness
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -176,7 +186,7 @@ jobs:
|
||||
if: contains(github.event.issue.body, 'xxx') == false
|
||||
steps:
|
||||
- name: Add labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -201,7 +211,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Close issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -234,7 +244,7 @@ jobs:
|
||||
if: github.event.label.name == 'xxx'
|
||||
steps:
|
||||
- name: Create comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -278,7 +288,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Create issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -311,7 +321,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Delete comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'delete-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -343,7 +353,7 @@ jobs:
|
||||
if: github.event.label.name == 'invalid'
|
||||
steps:
|
||||
- name: Lock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -355,26 +365,29 @@ jobs:
|
||||
| actions | 操作类型 | string | ✔ |
|
||||
| token | [token 说明](#token) | string | ✔ |
|
||||
| issue-number | 指定的 issue | number | ✔ |
|
||||
| lock-reason | 锁定 issue 的原因 | string | ✖ |
|
||||
|
||||
- `lock-reason`:可选值有 `off-topic` `too heated` `resolved` `spam`
|
||||
|
||||
⏫ [返回列表](#列-表)
|
||||
|
||||
#### `mark-duplicate`
|
||||
|
||||
快捷标记重复问题,仅作用于 issue 新增评论。
|
||||
快捷标记重复问题,仅作用于 issue 新增编辑评论。
|
||||
|
||||
```yml
|
||||
name: Issue Mark Duplicate
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
types: [created, edited]
|
||||
|
||||
jobs:
|
||||
mark-duplicate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: mark-duplicate
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'mark-duplicate'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -390,9 +403,16 @@ jobs:
|
||||
| labels | 替换该 issue 的 labels | string | ✖ |
|
||||
| contents | 为该评论的增加 [reaction](#reactions-types) | string | ✖ |
|
||||
| close-issue | 是否同时关闭该 issue | string | ✖ |
|
||||
| require-permission | 要求权限,默认为 `write` | string | ✖ |
|
||||
|
||||
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`
|
||||
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?`
|
||||
- `labels`:优先级最高
|
||||
- `close-issue`:`true` 或 `'true'` 均可生效
|
||||
- `require-permission`:可选值有 `admin`,`write`,`read`,`none`
|
||||
- 团队成员若设置 `read` 权限,则为 `read`
|
||||
- 外部 Collaborator 若设置 `read` 权限,则为 `read`
|
||||
- 普通用户为 `read` 权限
|
||||
- 当设置 `write` 后,`admin` 和 `write` 满足条件
|
||||
|
||||
⏫ [返回列表](#列-表)
|
||||
|
||||
@@ -402,7 +422,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Open issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'open-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -423,7 +443,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Remove assignees
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -446,7 +466,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Remove labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -471,7 +491,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Set labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'set-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -494,7 +514,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Unlock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'unlock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -527,7 +547,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Update comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -555,7 +575,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Update issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -603,7 +623,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: welcome
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'welcome'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -646,7 +666,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-inactive
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-inactive'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -695,7 +715,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -734,7 +754,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: close-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -768,7 +788,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Find comments
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'find-comments'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -816,7 +836,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: lock-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -838,6 +858,7 @@ jobs:
|
||||
| body-includes | 包含内容筛选 | string | ✖ |
|
||||
| title-includes | 包含标题筛选 | string | ✖ |
|
||||
| inactive-day | 非活跃天数筛选 | number | ✖ |
|
||||
| lock-reason | 锁定 issue 的原因 | string | ✖ |
|
||||
|
||||
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
||||
- `issue-state`:默认为 `open`。可选值 `all` `closed`,非这 2 项时,均为 `open`
|
||||
@@ -862,7 +883,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: month-statistics
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'month-statistics'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -905,7 +926,7 @@ jobs:
|
||||
if: github.event.label.name == 'watch'
|
||||
steps:
|
||||
- name: find comments
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
id: fcid
|
||||
with:
|
||||
actions: 'find-comments'
|
||||
@@ -916,7 +937,7 @@ jobs:
|
||||
|
||||
- name: create comment
|
||||
if: ${{ steps.fcid.outputs.comments.length == 0 }}
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -925,7 +946,7 @@ jobs:
|
||||
|
||||
- name: update comment
|
||||
if: ${{ steps.fcid.outputs.comments.length == 1 }}
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -957,7 +978,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Create issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
id: createissue
|
||||
with:
|
||||
actions: 'create-issue'
|
||||
@@ -1032,16 +1053,22 @@ x2 + y2
|
||||
- 采用两级语义化版本,如v1、v1.1、v2、v2.1
|
||||
- v1 表示初始版本
|
||||
- 对 v1 版本的修复和新增会发布到 v1.1 版本
|
||||
- 当发布的 v1.x 运行一定时间稳定后,发布进阶 v2 版本
|
||||
- 当发布的 v1.x 运行一定时间稳定或进行重构时,发布进阶 v2 版本
|
||||
|
||||
- 版本选择
|
||||
- 建议采用最新 releases 版本。可在 [releases](https://github.com/actions-cool/issues-helper/releases) 看到
|
||||
- 同时也可参照下面的更新日志来选择版本
|
||||
- 也支持直接使用分支版本。如:
|
||||
- 最新的 v1.x release 代码会合并到 1.x 分支中
|
||||
- 支持直接使用分支版本。如:
|
||||
|
||||
```yml
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@main
|
||||
|
||||
# or
|
||||
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@1.x
|
||||
```
|
||||
|
||||
## Actions 模板
|
||||
|
11
USERS.js
11
USERS.js
@@ -1,7 +1,5 @@
|
||||
// **************************************************************************
|
||||
|
||||
// Add to end
|
||||
|
||||
const users = [
|
||||
{
|
||||
url: 'https://github.com/ant-design/ant-design',
|
||||
@@ -39,10 +37,17 @@ const users = [
|
||||
url: 'https://github.com/zoo-js/zoo',
|
||||
logo: 'https://avatars1.githubusercontent.com/u/70757173?s=200&v=4'
|
||||
},
|
||||
{
|
||||
url: 'https://github.com/react-component',
|
||||
logo: 'https://avatars3.githubusercontent.com/u/9441414?s=200&v=4'
|
||||
},
|
||||
{
|
||||
url: 'https://github.com/ant-design/pro-components',
|
||||
logo: 'https://avatars1.githubusercontent.com/u/12101536?s=200&v=4'
|
||||
},
|
||||
];
|
||||
|
||||
// **************************************************************************
|
||||
|
||||
module.exports = {
|
||||
users
|
||||
};
|
||||
|
@@ -52,12 +52,16 @@ inputs:
|
||||
description: 'Query use'
|
||||
inactive-day:
|
||||
description: 'Query use'
|
||||
lock-reason:
|
||||
description: 'The reason lock issue'
|
||||
inactive-label:
|
||||
description: 'Issue label set use'
|
||||
duplicate-command:
|
||||
description: 'For mark-duplicate'
|
||||
duplicate-labels:
|
||||
description: 'For mark-duplicate add labels'
|
||||
require-permission:
|
||||
description: 'Only the allow can do. Possible admin, write, read, and none.'
|
||||
remove-labels:
|
||||
description: 'For remove labels'
|
||||
close-issue:
|
||||
|
611
dist/index.js
vendored
611
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-inactive
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-inactive'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -110,7 +110,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: close-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -142,7 +142,7 @@ Find the current warehouse issue No. 1, the creator is k and the content contain
|
||||
|
||||
```yml
|
||||
- name: Find comments
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'find-comments'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -188,7 +188,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: lock-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -210,6 +210,7 @@ jobs:
|
||||
| body-includes | Body filtering | string | ✖ |
|
||||
| title-includes | Title filtering | string | ✖ |
|
||||
| inactive-day | Inactive days filtering | number | ✖ |
|
||||
| lock-reason | Reason for locking issue | string | ✖ |
|
||||
|
||||
- `labels`: When there are multiple, the query will have multiple at the same time. If not entered, all
|
||||
- `issue-state`: The default is `all`. Optional value `open` `closed`, when these 2 items are not, both are `all`
|
||||
@@ -232,7 +233,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: month-statistics
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'month-statistics'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
@@ -22,7 +22,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-inactive
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-inactive'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -69,7 +69,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: check-issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'check-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -106,7 +106,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: close-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -138,7 +138,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Find comments
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'find-comments'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -184,7 +184,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: lock-issues
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issues'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -206,6 +206,7 @@ jobs:
|
||||
| body-includes | 包含内容筛选 | string | ✖ |
|
||||
| title-includes | 包含标题筛选 | string | ✖ |
|
||||
| inactive-day | 非活跃天数筛选 | number | ✖ |
|
||||
| lock-reason | 锁定 issue 的原因 | string | ✖ |
|
||||
|
||||
- `labels`:为多个时,会查询同时拥有多个。不填时,会查询所有
|
||||
- `issue-state`:默认为 `all`。可选值 `open` `closed`,非这 2 项时,均为 `all`
|
||||
@@ -228,7 +229,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: month-statistics
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'month-statistics'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
@@ -22,7 +22,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Add assigness
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -62,7 +62,7 @@ jobs:
|
||||
if: contains(github.event.issue.body, 'xxx') == false
|
||||
steps:
|
||||
- name: Add labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -85,7 +85,7 @@ Close the specified issue.
|
||||
|
||||
```yml
|
||||
- name: Close issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -116,7 +116,7 @@ jobs:
|
||||
if: github.event.label.name == 'xxx'
|
||||
steps:
|
||||
- name: Create comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -158,7 +158,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Create issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -189,7 +189,7 @@ According to [`comment-id`](/en-US/guide/ref#-comment-id) delete the specified c
|
||||
|
||||
```yml
|
||||
- name: Delete comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'delete-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -219,7 +219,7 @@ jobs:
|
||||
if: github.event.label.name == 'invalid'
|
||||
steps:
|
||||
- name: Lock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -231,24 +231,27 @@ jobs:
|
||||
| actions | Action type | string | ✔ |
|
||||
| token | [Token explain](/en-US/guide/ref#-token) | string | ✔ |
|
||||
| issue-number | The number of issue | number | ✔ |
|
||||
| lock-reason | Reason for locking issue | string | ✖ |
|
||||
|
||||
- `lock-reason`: Optional values are `off-topic` `too heated` `resolved` `spam`
|
||||
|
||||
## `mark-duplicate`
|
||||
|
||||
Quickly mark duplicate questions, only for issue new comments.
|
||||
Quickly mark duplicate questions, only for issue new comments or edit comments.
|
||||
|
||||
```yml
|
||||
name: Issue Mark Duplicate
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
types: [created, edited]
|
||||
|
||||
jobs:
|
||||
mark-duplicate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: mark-duplicate
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'mark-duplicate'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -264,9 +267,16 @@ jobs:
|
||||
| labels | Replace the labels of the issue | string | ✖ |
|
||||
| contents | Add [reaction](/en-US/guide/ref#-reactions-type) for this comment | string | ✖ |
|
||||
| close-issue | Whether to close the issue at the same time | string | ✖ |
|
||||
| require-permission | Permission required, default is `write` | string | ✖ |
|
||||
|
||||
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`
|
||||
- `duplicate-command`: When setting concise commands, while still supporting the original `Duplicate of`. Block content contains `?`
|
||||
- `labels`: Highest priority
|
||||
- `close-issue`: Both `true` or `'true'` can take effect
|
||||
- `require-permission`: Optional values are `admin`, `write`, `read`, `none`
|
||||
- If the team member sets the `read` permission, it is `read`
|
||||
- If the external Collaborator is set to `read` permission, it is `read`
|
||||
- Ordinary users have `read` permission
|
||||
- When set `write`, `admin` and `write` meet the conditions
|
||||
|
||||
<Alert>
|
||||
Note: Duplicate created with the concise command does not display the content of the red box in the figure below. But in fact this has no effect.
|
||||
@@ -280,7 +290,7 @@ Open the specified issue.
|
||||
|
||||
```yml
|
||||
- name: Open issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'open-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -299,7 +309,7 @@ Remove the person designated by issue.
|
||||
|
||||
```yml
|
||||
- name: Remove assignees
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -320,7 +330,7 @@ Remove the specified labels.
|
||||
|
||||
```yml
|
||||
- name: Remove labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -343,7 +353,7 @@ Replace the labels of issue.
|
||||
|
||||
```yml
|
||||
- name: Set labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'set-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -364,7 +374,7 @@ Unlock the specified issue.
|
||||
|
||||
```yml
|
||||
- name: Unlock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'unlock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -395,7 +405,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Update comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -421,7 +431,7 @@ Update the specified issue according to the `issue-number`.
|
||||
|
||||
```yml
|
||||
- name: Update issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -469,7 +479,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: welcome
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'welcome'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
48
docs/base.md
48
docs/base.md
@@ -22,7 +22,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Add assigness
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -62,7 +62,7 @@ jobs:
|
||||
if: contains(github.event.issue.body, 'xxx') == false
|
||||
steps:
|
||||
- name: Add labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'add-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -85,7 +85,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Close issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'close-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -116,7 +116,7 @@ jobs:
|
||||
if: github.event.label.name == 'xxx'
|
||||
steps:
|
||||
- name: Create comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -158,7 +158,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Create issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -189,7 +189,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Delete comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'delete-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -219,7 +219,7 @@ jobs:
|
||||
if: github.event.label.name == 'invalid'
|
||||
steps:
|
||||
- name: Lock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'lock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -231,24 +231,27 @@ jobs:
|
||||
| actions | 操作类型 | string | ✔ |
|
||||
| token | [token 说明](/guide/ref#-token-说明) | string | ✔ |
|
||||
| issue-number | 指定的 issue | number | ✔ |
|
||||
| lock-reason | 锁定 issue 的原因 | string | ✖ |
|
||||
|
||||
- `lock-reason`:可选值有 `off-topic` `too heated` `resolved` `spam`
|
||||
|
||||
## `mark-duplicate`
|
||||
|
||||
快捷标记重复问题,仅作用于 issue 新增评论。
|
||||
快捷标记重复问题,仅作用于 issue 新增编辑评论。
|
||||
|
||||
```yml
|
||||
name: Issue Mark Duplicate
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
types: [created, edited]
|
||||
|
||||
jobs:
|
||||
mark-duplicate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: mark-duplicate
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'mark-duplicate'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -264,9 +267,16 @@ jobs:
|
||||
| labels | 替换该 issue 的 labels | string | ✖ |
|
||||
| contents | 为该评论的增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ |
|
||||
| close-issue | 是否同时关闭该 issue | string | ✖ |
|
||||
| require-permission | 要求权限,默认为 `write` | string | ✖ |
|
||||
|
||||
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`
|
||||
- `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?`
|
||||
- `labels`:优先级最高
|
||||
- `close-issue`:`true` 或 `'true'` 均可生效
|
||||
- `require-permission`:可选值有 `admin`,`write`,`read`,`none`
|
||||
- 团队成员若设置 `read` 权限,则为 `read`
|
||||
- 外部 Collaborator 若设置 `read` 权限,则为 `read`
|
||||
- 普通用户为 `read` 权限
|
||||
- 当设置 `write` 后,`admin` 和 `write` 满足条件
|
||||
|
||||
<Alert>
|
||||
注意:使用简洁命令创建的 Duplicate 不显示下图红框内容。但其实这个没有任何影响的。
|
||||
@@ -280,7 +290,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Open issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'open-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -299,7 +309,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Remove assignees
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-assignees'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -320,7 +330,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Remove labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'remove-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -343,7 +353,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Set labels
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'set-labels'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -364,7 +374,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Unlock issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'unlock-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -395,7 +405,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Update comment
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -421,7 +431,7 @@ jobs:
|
||||
|
||||
```yml
|
||||
- name: Update issue
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'update-issue'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -468,7 +478,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: welcome
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'welcome'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
@@ -8,16 +8,22 @@ toc: menu
|
||||
- Use two-level semantic version, such as v1, v1.1, v2, v2.1
|
||||
- v1 represents the initial version
|
||||
- The fixes and additions to the v1 version will be released to the v1.1 version
|
||||
- When the released v1.x runs stable for a certain period of time, release the advanced v2 version
|
||||
- When the released v1.x runs stable for a certain period of time or undergoes refactoring, release the advanced v2 version
|
||||
|
||||
- Version selection
|
||||
- It is recommended to use the latest releases version. It can be seen in [releases](https://github.com/actions-cool/issues-helper/releases)
|
||||
- You can also refer to the update log below to select the version
|
||||
- The latest v1.x release code will be merged into the 1.x branch
|
||||
- It also supports the direct use of branch versions. Such as:
|
||||
|
||||
```yml
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@main
|
||||
|
||||
# or
|
||||
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@1.x
|
||||
```
|
||||
|
||||
<embed src="../CHANGELOG.md"></embed>
|
||||
|
@@ -8,16 +8,22 @@ toc: menu
|
||||
- 采用两级语义化版本,如v1、v1.1、v2、v2.1
|
||||
- v1 表示初始版本
|
||||
- 对 v1 版本的修复和新增会发布到 v1.1 版本
|
||||
- 当发布的 v1.x 运行一定时间稳定后,发布进阶 v2 版本
|
||||
- 当发布的 v1.x 运行一定时间稳定或进行重构时,发布进阶 v2 版本
|
||||
|
||||
- 版本选择
|
||||
- 建议采用最新 releases 版本。可在 [releases](https://github.com/actions-cool/issues-helper/releases) 看到
|
||||
- 同时也可参照下面的更新日志来选择版本
|
||||
- 也支持直接使用分支版本。如:
|
||||
- 最新的 v1.x release 代码会合并到 1.x 分支中
|
||||
- 支持直接使用分支版本。如:
|
||||
|
||||
```yml
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@main
|
||||
|
||||
# or
|
||||
|
||||
- name: Issues Helper
|
||||
uses: actions-cool/issues-helper@1.x
|
||||
```
|
||||
|
||||
<embed src="../CHANGELOG.md"></embed>
|
||||
|
@@ -22,6 +22,10 @@ Yes, you can directly modify `actions`. For example: `actions:'create-comment'`
|
||||
|
||||
You can view the detailed [changelog](/en-US/changelog). The latest releases version is recommended.
|
||||
|
||||
## What should I pay attention to when upgrading from v1.x to v2?
|
||||
|
||||
There is only one difference between v1.x and v2. That is, `require-permission` in `mark-duplicate` has added the default value `write`.
|
||||
|
||||
## What should I do if there is no function I want here?
|
||||
|
||||
You can submit it in [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18).
|
||||
|
@@ -22,6 +22,10 @@ GitHub Actions 是由 GitHub 免费提供的。其中 `Private` 项目每月有
|
||||
|
||||
你可以查看详细的 [更新日志](/changelog)。推荐采用最新 releases 版本。
|
||||
|
||||
## 从 v1.x 升级到 v2,有什么注意的地方吗?
|
||||
|
||||
v1.x 和 v2 版本的差别只有一处。即 `mark-duplicate` 中的 `require-permission` 增加了默认值 `write`。
|
||||
|
||||
## 如果这里没有我想要的功能,该怎么办?
|
||||
|
||||
你可以在 [What do you want?](https://github.com/actions-cool/issues-helper/discussions/18) 中提出。
|
||||
|
@@ -33,7 +33,7 @@ jobs:
|
||||
steps:
|
||||
- name: help wanted
|
||||
if: github.event.label.name == 'help wanted'
|
||||
uses: actions-cool/issues-helper@v1.2
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
- `on`: The action trigger condition
|
||||
- Reference [Events that trigger workflows](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
|
||||
- `uses`: Use actions name
|
||||
- `uses: actions-cool/issues-helper@v1.2`。Please [refer](/en-US/changelog) to version selection
|
||||
- `uses: actions-cool/issues-helper@v2`。Please [refer](/en-US/changelog) to version selection
|
||||
- `issues-hepler` parameter
|
||||
- `actions`: The name of the function used, **required**. Support multiple, separated by commas, such as `create-comment,close-issue` means comment and close issue
|
||||
- `token`: A person who needs to have push permission token
|
||||
|
@@ -33,7 +33,7 @@ jobs:
|
||||
steps:
|
||||
- name: help wanted
|
||||
if: github.event.label.name == 'help wanted'
|
||||
uses: actions-cool/issues-helper@v1.2
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
- `on`:action 触发条件
|
||||
- 参考 [工作流触发机制](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows)
|
||||
- `uses`:使用 actions 名称
|
||||
- `uses: actions-cool/issues-helper@v1.2`。版本选择请 [参考](/changelog)
|
||||
- `uses: actions-cool/issues-helper@v2`。版本选择请 [参考](/changelog)
|
||||
- `issues-hepler` 参数
|
||||
- `actions`:使用功能的名称,**必填**。支持多个,需用逗号隔开,如 `create-comment,close-issue` 表示评论和关闭 issue
|
||||
- `token`:需拥有 push 权限的人员 token
|
||||
|
@@ -38,7 +38,7 @@ jobs:
|
||||
steps:
|
||||
- name: help wanted
|
||||
if: github.event.label.name == 'help wanted'
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
## 💖 Who is using?
|
||||
|
||||
<embed src="../README.md#L29-L82"></embed>
|
||||
<embed src="../README.md#RE-/<table>[^]+?[\r\n]<\/table>/"></embed>
|
||||
|
||||
## ⚡ Feedback
|
||||
|
||||
|
@@ -38,7 +38,7 @@ jobs:
|
||||
steps:
|
||||
- name: help wanted
|
||||
if: github.event.label.name == 'help wanted'
|
||||
uses: actions-cool/issues-helper@v1.9
|
||||
uses: actions-cool/issues-helper@v2
|
||||
with:
|
||||
actions: 'create-comment'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
## 💖 谁在使用?
|
||||
|
||||
<embed src="../README.md#L29-L82"></embed>
|
||||
<embed src="../README.md#RE-/<table>[^]+?[\r\n]<\/table>/"></embed>
|
||||
|
||||
## ⚡ 反馈
|
||||
|
||||
|
11
package.json
11
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "issue-helper",
|
||||
"version": "1.9.0",
|
||||
"name": "issues-helper",
|
||||
"version": "2.0.0",
|
||||
"private": true,
|
||||
"description": "Some operations on issue.",
|
||||
"main": "src/main.js",
|
||||
@@ -10,6 +10,8 @@
|
||||
"docs-dev:build": "UMI_ENV=dev dumi build",
|
||||
"docs:deploy": "gh-pages -d docs-dist",
|
||||
"deploy": "npm run docs:build && npm run docs:deploy",
|
||||
"format": "prettier --write **/*.ts **/*.js",
|
||||
"format-check": "prettier --check **/*.ts **/*.js",
|
||||
"package": "ncc build src/main.js -o dist",
|
||||
"users": "node ./script/update-users.js",
|
||||
"main": "node ./src/main.js",
|
||||
@@ -19,7 +21,7 @@
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/actions-cool/issue-helper.git",
|
||||
"url": "https://github.com/actions-cool/issues-helper.git",
|
||||
"branch": "main"
|
||||
},
|
||||
"keywords": [
|
||||
@@ -36,10 +38,11 @@
|
||||
"lodash": "^4.17.20"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@umijs/fabric": "^2.5.6",
|
||||
"@vercel/ncc": "^0.25.1",
|
||||
"common-tags": "^1.8.0",
|
||||
"dotenv": "^8.2.0",
|
||||
"dumi": "^1.1.0",
|
||||
"dumi": "^1.1.1",
|
||||
"gh-pages": "^3.1.0",
|
||||
"react": "^17.0.1"
|
||||
}
|
||||
|
@@ -17,13 +17,13 @@ for (let j = 1; j <= row; j++) {
|
||||
let data = '';
|
||||
data = stripIndent`
|
||||
<tr>
|
||||
<td align="center" width="180">${getImg(users[(j-1)*4])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j-1)*4+1])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j-1)*4+2])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j-1)*4+3])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j - 1) * 4])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j - 1) * 4 + 1])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j - 1) * 4 + 2])}</td>
|
||||
<td align="center" width="180">${getImg(users[(j - 1) * 4 + 3])}</td>
|
||||
</tr>`;
|
||||
table += data
|
||||
};
|
||||
table += data;
|
||||
}
|
||||
|
||||
table = `<table>
|
||||
${table}
|
||||
@@ -34,7 +34,7 @@ ${table}
|
||||
// **************************************************************************
|
||||
|
||||
const point = '<table>';
|
||||
const cnPoint= `## 列 表`;
|
||||
const cnPoint = `## 列 表`;
|
||||
const enPoint = `## List`;
|
||||
|
||||
// **************************************************************************
|
||||
@@ -61,22 +61,22 @@ console.log(`🎉 Done en`);
|
||||
|
||||
// **************************************************************************
|
||||
|
||||
function getImg (o) {
|
||||
function getImg(o) {
|
||||
if (o) {
|
||||
return `
|
||||
<a href="${o.url}">
|
||||
<img src="${o.logo}" width="46" />
|
||||
<div>${getName(o)}</div>
|
||||
</a>`
|
||||
</a>`;
|
||||
}
|
||||
return ``
|
||||
};
|
||||
return ``;
|
||||
}
|
||||
|
||||
function getName (o) {
|
||||
function getName(o) {
|
||||
if (o) {
|
||||
return o.url.split('/').slice(-1)[0]
|
||||
return o.url.split('/').slice(-1)[0];
|
||||
}
|
||||
return ``
|
||||
};
|
||||
return ``;
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
|
@@ -1,7 +1,7 @@
|
||||
const { readFileSync, writeFileSync } = require('fs');
|
||||
|
||||
const last = /v1\.8/g;
|
||||
const now = 'v1.9';
|
||||
const last = /v1\.11/g;
|
||||
const now = 'v2';
|
||||
|
||||
let readme = readFileSync('./README.md', 'utf-8');
|
||||
readme = readme.replace(last, now);
|
||||
|
132
src/advanced.js
132
src/advanced.js
@@ -1,5 +1,5 @@
|
||||
require('dotenv').config();
|
||||
const core = require("@actions/core");
|
||||
const core = require('@actions/core');
|
||||
const { Octokit } = require('@octokit/rest');
|
||||
|
||||
const {
|
||||
@@ -10,17 +10,9 @@ const {
|
||||
doCreateIssue,
|
||||
} = require('./base.js');
|
||||
|
||||
const {
|
||||
doQueryIssues,
|
||||
getIssuesInMonth,
|
||||
getCreatedMonth,
|
||||
} = require('./public.js');
|
||||
const { doQueryIssues, getIssuesInMonth, getCreatedMonth } = require('./public.js');
|
||||
|
||||
const {
|
||||
dealStringToArr,
|
||||
matchKeyword,
|
||||
getPreMonth
|
||||
} = require('./util.js');
|
||||
const { dealStringToArr, matchKeyword, getPreMonth } = require('./util.js');
|
||||
|
||||
// **************************************************************************
|
||||
var dayjs = require('dayjs');
|
||||
@@ -31,22 +23,22 @@ dayjs.extend(utc);
|
||||
const token = core.getInput('token');
|
||||
const octokit = new Octokit({ auth: `token ${token}` });
|
||||
|
||||
let direction = core.getInput("direction");
|
||||
let direction = core.getInput('direction');
|
||||
direction = direction === 'desc' ? 'desc' : 'asc';
|
||||
const commentAuth = core.getInput("comment-auth");
|
||||
const commentAuth = core.getInput('comment-auth');
|
||||
const bodyIncludes = core.getInput('body-includes');
|
||||
const titleIncludes = core.getInput('title-includes');
|
||||
const assigneeIncludes = core.getInput('assignee-includes');
|
||||
|
||||
let issueState = core.getInput("issue-state") || 'open';
|
||||
let issueState = core.getInput('issue-state') || 'open';
|
||||
if (issueState != 'all' && issueState != 'closed') {
|
||||
issueState = 'open';
|
||||
}
|
||||
|
||||
const inactiveLabel = core.getInput("inactive-label") || 'inactive';
|
||||
const inactiveLabel = core.getInput('inactive-label') || 'inactive';
|
||||
|
||||
// **************************************************************************
|
||||
async function doCheckInactive (owner, repo, labels) {
|
||||
async function doCheckInactive(owner, repo, labels) {
|
||||
const issues = await doQueryIssues(owner, repo, labels, issueState);
|
||||
|
||||
if (issues.length) {
|
||||
@@ -57,8 +49,8 @@ async function doCheckInactive (owner, repo, labels) {
|
||||
});
|
||||
if (!arr.includes(inactiveLabel)) {
|
||||
await doAddLabels(owner, repo, issues[i].number, inactiveLabel);
|
||||
if (core.getInput("body")) {
|
||||
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
|
||||
if (core.getInput('body')) {
|
||||
await doCreateComment(owner, repo, issues[i].number, core.getInput('body'));
|
||||
}
|
||||
} else {
|
||||
core.info(`Actions: [add-inactive] issue ${issues[i].number} has label!`);
|
||||
@@ -67,19 +59,19 @@ async function doCheckInactive (owner, repo, labels) {
|
||||
} else {
|
||||
core.info(`Actions: [query-issues] empty!`);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 issue 是否满足条件,满足返回 true
|
||||
* 当前 issue 的指定人是否有一个满足 assigneeIncludes 里的某个
|
||||
* 关键字匹配,是否包含前一个某个+后一个某个 '官网,网站/挂了,无法访问'
|
||||
*/
|
||||
async function doCheckIssue (owner, repo, issueNumber) {
|
||||
async function doCheckIssue(owner, repo, issueNumber) {
|
||||
var checkResult = true;
|
||||
const issue = await octokit.issues.get({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
|
||||
if (!!checkResult && assigneeIncludes) {
|
||||
@@ -90,53 +82,51 @@ async function doCheckIssue (owner, repo, issueNumber) {
|
||||
checkResult = true;
|
||||
checkAssignee = true;
|
||||
}
|
||||
})
|
||||
!checkAssignee ? checkResult = false : null;
|
||||
});
|
||||
!checkAssignee ? (checkResult = false) : null;
|
||||
}
|
||||
|
||||
if (!!checkResult && titleIncludes) {
|
||||
const titleArr = titleIncludes.split('/');
|
||||
const keyword1 = dealStringToArr(titleArr[0]);
|
||||
const keyword2 = dealStringToArr(titleArr[1]);
|
||||
checkResult =
|
||||
keyword2.length ?
|
||||
matchKeyword(issue.data.title, keyword1) && matchKeyword(issue.data.title, keyword2) :
|
||||
matchKeyword(issue.data.title, keyword1);
|
||||
checkResult = keyword2.length
|
||||
? matchKeyword(issue.data.title, keyword1) && matchKeyword(issue.data.title, keyword2)
|
||||
: matchKeyword(issue.data.title, keyword1);
|
||||
}
|
||||
|
||||
if (!!checkResult && bodyIncludes) {
|
||||
const bodyArr = bodyIncludes.split('/');
|
||||
const keyword1 = dealStringToArr(bodyArr[0]);
|
||||
const keyword2 = dealStringToArr(bodyArr[1]);
|
||||
checkResult =
|
||||
keyword2.length ?
|
||||
matchKeyword(issue.data.body, keyword1) && matchKeyword(issue.data.body, keyword2) :
|
||||
matchKeyword(issue.data.body, keyword1);
|
||||
checkResult = keyword2.length
|
||||
? matchKeyword(issue.data.body, keyword1) && matchKeyword(issue.data.body, keyword2)
|
||||
: matchKeyword(issue.data.body, keyword1);
|
||||
}
|
||||
core.info(`Actions: [check-issue][${!!checkResult}] success!`);
|
||||
core.setOutput("check-result", !!checkResult);
|
||||
};
|
||||
core.setOutput('check-result', !!checkResult);
|
||||
}
|
||||
|
||||
async function doCloseIssues (owner, repo, labels) {
|
||||
async function doCloseIssues(owner, repo, labels) {
|
||||
const issues = await doQueryIssues(owner, repo, labels, 'open');
|
||||
|
||||
if (issues.length) {
|
||||
for (let i = 0; i < issues.length; i++) {
|
||||
await doCloseIssue(owner, repo, issues[i].number);
|
||||
if (core.getInput("body")) {
|
||||
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
|
||||
if (core.getInput('body')) {
|
||||
await doCreateComment(owner, repo, issues[i].number, core.getInput('body'));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
core.info(`Actions: [query-issues] empty!`);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doFindComments (owner, repo, issueNumber) {
|
||||
async function doFindComments(owner, repo, issueNumber) {
|
||||
const res = await octokit.issues.listComments({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
core.info(`Actions: [find-comments][${issueNumber}] success!`);
|
||||
let comments = [];
|
||||
@@ -149,34 +139,34 @@ async function doFindComments (owner, repo, issueNumber) {
|
||||
auth: item.user.login,
|
||||
body: item.body,
|
||||
created: item.created_at,
|
||||
updated: item.updated_at
|
||||
})
|
||||
updated: item.updated_at,
|
||||
});
|
||||
if (direction === 'desc') {
|
||||
comments.reverse();
|
||||
}
|
||||
}
|
||||
})
|
||||
core.setOutput("comments", comments);
|
||||
};
|
||||
});
|
||||
core.setOutput('comments', comments);
|
||||
}
|
||||
|
||||
async function doLockIssues (owner, repo, labels) {
|
||||
async function doLockIssues(owner, repo, labels) {
|
||||
const issues = await doQueryIssues(owner, repo, labels, issueState);
|
||||
|
||||
if (issues.length) {
|
||||
for (let i = 0; i < issues.length; i++) {
|
||||
await doLockIssue(owner, repo, issues[i].number);
|
||||
if (core.getInput("body")) {
|
||||
await doCreateComment(owner, repo, issues[i].number, core.getInput("body"));
|
||||
if (core.getInput('body')) {
|
||||
await doCreateComment(owner, repo, issues[i].number, core.getInput('body'));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
core.info(`Actions: [query-issues] empty!`);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||
const countLables = core.getInput("count-lables");
|
||||
const countComments = core.getInput("count-comments");
|
||||
async function doMonthStatistics(owner, repo, labels, assignees) {
|
||||
const countLables = core.getInput('count-lables');
|
||||
const countComments = core.getInput('count-comments');
|
||||
|
||||
const thisMonth = dayjs.utc().month() + 1;
|
||||
const year = thisMonth == 1 ? dayjs.utc().year() - 1 : dayjs.utc().year();
|
||||
@@ -184,17 +174,13 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||
const month = getPreMonth(thisMonth);
|
||||
const showMonth = month < 10 ? `0${month}` : month;
|
||||
|
||||
let issues = await getIssuesInMonth(
|
||||
owner,
|
||||
repo,
|
||||
thisMonth
|
||||
);
|
||||
let issues = await getIssuesInMonth(owner, repo, thisMonth);
|
||||
if (issues.length == 0) {
|
||||
core.info(`Actions: [query-issues-${month}] empty!`);
|
||||
return false;
|
||||
}
|
||||
issues = issues.filter(i => {
|
||||
return getCreatedMonth(i.created_at) == month
|
||||
return getCreatedMonth(i.created_at) == month;
|
||||
});
|
||||
let total = issues.length;
|
||||
let totalIssues = [...issues];
|
||||
@@ -219,10 +205,12 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||
} else {
|
||||
labelsTotals[l.name] = 1;
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
let now = dayjs().utc().format('YYYY-MM-DD HH:mm:ss');
|
||||
let now = dayjs()
|
||||
.utc()
|
||||
.format('YYYY-MM-DD HH:mm:ss');
|
||||
let body = `
|
||||
- Created time: ${now}
|
||||
|
||||
@@ -244,8 +232,8 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||
for (var lab in labelsTotals) {
|
||||
labelsArr.push({
|
||||
labelName: lab,
|
||||
number: labelsTotals[lab]
|
||||
})
|
||||
number: labelsTotals[lab],
|
||||
});
|
||||
}
|
||||
labelsArr.sort((a, b) => b.number - a.number);
|
||||
let labelsTitle = `
|
||||
@@ -255,12 +243,16 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Number</th>
|
||||
</tr>`
|
||||
</tr>`;
|
||||
let labelsBody = '';
|
||||
labelsArr.forEach(it => {
|
||||
labelsBody += `<tr><td>${it.labelName}</td><td>${it.number}</td></tr>`
|
||||
})
|
||||
body = body + labelsTitle + labelsBody + `</table>
|
||||
labelsBody += `<tr><td>${it.labelName}</td><td>${it.number}</td></tr>`;
|
||||
});
|
||||
body =
|
||||
body +
|
||||
labelsTitle +
|
||||
labelsBody +
|
||||
`</table>
|
||||
|
||||
`;
|
||||
}
|
||||
@@ -279,21 +271,21 @@ async function doMonthStatistics (owner, repo, labels, assignees) {
|
||||
<th>Number</th>
|
||||
<th>State</th>
|
||||
</tr>
|
||||
`
|
||||
`;
|
||||
let commentBody = '';
|
||||
maxComments.forEach((it,ind) => {
|
||||
maxComments.forEach((it, ind) => {
|
||||
commentBody += `<tr>
|
||||
<td>${ind + 1}</td>
|
||||
<td>${it.number}</td>
|
||||
<td>${it.title}</td>
|
||||
<td>${it.comments}</td>
|
||||
<td>${it.state}</td></tr>`
|
||||
})
|
||||
<td>${it.state}</td></tr>`;
|
||||
});
|
||||
body = body + commentTitle + commentBody + '</table>';
|
||||
}
|
||||
|
||||
await doCreateIssue(owner, repo, title, body, labels, assignees);
|
||||
};
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
module.exports = {
|
||||
|
318
src/base.js
318
src/base.js
@@ -1,28 +1,18 @@
|
||||
require('dotenv').config();
|
||||
const core = require("@actions/core");
|
||||
const github = require("@actions/github");
|
||||
const core = require('@actions/core');
|
||||
const github = require('@actions/github');
|
||||
const { Octokit } = require('@octokit/rest');
|
||||
|
||||
// **************************************************************************
|
||||
const ALLREACTIONS = [
|
||||
"+1",
|
||||
"-1",
|
||||
"laugh",
|
||||
"confused",
|
||||
"heart",
|
||||
"hooray",
|
||||
"rocket",
|
||||
"eyes",
|
||||
];
|
||||
const ALLREACTIONS = ['+1', '-1', 'laugh', 'confused', 'heart', 'hooray', 'rocket', 'eyes'];
|
||||
|
||||
const {
|
||||
doQueryIssues
|
||||
} = require('./public.js');
|
||||
const { doQueryIssues } = require('./public.js');
|
||||
|
||||
const {
|
||||
dealStringToArr,
|
||||
dealRandomAssignees,
|
||||
testDuplicate,
|
||||
checkPermission,
|
||||
} = require('./util.js');
|
||||
|
||||
// **************************************************************************
|
||||
@@ -30,56 +20,56 @@ const token = core.getInput('token');
|
||||
const octokit = new Octokit({ auth: `token ${token}` });
|
||||
const context = github.context;
|
||||
|
||||
const contents = core.getInput("contents");
|
||||
const contents = core.getInput('contents');
|
||||
|
||||
const randomTo = core.getInput("random-to");
|
||||
const randomTo = core.getInput('random-to');
|
||||
|
||||
// **************************************************************************
|
||||
async function doAddAssignees (owner, repo, issueNumber, assignees) {
|
||||
async function doAddAssignees(owner, repo, issueNumber, assignees) {
|
||||
const arr = dealRandomAssignees(assignees, randomTo);
|
||||
await octokit.issues.addAssignees({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
assignees: arr
|
||||
assignees: arr,
|
||||
});
|
||||
core.info(`Actions: [add-assignees][${arr}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doAddLabels (owner, repo, issueNumber, labels) {
|
||||
async function doAddLabels(owner, repo, issueNumber, labels) {
|
||||
await octokit.issues.addLabels({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
labels: dealStringToArr(labels)
|
||||
labels: dealStringToArr(labels),
|
||||
});
|
||||
core.info(`Actions: [add-labels][${labels}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doCloseIssue (owner, repo, issueNumber) {
|
||||
async function doCloseIssue(owner, repo, issueNumber) {
|
||||
await octokit.issues.update({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
state: 'closed'
|
||||
state: 'closed',
|
||||
});
|
||||
core.info(`Actions: [close-issue][${issueNumber}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doCreateComment (owner, repo, issueNumber, body) {
|
||||
async function doCreateComment(owner, repo, issueNumber, body) {
|
||||
const { data } = await octokit.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
body
|
||||
body,
|
||||
});
|
||||
core.info(`Actions: [create-comment][${body}] success!`);
|
||||
core.setOutput("comment-id", data.id);
|
||||
core.setOutput('comment-id', data.id);
|
||||
|
||||
if (contents) {
|
||||
await doCreateCommentContent(owner, repo, data.id, dealStringToArr(contents));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doCreateCommentContent(owner, repo, commentId, contents) {
|
||||
if (contents.length) {
|
||||
@@ -89,15 +79,15 @@ async function doCreateCommentContent(owner, repo, commentId, contents) {
|
||||
owner,
|
||||
repo,
|
||||
comment_id: commentId,
|
||||
content: item
|
||||
content: item,
|
||||
});
|
||||
core.info(`Actions: [create-reactions][${item}] success!`);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doCreateIssue (owner, repo, title, body, labels, assignees) {
|
||||
async function doCreateIssue(owner, repo, title, body, labels, assignees) {
|
||||
let params = {
|
||||
owner,
|
||||
repo,
|
||||
@@ -109,12 +99,12 @@ async function doCreateIssue (owner, repo, title, body, labels, assignees) {
|
||||
|
||||
const { data } = await octokit.issues.create(params);
|
||||
core.info(`Actions: [create-issue][${title}] success!`);
|
||||
core.setOutput("issue-number", data.number);
|
||||
core.setOutput('issue-number', data.number);
|
||||
|
||||
if (contents) {
|
||||
await doCreateIssueContent(owner, repo, data.number, dealStringToArr(contents));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doCreateIssueContent(owner, repo, issueNumber, contents) {
|
||||
if (contents.length) {
|
||||
@@ -124,160 +114,208 @@ async function doCreateIssueContent(owner, repo, issueNumber, contents) {
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
content: item
|
||||
content: item,
|
||||
});
|
||||
core.info(`Actions: [create-reactions][${item}] success!`);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doDeleteComment (owner, repo, commentId) {
|
||||
async function doDeleteComment(owner, repo, commentId) {
|
||||
await octokit.issues.deleteComment({
|
||||
owner,
|
||||
repo,
|
||||
comment_id: commentId
|
||||
comment_id: commentId,
|
||||
});
|
||||
core.info(`Actions: [delete-comment][${commentId}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doLockIssue (owner, repo, issueNumber) {
|
||||
await octokit.issues.lock({
|
||||
async function doLockIssue(owner, repo, issueNumber) {
|
||||
const lockReason = core.getInput('lock-reason');
|
||||
let params = {
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
};
|
||||
const reasons = ['off-topic', 'too heated', 'resolved', 'spam'];
|
||||
if (lockReason && reasons.includes(lockReason)) {
|
||||
params.lock_reason = lockReason;
|
||||
}
|
||||
await octokit.issues.lock(params);
|
||||
core.info(`Actions: [lock-issue][${issueNumber}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doMarkDuplicate (owner, repo, labels) {
|
||||
async function doMarkDuplicate(owner, repo, labels) {
|
||||
if (context.eventName != 'issue_comment') {
|
||||
core.info(`This actions only support on 'issue_comment'!`);
|
||||
return false;
|
||||
}
|
||||
if (context.payload.action != 'created') {
|
||||
core.info(`This actions only support on 'issue_comment' created!`);
|
||||
return false;
|
||||
}
|
||||
|
||||
const duplicateCommand = core.getInput("duplicate-command");
|
||||
const duplicateLabels = core.getInput("duplicate-labels");
|
||||
const removeLables = core.getInput("remove-labels");
|
||||
const closeIssue = core.getInput("close-issue");
|
||||
if (context.payload.action == 'created' || context.payload.action == 'edited') {
|
||||
const duplicateCommand = core.getInput('duplicate-command');
|
||||
const duplicateLabels = core.getInput('duplicate-labels');
|
||||
const removeLables = core.getInput('remove-labels');
|
||||
const closeIssue = core.getInput('close-issue');
|
||||
const requirePermission = core.getInput('require-permission') || 'write';
|
||||
|
||||
const commentId = context.payload.comment.id;
|
||||
const commentBody = context.payload.comment.body;
|
||||
const issueNumber = context.payload.issue.number;
|
||||
const commentId = context.payload.comment.id;
|
||||
const commentBody = context.payload.comment.body;
|
||||
const commentUser = context.payload.comment.user.login;
|
||||
const issueNumber = context.payload.issue.number;
|
||||
|
||||
const ifCommandInput = !!duplicateCommand;
|
||||
const ifCommandInput = !!duplicateCommand;
|
||||
|
||||
if ((ifCommandInput && commentBody.startsWith(duplicateCommand) && commentBody.split(' ')[0] == duplicateCommand) || testDuplicate(commentBody)) {
|
||||
if (ifCommandInput) {
|
||||
const nextBody = commentBody.replace(duplicateCommand, 'Duplicate of');
|
||||
await doUpdateComment(owner, repo, commentId, nextBody, 'replace', true);
|
||||
} else if (contents) {
|
||||
await doCreateCommentContent(owner, repo, commentId, dealStringToArr(contents));
|
||||
const res = await octokit.repos.getCollaboratorPermissionLevel({
|
||||
owner,
|
||||
repo,
|
||||
username: commentUser,
|
||||
});
|
||||
const { permission } = res.data;
|
||||
if (!checkPermission(requirePermission, permission)) {
|
||||
core.info(`The user ${commentUser} is not allow!`);
|
||||
return false;
|
||||
}
|
||||
if (duplicateLabels) {
|
||||
await doAddLabels(owner, repo, issueNumber, duplicateLabels);
|
||||
}
|
||||
if (removeLables) {
|
||||
await doRemoveLabels(owner, repo, issueNumber, removeLables);
|
||||
}
|
||||
if (labels) {
|
||||
await doSetLabels(owner, repo, issueNumber, labels);
|
||||
}
|
||||
if (closeIssue == 'true') {
|
||||
await doCloseIssue(owner, repo, issueNumber);
|
||||
|
||||
if (
|
||||
!commentBody.includes('?') &&
|
||||
((ifCommandInput &&
|
||||
commentBody.startsWith(duplicateCommand) &&
|
||||
commentBody.split(' ')[0] == duplicateCommand) ||
|
||||
testDuplicate(commentBody))
|
||||
) {
|
||||
if (ifCommandInput) {
|
||||
const nextBody = commentBody.replace(duplicateCommand, 'Duplicate of');
|
||||
await doUpdateComment(owner, repo, commentId, nextBody, 'replace', true);
|
||||
} else if (contents) {
|
||||
await doCreateCommentContent(owner, repo, commentId, dealStringToArr(contents));
|
||||
}
|
||||
|
||||
const issue = await octokit.issues.get({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
let newLabels = [];
|
||||
if (issue.data.labels.length > 0) {
|
||||
newLabels = issue.data.labels
|
||||
.map(({ name }) => name)
|
||||
.filter(name => !dealStringToArr(removeLables).includes(name));
|
||||
}
|
||||
if (duplicateLabels) {
|
||||
newLabels = [...newLabels, ...dealStringToArr(duplicateLabels)];
|
||||
}
|
||||
if (labels) {
|
||||
newLabels = dealStringToArr(labels);
|
||||
}
|
||||
if (newLabels.length > 0) {
|
||||
await doSetLabels(owner, repo, issueNumber, newLabels.toString());
|
||||
core.info(`Actions: [mark-duplicate-labels][${newLabels}] success!`);
|
||||
}
|
||||
|
||||
if (closeIssue == 'true') {
|
||||
await doCloseIssue(owner, repo, issueNumber);
|
||||
}
|
||||
} else {
|
||||
core.info(
|
||||
`This comment body should start whith 'duplicate-command' or 'Duplicate of' and not include '?'`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
core.info(`This comment body should start whith 'duplicate-command'`);
|
||||
core.info(`This actions only support on 'issue_comment' created or edited!`);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doOpenIssue (owner, repo, issueNumber) {
|
||||
async function doOpenIssue(owner, repo, issueNumber) {
|
||||
await octokit.issues.update({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
state: 'open'
|
||||
state: 'open',
|
||||
});
|
||||
core.info(`Actions: [open-issue][${issueNumber}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doRemoveAssignees (owner, repo, issueNumber, assignees) {
|
||||
async function doRemoveAssignees(owner, repo, issueNumber, assignees) {
|
||||
await octokit.issues.removeAssignees({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
assignees: dealStringToArr(assignees)
|
||||
assignees: dealStringToArr(assignees),
|
||||
});
|
||||
core.info(`Actions: [remove-assignees][${assignees}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doRemoveLabels (owner, repo, issueNumber, labels) {
|
||||
const issue = await octokit.issues.get({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber
|
||||
});
|
||||
async function doRemoveLabels(owner, repo, issueNumber, labels) {
|
||||
const dealLabels = dealStringToArr(labels);
|
||||
let addLables = [];
|
||||
if (dealLabels.length) {
|
||||
issue.data.labels.forEach(item => {
|
||||
!dealLabels.includes(item.name) ? addLables.push(item.name) : '';
|
||||
})
|
||||
await octokit.issues.setLabels({
|
||||
for (label of dealLabels) {
|
||||
await octokit.issues.removeLabel({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
labels: addLables
|
||||
name: label,
|
||||
});
|
||||
core.info(`Actions: [remove-labels][${labels}] success!`);
|
||||
core.info(`Actions: [remove-labels-foreach][${label}] success!`);
|
||||
}
|
||||
};
|
||||
core.info(`Actions: [remove-labels][${labels}] success!`);
|
||||
}
|
||||
|
||||
async function doSetLabels (owner, repo, issueNumber, labels) {
|
||||
await octokit.issues.setLabels({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
labels: dealStringToArr(labels)
|
||||
});
|
||||
core.info(`Actions: [set-labels][${labels}] success!`);
|
||||
};
|
||||
async function doSetLabels(owner, repo, issueNumber, labels) {
|
||||
// 概率性出现问题:https://github.com/octokit/rest.js/issues/1982,规避 setLabels
|
||||
if (labels) {
|
||||
// await octokit.issues.setLabels({
|
||||
// owner,
|
||||
// repo,
|
||||
// issue_number: issueNumber,
|
||||
// labels: dealStringToArr(labels)
|
||||
// });
|
||||
const issue = await octokit.issues.get({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
const baseLabels = issue.data.labels.map(({ name }) => name);
|
||||
const removeLabels = baseLabels.filter(name => !dealStringToArr(labels).includes(name));
|
||||
const addLabels = dealStringToArr(labels).filter(name => !baseLabels.includes(name));
|
||||
|
||||
async function doUnlockIssue (owner, repo, issueNumber) {
|
||||
if (removeLabels.length > 0) {
|
||||
await doRemoveLabels(owner, repo, issueNumber, removeLabels.toString());
|
||||
core.info(`Actions: [set-labels-remove][${removeLabels}] success!`);
|
||||
}
|
||||
|
||||
if (addLabels.length > 0) {
|
||||
await doAddLabels(owner, repo, issueNumber, addLabels.toString());
|
||||
core.info(`Actions: [set-labels-add][${addLabels}] success!`);
|
||||
}
|
||||
|
||||
core.info(`Actions: [set-labels][${labels}] success!`);
|
||||
}
|
||||
}
|
||||
|
||||
async function doUnlockIssue(owner, repo, issueNumber) {
|
||||
await octokit.issues.unlock({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
core.info(`Actions: [unlock-issue][${issueNumber}] success!`);
|
||||
};
|
||||
}
|
||||
|
||||
async function doUpdateComment (
|
||||
owner,
|
||||
repo,
|
||||
commentId,
|
||||
body,
|
||||
updateMode,
|
||||
ifUpdateBody,
|
||||
) {
|
||||
async function doUpdateComment(owner, repo, commentId, body, updateMode, ifUpdateBody) {
|
||||
const comment = await octokit.issues.getComment({
|
||||
owner,
|
||||
repo,
|
||||
comment_id: commentId
|
||||
})
|
||||
comment_id: commentId,
|
||||
});
|
||||
const comment_body = comment.data.body;
|
||||
|
||||
let params = {
|
||||
owner,
|
||||
repo,
|
||||
comment_id: commentId
|
||||
comment_id: commentId,
|
||||
};
|
||||
|
||||
if (core.getInput("body") || ifUpdateBody) {
|
||||
if (core.getInput('body') || ifUpdateBody) {
|
||||
if (updateMode === 'append') {
|
||||
params.body = `${comment_body}\n${body}`;
|
||||
} else {
|
||||
@@ -291,9 +329,9 @@ async function doUpdateComment (
|
||||
if (contents) {
|
||||
await doCreateCommentContent(owner, repo, commentId, dealStringToArr(contents));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doUpdateIssue (
|
||||
async function doUpdateIssue(
|
||||
owner,
|
||||
repo,
|
||||
issueNumber,
|
||||
@@ -302,26 +340,26 @@ async function doUpdateIssue (
|
||||
body,
|
||||
updateMode,
|
||||
assignees,
|
||||
labels
|
||||
labels,
|
||||
) {
|
||||
const issue = await octokit.issues.get({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber
|
||||
})
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
const issue_body = issue.data.body;
|
||||
const issue_title = issue.data.title;
|
||||
|
||||
let issue_labels = [];
|
||||
if (issue.data.labels.length > 0) {
|
||||
issue.data.labels.forEach(it =>{
|
||||
issue.data.labels.forEach(it => {
|
||||
issue_labels.push(it.name);
|
||||
});
|
||||
}
|
||||
|
||||
let issue_assignees = [];
|
||||
if (issue.data.assignees.length > 0) {
|
||||
issue.data.assignees.forEach(it =>{
|
||||
issue.data.assignees.forEach(it => {
|
||||
issue_assignees.push(it.login);
|
||||
});
|
||||
}
|
||||
@@ -330,13 +368,13 @@ async function doUpdateIssue (
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issueNumber,
|
||||
state
|
||||
state,
|
||||
};
|
||||
|
||||
params.title = core.getInput("title") ? title : issue_title;
|
||||
params.title = core.getInput('title') ? title : issue_title;
|
||||
|
||||
let next_body;
|
||||
if (core.getInput("body")) {
|
||||
if (core.getInput('body')) {
|
||||
if (updateMode === 'append') {
|
||||
next_body = `${issue_body}\n${body}`;
|
||||
} else {
|
||||
@@ -356,21 +394,21 @@ async function doUpdateIssue (
|
||||
if (contents) {
|
||||
await doCreateIssueContent(owner, repo, issueNumber, contents);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function doWelcome (owner, repo, assignees, labels, body) {
|
||||
async function doWelcome(owner, repo, assignees, labels, body) {
|
||||
const context = github.context;
|
||||
const isIssue = !!context.payload.issue;
|
||||
const issueContents = core.getInput("issue-contents");
|
||||
const issueContents = core.getInput('issue-contents');
|
||||
if (!isIssue) {
|
||||
core.setFailed("The event that triggered this action must be a issue. Error!");
|
||||
core.setFailed('The event that triggered this action must be a issue. Error!');
|
||||
} else {
|
||||
const auth = context.payload.sender.login;
|
||||
core.info(`Actions: [welcome: auth=][${auth}]`);
|
||||
const issueNumber = context.issue.number;
|
||||
const issues = await doQueryIssues(owner, repo, false, 'all', auth);
|
||||
if (issues.length == 0 || (issues.length == 1 && issues[0].number == issueNumber)) {
|
||||
if (core.getInput("body")) {
|
||||
if (core.getInput('body')) {
|
||||
await doCreateComment(owner, repo, issueNumber, body);
|
||||
} else {
|
||||
core.info(`Actions: [welcome] no body!`);
|
||||
@@ -391,17 +429,17 @@ async function doWelcome (owner, repo, assignees, labels, body) {
|
||||
core.info(`Actions: [welcome][${auth}] is not first time!`);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
function testContent(con) {
|
||||
if (ALLREACTIONS.includes(con)) {
|
||||
return true;
|
||||
} else {
|
||||
core.setFailed("This actions not supported!");
|
||||
core.setFailed('This actions not supported!');
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
module.exports = {
|
||||
|
@@ -104,3 +104,9 @@
|
||||
background: #fafafa;
|
||||
}
|
||||
}
|
||||
|
||||
.__dumi-default-alert {
|
||||
box-shadow: 0 6px 16px 2px rgba(0,0,0,.06) !important;
|
||||
border-radius: 2px !important;
|
||||
border: 1px solid #0000000f;
|
||||
}
|
||||
|
84
src/main.js
84
src/main.js
@@ -1,5 +1,5 @@
|
||||
const core = require("@actions/core");
|
||||
const github = require("@actions/github");
|
||||
const core = require('@actions/core');
|
||||
const github = require('@actions/github');
|
||||
|
||||
// **************************************************************************
|
||||
const {
|
||||
@@ -68,24 +68,24 @@ async function main() {
|
||||
const issueNumber = core.getInput('issue-number');
|
||||
const commentId = core.getInput('comment-id');
|
||||
|
||||
const defaultBody = `Currently at ${owner}/${repo}. And this is default comment.`
|
||||
const body = core.getInput("body") || defaultBody;
|
||||
const defaultBody = `Currently at ${owner}/${repo}. And this is default comment.`;
|
||||
const body = core.getInput('body') || defaultBody;
|
||||
|
||||
const defaultTitle = `Default Title`;
|
||||
const title = core.getInput("title") || defaultTitle;
|
||||
const title = core.getInput('title') || defaultTitle;
|
||||
|
||||
const assignees = core.getInput("assignees");
|
||||
const assignees = core.getInput('assignees');
|
||||
|
||||
const labels = core.getInput("labels");
|
||||
const state = core.getInput("state") || 'open';
|
||||
const labels = core.getInput('labels');
|
||||
const state = core.getInput('state') || 'open';
|
||||
|
||||
let updateMode = core.getInput("update-mode");
|
||||
let updateMode = core.getInput('update-mode');
|
||||
if (updateMode !== 'append') {
|
||||
updateMode = 'replace';
|
||||
}
|
||||
|
||||
// actions
|
||||
const actions = core.getInput("actions", { required: true });
|
||||
const actions = core.getInput('actions', { required: true });
|
||||
|
||||
const actionsArr = actions.split(',');
|
||||
actionsArr.forEach(item => {
|
||||
@@ -96,9 +96,9 @@ async function main() {
|
||||
if (ALLACTIONS.includes(action)) {
|
||||
choseActions(action);
|
||||
} else {
|
||||
core.setFailed("This actions not supported!");
|
||||
core.setFailed('This actions not supported!');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async function choseActions(action) {
|
||||
switch (action) {
|
||||
@@ -143,13 +143,7 @@ async function main() {
|
||||
await doUnlockIssue(owner, repo, issueNumber);
|
||||
break;
|
||||
case 'update-comment':
|
||||
await doUpdateComment(
|
||||
owner,
|
||||
repo,
|
||||
commentId,
|
||||
body,
|
||||
updateMode
|
||||
);
|
||||
await doUpdateComment(owner, repo, commentId, body, updateMode);
|
||||
break;
|
||||
case 'update-issue':
|
||||
await doUpdateIssue(
|
||||
@@ -161,70 +155,38 @@ async function main() {
|
||||
body,
|
||||
updateMode,
|
||||
assignees,
|
||||
labels
|
||||
labels,
|
||||
);
|
||||
break;
|
||||
case 'welcome':
|
||||
await doWelcome(
|
||||
owner,
|
||||
repo,
|
||||
assignees,
|
||||
labels,
|
||||
body
|
||||
);
|
||||
await doWelcome(owner, repo, assignees, labels, body);
|
||||
break;
|
||||
|
||||
// advanced
|
||||
case 'check-inactive':
|
||||
await doCheckInactive(
|
||||
owner,
|
||||
repo,
|
||||
labels
|
||||
)
|
||||
await doCheckInactive(owner, repo, labels);
|
||||
break;
|
||||
case 'check-issue':
|
||||
await doCheckIssue(
|
||||
owner,
|
||||
repo,
|
||||
issueNumber
|
||||
);
|
||||
await doCheckIssue(owner, repo, issueNumber);
|
||||
break;
|
||||
case 'close-issues':
|
||||
await doCloseIssues(
|
||||
owner,
|
||||
repo,
|
||||
labels
|
||||
)
|
||||
await doCloseIssues(owner, repo, labels);
|
||||
break;
|
||||
case 'find-comments':
|
||||
await doFindComments(
|
||||
owner,
|
||||
repo,
|
||||
issueNumber
|
||||
);
|
||||
await doFindComments(owner, repo, issueNumber);
|
||||
break;
|
||||
case 'lock-issues':
|
||||
await doLockIssues(
|
||||
owner,
|
||||
repo,
|
||||
labels
|
||||
);
|
||||
await doLockIssues(owner, repo, labels);
|
||||
break;
|
||||
case 'month-statistics':
|
||||
await doMonthStatistics(
|
||||
owner,
|
||||
repo,
|
||||
labels,
|
||||
assignees
|
||||
);
|
||||
await doMonthStatistics(owner, repo, labels, assignees);
|
||||
break;
|
||||
// default
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
catch (error) {
|
||||
}
|
||||
} catch (error) {
|
||||
core.setFailed(error.message);
|
||||
}
|
||||
}
|
||||
|
@@ -1,10 +1,8 @@
|
||||
require('dotenv').config();
|
||||
const core = require("@actions/core");
|
||||
const core = require('@actions/core');
|
||||
const { Octokit } = require('@octokit/rest');
|
||||
|
||||
const {
|
||||
getPreMonth
|
||||
} = require('./util.js');
|
||||
const { getPreMonth } = require('./util.js');
|
||||
|
||||
// **************************************************************************
|
||||
var dayjs = require('dayjs');
|
||||
@@ -19,26 +17,26 @@ const octokit = new Octokit({ auth: `token ${token}` });
|
||||
|
||||
const perPage = 100;
|
||||
|
||||
const issueCreator = core.getInput("issue-creator");
|
||||
const issueCreator = core.getInput('issue-creator');
|
||||
const issueAssignee = core.getInput('issue-assignee');
|
||||
const issueMentioned = core.getInput('issue-mentioned');
|
||||
|
||||
const bodyIncludes = core.getInput('body-includes');
|
||||
const titleIncludes = core.getInput('title-includes');
|
||||
|
||||
const inactiveDay = core.getInput("inactive-day");
|
||||
const inactiveDay = core.getInput('inactive-day');
|
||||
|
||||
// **************************************************************************
|
||||
async function doQueryIssues (owner, repo, labels, state, creator) {
|
||||
async function doQueryIssues(owner, repo, labels, state, creator) {
|
||||
let params = {
|
||||
owner,
|
||||
repo,
|
||||
state,
|
||||
};
|
||||
|
||||
issueCreator ? params.creator = issueCreator : null;
|
||||
issueAssignee ? params.assignee = issueAssignee : null;
|
||||
issueMentioned ? params.mentioned = issueMentioned : null;
|
||||
issueCreator ? (params.creator = issueCreator) : null;
|
||||
issueAssignee ? (params.assignee = issueAssignee) : null;
|
||||
issueMentioned ? (params.mentioned = issueMentioned) : null;
|
||||
|
||||
if (labels) {
|
||||
params.labels = labels;
|
||||
@@ -73,47 +71,51 @@ async function doQueryIssues (owner, repo, labels, state, creator) {
|
||||
issueNumbers.push(iss.number);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
core.info(`Actions: [query-issues]: [${JSON.stringify(issueNumbers)}]!`);
|
||||
}
|
||||
|
||||
return issues;
|
||||
};
|
||||
}
|
||||
|
||||
async function getIssues (params, page = 1) {
|
||||
async function getIssues(params, page = 1) {
|
||||
let { data: issues } = await octokit.issues.listForRepo({
|
||||
...params,
|
||||
per_page: perPage,
|
||||
page
|
||||
page,
|
||||
});
|
||||
if (issues.length >= perPage) {
|
||||
issues = issues.concat(await getIssues(params, page + 1));
|
||||
}
|
||||
return issues;
|
||||
};
|
||||
}
|
||||
|
||||
async function getIssuesInMonth (owner, repo, thisMonth, page = 1) {
|
||||
async function getIssuesInMonth(owner, repo, thisMonth, page = 1) {
|
||||
const month = getPreMonth(thisMonth);
|
||||
let { data: issues } = await octokit.issues.listForRepo({
|
||||
owner,
|
||||
repo,
|
||||
state: 'all',
|
||||
per_page: perPage,
|
||||
page
|
||||
page,
|
||||
});
|
||||
issues = issues.filter(i => {
|
||||
return i.pull_request === undefined
|
||||
return i.pull_request === undefined;
|
||||
});
|
||||
if (issues.length && getCreatedMonth(issues[issues.length - 1].created_at) >= month) {
|
||||
issues = issues.concat(await getIssuesInMonth(owner, repo, thisMonth, page + 1));
|
||||
}
|
||||
return issues;
|
||||
};
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
function getCreatedMonth (d) {
|
||||
return dayjs(d).utc().month() + 1;
|
||||
};
|
||||
function getCreatedMonth(d) {
|
||||
return (
|
||||
dayjs(d)
|
||||
.utc()
|
||||
.month() + 1
|
||||
);
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
module.exports = {
|
||||
|
43
src/util.js
43
src/util.js
@@ -1,6 +1,6 @@
|
||||
const sampleSize = require('lodash/sampleSize');
|
||||
const sampleSize = require('lodash/sampleSize');
|
||||
|
||||
function dealStringToArr (para) {
|
||||
function dealStringToArr(para) {
|
||||
/**
|
||||
* in 'x1,x2,x3'
|
||||
* out ['x1','x2','x3']
|
||||
@@ -9,29 +9,29 @@ function dealStringToArr (para) {
|
||||
if (para) {
|
||||
const paraArr = para.split(',');
|
||||
paraArr.forEach(it => {
|
||||
if(it.trim()){
|
||||
arr.push(it.trim())
|
||||
if (it.trim()) {
|
||||
arr.push(it.trim());
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
return arr;
|
||||
};
|
||||
}
|
||||
|
||||
function dealRandomAssignees (assignees, randomTo) {
|
||||
function dealRandomAssignees(assignees, randomTo) {
|
||||
let arr = dealStringToArr(assignees);
|
||||
if (randomTo && Number(randomTo) > 0 && Number(randomTo) < arr.length) {
|
||||
arr = sampleSize(arr, randomTo);
|
||||
}
|
||||
return arr;
|
||||
};
|
||||
}
|
||||
|
||||
function matchKeyword (content, keywords) {
|
||||
function matchKeyword(content, keywords) {
|
||||
return keywords.find(item => content.toLowerCase().includes(item));
|
||||
};
|
||||
}
|
||||
|
||||
function testDuplicate(body) {
|
||||
if (!body || !body.startsWith('Duplicate of')) {
|
||||
return false
|
||||
return false;
|
||||
}
|
||||
|
||||
let arr = body.split(' ');
|
||||
@@ -40,16 +40,29 @@ function testDuplicate(body) {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function getPreMonth (m) {
|
||||
return m == 1 ? 12 : m -1;
|
||||
};
|
||||
function getPreMonth(m) {
|
||||
return m == 1 ? 12 : m - 1;
|
||||
}
|
||||
|
||||
function checkPermission(require, permission) {
|
||||
/**
|
||||
* 有权限返回 true
|
||||
*/
|
||||
const permissions = ['none', 'read', 'write', 'admin'];
|
||||
const requireNo = permissions.indexOf(require);
|
||||
const permissionNo = permissions.indexOf(permission);
|
||||
|
||||
return requireNo <= permissionNo;
|
||||
}
|
||||
|
||||
// **********************************************************
|
||||
module.exports = {
|
||||
dealStringToArr,
|
||||
dealRandomAssignees,
|
||||
getPreMonth,
|
||||
matchKeyword,
|
||||
testDuplicate,
|
||||
checkPermission,
|
||||
};
|
||||
|
Reference in New Issue
Block a user