Skip to content

Commit 4bdb7b5

Browse files
committed
fix: #45
1 parent 4da5f41 commit 4bdb7b5

File tree

14 files changed

+425
-346
lines changed

14 files changed

+425
-346
lines changed

package.json

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,32 @@
5353
]
5454
},
5555
"github-bot": {
56-
"labelToAuthor": {
57-
"bug": "xuexb",
58-
"enhancement": "xuexb",
59-
"question": "xuexb"
56+
"github-bot": {
57+
"issue": {
58+
"replyNeedDemo": {
59+
"enabled": true,
60+
"data": {
61+
"need demo": "您好,请填写相关 Demo 链接。",
62+
"need update package": "请更新版本号。"
63+
}
64+
},
65+
"autoAssign": {
66+
"enabled": true,
67+
"data": {
68+
"bug": "xuexb",
69+
"enhancement": "xuexb",
70+
"question": "xuexb"
71+
}
72+
}
73+
},
74+
"pullRequest": {
75+
"labelToReviewer": {
76+
"enabled": true,
77+
"data": {
78+
"bug": "xuexb"
79+
}
80+
}
81+
}
6082
}
6183
}
6284
},

src/app.js

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ const Koa = require('koa')
1010
const bodyParser = require('koa-bodyparser')
1111
const requireDir = require('require-dir')
1212
const { verifySignature } = require('./utils')
13-
const issueActions = requireDir('./modules/issues')
14-
const pullRequestActions = requireDir('./modules/pull_request')
15-
const releasesActions = requireDir('./modules/releases')
1613
const app = new Koa()
1714
const githubEvent = new EventEmitter()
1815
const { appLog, accessLog } = require('./logger')
16+
const pkg = require('../package.json')
17+
18+
pkg.config = pkg.config || {}
19+
pkg.config['github-bot'] = pkg.config['github-bot'] || {}
1920

2021
app.use(bodyParser())
2122

@@ -31,7 +32,7 @@ app.use(ctx => {
3132

3233
accessLog.info(`receive event: ${eventName}`)
3334

34-
githubEvent.emit(eventName, {
35+
githubEvent.emit(`${payload.repository.full_name}@${eventName}`, {
3536
repo: payload.repository.name,
3637
payload
3738
})
@@ -42,7 +43,47 @@ app.use(ctx => {
4243
}
4344
})
4445

45-
const actions = Object.assign({}, issueActions, pullRequestActions, releasesActions)
46+
const events = {}
47+
const actions = Object.assign(
48+
{},
49+
requireDir('./modules/issues'),
50+
requireDir('./modules/pullRequest'),
51+
requireDir('./modules/releases')
52+
)
53+
Object.keys(actions).forEach(key => {
54+
const name = actions[key].name
55+
if (events[name]) {
56+
appLog.error(`${name} is existed`)
57+
return
58+
}
59+
events[name] = actions[key].register
60+
})
61+
Object.keys(pkg.config['github-bot']).forEach(repo => {
62+
Object.keys(pkg.config['github-bot'][repo]).forEach(type => {
63+
Object.keys(pkg.config['github-bot'][repo][type]).forEach(name => {
64+
const config = pkg.config['github-bot'][repo][type][name]
65+
const register = events[`${type}/${name}`]
66+
if (config.enabled === true && register) {
67+
register((eventName, callback) => {
68+
githubEvent.on(`${repo}@${eventName}@source`, data => {
69+
callback(data, {
70+
config: pkg.config['github-bot'][repo],
71+
scope: config.data || {}
72+
})
73+
})
74+
githubEvent.on(`${repo}@${eventName}`, data => {
75+
githubEvent.emit(`${repo}@${eventName}@source`, data)
76+
})
77+
})
78+
} else if (config.enabled !== true) {
79+
appLog.info(`pkg.config.github-bot.${repo}.${type}.${name} is not enabled.`)
80+
} else {
81+
appLog.info(`pkg.config.github-bot.${repo}.${type}.${name} is config error.`)
82+
}
83+
})
84+
})
85+
})
86+
4687
Object.keys(actions).forEach((key) => {
4788
actions[key](githubEvent.on.bind(githubEvent))
4889
appLog.info(`bind ${key} success!`)

src/modules/issues/autoAssign.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ const { addAssigneesToIssue } = require('../../github')
99
const config = getPkgConfig()
1010
const assignMap = config.labelToAuthor || {}
1111

12-
function autoAssign (on) {
13-
on('issues_labeled', ({ payload, repo }) => {
14-
if (assignMap[payload.label.name]) {
15-
addAssigneesToIssue(
16-
payload,
17-
assignMap[payload.label.name]
18-
)
19-
}
20-
})
12+
module.exports = {
13+
name: 'issue/autoAssign',
14+
register (on) {
15+
on('issues_labeled', ({ payload, repo }) => {
16+
if (assignMap[payload.label.name]) {
17+
addAssigneesToIssue(
18+
payload,
19+
assignMap[payload.label.name]
20+
)
21+
}
22+
})
23+
}
2124
}
22-
23-
module.exports = autoAssign

src/modules/issues/autoLabel.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
const { addLabelsToIssue } = require('../../github')
77

8-
function autoAssign (on) {
9-
on('issues_opened', ({ payload, repo }) => {
10-
const label = (payload.issue.body.match(/<!--\s*label:\s*(.+?)\s*-->/) || [])[1]
11-
if (label) {
12-
addLabelsToIssue(payload, label)
13-
}
14-
})
8+
module.exports = {
9+
name: 'issue/autoLabel',
10+
register (on) {
11+
on('issues_opened', ({ payload, repo }) => {
12+
const label = (payload.issue.body.match(/<!--\s*label:\s*(.+?)\s*-->/) || [])[1]
13+
if (label) {
14+
addLabelsToIssue(payload, label)
15+
}
16+
})
17+
}
1518
}
16-
17-
module.exports = autoAssign

src/modules/issues/replyInvalid.js

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,24 @@ const comment = [
1515
'但是由于您没有使用 [创建 issue](https://xuexb.github.io/github-bot/create-issue.html) 页面提交, 将直接被关闭, 谢谢!'
1616
].join('')
1717

18-
function replyInvalid (on) {
19-
on('issues_opened', ({ payload }) => {
20-
const issue = payload.issue
21-
const opener = issue.user.login
18+
module.exports = {
19+
name: 'issue/replyInvalid',
20+
register (on) {
21+
on('issues_opened', ({ payload }) => {
22+
const issue = payload.issue
23+
const opener = issue.user.login
2224

23-
if (issue.body.indexOf('<!-- by create-issue -->') === -1) {
24-
commentIssue(
25-
payload,
26-
format(comment, {
27-
user: opener
28-
})
29-
)
25+
if (issue.body.indexOf('<!-- by create-issue -->') === -1) {
26+
commentIssue(
27+
payload,
28+
format(comment, {
29+
user: opener
30+
})
31+
)
3032

31-
closeIssue(payload)
32-
addLabelsToIssue(payload, 'invalid')
33-
}
34-
})
33+
closeIssue(payload)
34+
addLabelsToIssue(payload, 'invalid')
35+
}
36+
})
37+
}
3538
}
36-
37-
module.exports = replyInvalid

src/modules/issues/replyNeedDemo.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ const { commentIssue } = require('../../github')
88

99
const comment = 'hi @{user},请提供一个可预览的链接,如: <https://codepen.io/pen?template=KgPZrE&editors=0010>'
1010

11-
function replyNeedDemo (on) {
12-
on('issues_labeled', ({ payload, repo }) => {
13-
if (payload.label.name === 'need demo') {
14-
commentIssue(
15-
payload,
16-
format(comment, {
17-
user: payload.issue.user.login
18-
})
19-
)
20-
}
21-
})
11+
module.exports = {
12+
name: 'issue/replyNeedDemo',
13+
register (on) {
14+
on('issues_labeled', ({ payload, repo }) => {
15+
if (payload.label.name === 'need demo') {
16+
commentIssue(
17+
payload,
18+
format(comment, {
19+
user: payload.issue.user.login
20+
})
21+
)
22+
}
23+
})
24+
}
2225
}
23-
24-
module.exports = replyNeedDemo
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @file PR 自动根据 tag 去添加 reviewer
3+
* @author xuexb <[email protected]>
4+
*/
5+
6+
const { getPkgConfig } = require('../../utils')
7+
const { createReviewRequest } = require('../../github')
8+
9+
const config = getPkgConfig()
10+
const assignMap = config.labelToAuthor || {}
11+
12+
module.exports = {
13+
name: 'pullRequest/autoReviewRequest',
14+
register (on) {
15+
on('pull_request_labeled', ({payload}) => {
16+
if (assignMap[payload.label.name]) {
17+
createReviewRequest(
18+
payload,
19+
{
20+
reviewers: assignMap[payload.label.name]
21+
}
22+
)
23+
}
24+
})
25+
}
26+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* @file PR 提示标题正确性
3+
* @author xuexb <[email protected]>
4+
*/
5+
6+
const format = require('string-template')
7+
const { getPkgCommitPrefix } = require('../../utils')
8+
const {
9+
commentPullRequest,
10+
addLabelsToPullRequest,
11+
removeLabelsToPullRequest,
12+
pullRequestHasLabel
13+
} = require('../../github')
14+
15+
const actions = getPkgCommitPrefix()
16+
const match = title => {
17+
return actions.some(action => title.indexOf(`${action}:`) === 0)
18+
}
19+
20+
const commentSuccess = [
21+
'hi @{user},非常感谢您及时修正标题格式,祝您玩的开心!'
22+
].join('')
23+
24+
const commentError = [
25+
'hi @{user},非常感谢您的 PR ,',
26+
'但是您没有使用 [PR 标题规则](https://github.com/xuexb/github-bot#commit-log-和-pr-标题规则) 格式,',
27+
'请及时修改, 谢谢!'
28+
].join('')
29+
30+
module.exports = {
31+
name: 'pullRequest/replyInvaidTitle',
32+
register (on) {
33+
if (actions.length) {
34+
on('pull_request_opened', ({ payload, repo }) => {
35+
if (!match(payload.pull_request.title)) {
36+
commentPullRequest(
37+
payload,
38+
format(commentError, {
39+
user: payload.pull_request.user.login
40+
})
41+
)
42+
43+
addLabelsToPullRequest(payload, 'invalid')
44+
}
45+
})
46+
47+
on('pull_request_edited', async ({ payload, repo }) => {
48+
if (match(payload.pull_request.title) && await pullRequestHasLabel(payload, 'invalid')) {
49+
commentPullRequest(
50+
payload,
51+
format(commentSuccess, {
52+
user: payload.pull_request.user.login
53+
})
54+
)
55+
56+
removeLabelsToPullRequest(payload, 'invalid')
57+
}
58+
})
59+
}
60+
}
61+
}

src/modules/pull_request/titlePrefixToLabel.js renamed to src/modules/pullRequest/titlePrefixToLabel.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ const handle = async ({ payload, repo }) => {
2828
}
2929
}
3030

31-
module.exports = on => {
32-
on('pull_request_edited', handle)
33-
on('pull_request_opened', handle)
31+
module.exports = {
32+
name: 'pullRequest/titlePrefixToLabel',
33+
register (on) {
34+
on('pull_request_edited', handle)
35+
on('pull_request_opened', handle)
36+
}
3437
}

src/modules/pull_request/autoReviewRequest.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)