diff --git a/CHANGELOG.md b/CHANGELOG.md index a178c82..9453e33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 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` diff --git a/README.en-US.md b/README.en-US.md index 67a00c8..922f862 100644 --- a/README.en-US.md +++ b/README.en-US.md @@ -365,6 +365,9 @@ 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) @@ -400,15 +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 | ✖ | -| allow-permissions | Permission to operate | string | ✖ | +| require-permission | Permission required | string | ✖ | - `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 -- `allow-permissions`: When you do not input, there is no limit. Anyone comment will trigger. 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 +- `require-permission`: When you do not input, there is no limit. Anyone comment will trigger. 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) @@ -860,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` diff --git a/README.md b/README.md index 7c73a2e..f7613b4 100644 --- a/README.md +++ b/README.md @@ -365,6 +365,9 @@ jobs: | actions | 操作类型 | string | ✔ | | token | [token 说明](#token) | string | ✔ | | issue-number | 指定的 issue | number | ✔ | +| lock-reason | 锁定 issue 的原因 | string | ✖ | + +- `lock-reason`:可选值有 `off-topic` `too heated` `resolved` `spam` ⏫ [返回列表](#列-表) @@ -400,15 +403,16 @@ jobs: | labels | 替换该 issue 的 labels | string | ✖ | | contents | 为该评论的增加 [reaction](#reactions-types) | string | ✖ | | close-issue | 是否同时关闭该 issue | string | ✖ | -| allow-permissions | 允许操作的权限 | string | ✖ | +| require-permission | 要求权限 | string | ✖ | - `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?` - `labels`:优先级最高 - `close-issue`:`true` 或 `'true'` 均可生效 -- `allow-permissions`:当不输时,即无限制。任何人评论都会触发。可选值有 `admin`,`write`,`read`,`none` - - 团队成员若设置 read 权限,则为 read - - 外部 Collaborator 若设置 read 权限,则为 read - - 普通用户为 read 权限 +- `require-permission`:当不输时,即无限制,任何人评论都会触发。可选值有 `admin`,`write`,`read`,`none` + - 团队成员若设置 `read` 权限,则为 `read` + - 外部 Collaborator 若设置 `read` 权限,则为 `read` + - 普通用户为 `read` 权限 + - 当设置 `write` 后,`admin` 和 `write` 满足条件 ⏫ [返回列表](#列-表) @@ -854,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` diff --git a/action.yml b/action.yml index 5df93dd..36df7dd 100644 --- a/action.yml +++ b/action.yml @@ -52,13 +52,15 @@ 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' - allow-permissions: + require-permission: description: 'Only the allow can do. Possible admin, write, read, and none.' remove-labels: description: 'For remove labels' diff --git a/dist/index.js b/dist/index.js index 50781ba..8e90dd0 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7871,7 +7871,12 @@ const ALLREACTIONS = ['+1', '-1', 'laugh', 'confused', 'heart', 'hooray', 'rocke const { doQueryIssues } = __webpack_require__(197); -const { dealStringToArr, dealRandomAssignees, testDuplicate } = __webpack_require__(6254); +const { + dealStringToArr, + dealRandomAssignees, + testDuplicate, + checkPermission, +} = __webpack_require__(6254); // ************************************************************************** const token = core.getInput('token'); @@ -7990,11 +7995,17 @@ async function doDeleteComment(owner, repo, commentId) { } async function doLockIssue(owner, repo, issueNumber) { - await octokit.issues.lock({ + 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!`); } @@ -8009,7 +8020,7 @@ async function doMarkDuplicate(owner, repo, labels) { const duplicateLabels = core.getInput('duplicate-labels'); const removeLables = core.getInput('remove-labels'); const closeIssue = core.getInput('close-issue'); - const allowPermissions = core.getInput('allow-permissions'); + const requirePermission = core.getInput('require-permission'); const commentId = context.payload.comment.id; const commentBody = context.payload.comment.body; @@ -8018,14 +8029,14 @@ async function doMarkDuplicate(owner, repo, labels) { const ifCommandInput = !!duplicateCommand; - if (allowPermissions) { + if (requirePermission) { const res = await octokit.repos.getCollaboratorPermissionLevel({ owner, repo, username: commentUser, }); const { permission } = res.data; - if (!allowPermissions.includes(permission)) { + if (!checkPermission(requirePermission, permission)) { core.info(`The user ${commentUser} is not allow!`); return false; } @@ -8706,12 +8717,25 @@ 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, }; diff --git a/docs/advanced.en-US.md b/docs/advanced.en-US.md index 556090b..bd3bb1d 100644 --- a/docs/advanced.en-US.md +++ b/docs/advanced.en-US.md @@ -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` diff --git a/docs/advanced.md b/docs/advanced.md index c4ecf1e..4a74e3c 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -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` diff --git a/docs/base.en-US.md b/docs/base.en-US.md index 09b75f7..1a89757 100644 --- a/docs/base.en-US.md +++ b/docs/base.en-US.md @@ -231,6 +231,9 @@ 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` @@ -264,15 +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 | ✖ | -| allow-permissions | Permission to operate | string | ✖ | +| require-permission | Permission required | string | ✖ | - `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 -- `allow-permissions`: When you do not input, there is no limit. Anyone comment will trigger. 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 +- `require-permission`: When you do not input, there is no limit. Anyone comment will trigger. 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 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. diff --git a/docs/base.md b/docs/base.md index 454e158..142d355 100644 --- a/docs/base.md +++ b/docs/base.md @@ -231,6 +231,9 @@ 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` @@ -264,15 +267,16 @@ jobs: | labels | 替换该 issue 的 labels | string | ✖ | | contents | 为该评论的增加 [reaction](/guide/ref#-reactions-类型) | string | ✖ | | close-issue | 是否同时关闭该 issue | string | ✖ | -| allow-permissions | 允许操作的权限 | string | ✖ | +| require-permission | 要求权限 | string | ✖ | - `duplicate-command`:当设置简洁命令时,同时仍支持原有 `Duplicate of`。屏蔽内容包含 `?` - `labels`:优先级最高 - `close-issue`:`true` 或 `'true'` 均可生效 -- `allow-permissions`:当不输时,即无限制。任何人评论都会触发。可选值有 `admin`,`write`,`read`,`none` - - 团队成员若设置 read 权限,则为 read - - 外部 Collaborator 若设置 read 权限,则为 read - - 普通用户为 read 权限 +- `require-permission`:当不输时,即无限制,任何人评论都会触发。可选值有 `admin`,`write`,`read`,`none` + - 团队成员若设置 `read` 权限,则为 `read` + - 外部 Collaborator 若设置 `read` 权限,则为 `read` + - 普通用户为 `read` 权限 + - 当设置 `write` 后,`admin` 和 `write` 满足条件 注意:使用简洁命令创建的 Duplicate 不显示下图红框内容。但其实这个没有任何影响的。 diff --git a/package.json b/package.json index d0bd327..c084a23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "issues-helper", - "version": "1.11.0", + "version": "1.12.0", "private": true, "description": "Some operations on issue.", "main": "src/main.js", diff --git a/src/base.js b/src/base.js index 59770e4..0e5d4a6 100644 --- a/src/base.js +++ b/src/base.js @@ -8,7 +8,12 @@ const ALLREACTIONS = ['+1', '-1', 'laugh', 'confused', 'heart', 'hooray', 'rocke const { doQueryIssues } = require('./public.js'); -const { dealStringToArr, dealRandomAssignees, testDuplicate } = require('./util.js'); +const { + dealStringToArr, + dealRandomAssignees, + testDuplicate, + checkPermission, +} = require('./util.js'); // ************************************************************************** const token = core.getInput('token'); @@ -127,11 +132,17 @@ async function doDeleteComment(owner, repo, commentId) { } async function doLockIssue(owner, repo, issueNumber) { - await octokit.issues.lock({ + 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!`); } @@ -146,7 +157,7 @@ async function doMarkDuplicate(owner, repo, labels) { const duplicateLabels = core.getInput('duplicate-labels'); const removeLables = core.getInput('remove-labels'); const closeIssue = core.getInput('close-issue'); - const allowPermissions = core.getInput('allow-permissions'); + const requirePermission = core.getInput('require-permission'); const commentId = context.payload.comment.id; const commentBody = context.payload.comment.body; @@ -155,14 +166,14 @@ async function doMarkDuplicate(owner, repo, labels) { const ifCommandInput = !!duplicateCommand; - if (allowPermissions) { + if (requirePermission) { const res = await octokit.repos.getCollaboratorPermissionLevel({ owner, repo, username: commentUser, }); const { permission } = res.data; - if (!allowPermissions.includes(permission)) { + if (!checkPermission(requirePermission, permission)) { core.info(`The user ${commentUser} is not allow!`); return false; } diff --git a/src/util.js b/src/util.js index f76e466..3904384 100644 --- a/src/util.js +++ b/src/util.js @@ -46,10 +46,23 @@ 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, };