Skip to content

Commit

Permalink
Merge bf92708 into 4da5f41
Browse files Browse the repository at this point in the history
  • Loading branch information
xuexb committed Jan 21, 2018
2 parents 4da5f41 + bf92708 commit 46b0667
Show file tree
Hide file tree
Showing 14 changed files with 428 additions and 346 deletions.
30 changes: 26 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,32 @@
]
},
"github-bot": {
"labelToAuthor": {
"bug": "xuexb",
"enhancement": "xuexb",
"question": "xuexb"
"github-bot": {
"issue": {
"replyNeedDemo": {
"enabled": true,
"data": {
"need demo": "您好,请填写相关 Demo 链接。",
"need update package": "请更新版本号。"
}
},
"autoAssign": {
"enabled": true,
"data": {
"bug": "xuexb",
"enhancement": "xuexb",
"question": "xuexb"
}
}
},
"pullRequest": {
"labelToReviewer": {
"enabled": true,
"data": {
"bug": "xuexb"
}
}
}
}
}
},
Expand Down
54 changes: 49 additions & 5 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
const requireDir = require('require-dir')
const { verifySignature } = require('./utils')
const issueActions = requireDir('./modules/issues')
const pullRequestActions = requireDir('./modules/pull_request')
const releasesActions = requireDir('./modules/releases')
const app = new Koa()
const githubEvent = new EventEmitter()
const { appLog, accessLog } = require('./logger')
const pkg = require('../package.json')

pkg.config = pkg.config || {}
pkg.config['github-bot'] = pkg.config['github-bot'] || {}

app.use(bodyParser())

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

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

githubEvent.emit(eventName, {
githubEvent.emit(`${payload.repository.full_name}@${eventName}`, {
repo: payload.repository.name,
payload
})
Expand All @@ -42,7 +43,50 @@ app.use(ctx => {
}
})

const actions = Object.assign({}, issueActions, pullRequestActions, releasesActions)
const events = {
uid: 0
}
const actions = Object.assign(
{},
requireDir('./modules/issues'),
requireDir('./modules/pullRequest'),
requireDir('./modules/releases')
)
Object.keys(actions).forEach(key => {
const name = actions[key].name
if (events[name]) {
appLog.error(`${name} is existed`)
return
}
events[name] = actions[key].register
})
Object.keys(pkg.config['github-bot']).forEach(repo => {
Object.keys(pkg.config['github-bot'][repo]).forEach(type => {
Object.keys(pkg.config['github-bot'][repo][type]).forEach(name => {
const config = pkg.config['github-bot'][repo][type][name]
const register = events[`${type}/${name}`]
if (config.enabled === true && register) {
register((eventName, callback) => {
const uid = events.uid++
githubEvent.on(`${repo}@${eventName}@source@${uid}`, data => {
callback(data, {
config: pkg.config['github-bot'][repo],
scope: config.data || {}
})
})
githubEvent.on(`${repo}@${eventName}`, data => {
githubEvent.emit(`${repo}@${eventName}@source@${uid}`, data)
})
})
} else if (config.enabled !== true) {
appLog.info(`pkg.config.github-bot.${repo}.${type}.${name} is not enabled.`)
} else {
appLog.info(`pkg.config.github-bot.${repo}.${type}.${name} is config error.`)
}
})
})
})

Object.keys(actions).forEach((key) => {
actions[key](githubEvent.on.bind(githubEvent))
appLog.info(`bind ${key} success!`)
Expand Down
23 changes: 12 additions & 11 deletions src/modules/issues/autoAssign.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ const { addAssigneesToIssue } = require('../../github')
const config = getPkgConfig()
const assignMap = config.labelToAuthor || {}

function autoAssign (on) {
on('issues_labeled', ({ payload, repo }) => {
if (assignMap[payload.label.name]) {
addAssigneesToIssue(
payload,
assignMap[payload.label.name]
)
}
})
module.exports = {
name: 'issue/autoAssign',
register (on) {
on('issues_labeled', ({ payload, repo }) => {
if (assignMap[payload.label.name]) {
addAssigneesToIssue(
payload,
assignMap[payload.label.name]
)
}
})
}
}

module.exports = autoAssign
19 changes: 10 additions & 9 deletions src/modules/issues/autoLabel.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@

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

function autoAssign (on) {
on('issues_opened', ({ payload, repo }) => {
const label = (payload.issue.body.match(/<!--\s*label:\s*(.+?)\s*-->/) || [])[1]
if (label) {
addLabelsToIssue(payload, label)
}
})
module.exports = {
name: 'issue/autoLabel',
register (on) {
on('issues_opened', ({ payload, repo }) => {
const label = (payload.issue.body.match(/<!--\s*label:\s*(.+?)\s*-->/) || [])[1]
if (label) {
addLabelsToIssue(payload, label)
}
})
}
}

module.exports = autoAssign
35 changes: 18 additions & 17 deletions src/modules/issues/replyInvalid.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,24 @@ const comment = [
'但是由于您没有使用 [创建 issue](https://xuexb.github.io/github-bot/create-issue.html) 页面提交, 将直接被关闭, 谢谢!'
].join('')

function replyInvalid (on) {
on('issues_opened', ({ payload }) => {
const issue = payload.issue
const opener = issue.user.login
module.exports = {
name: 'issue/replyInvalid',
register (on) {
on('issues_opened', ({ payload }) => {
const issue = payload.issue
const opener = issue.user.login

if (issue.body.indexOf('<!-- by create-issue -->') === -1) {
commentIssue(
payload,
format(comment, {
user: opener
})
)
if (issue.body.indexOf('<!-- by create-issue -->') === -1) {
commentIssue(
payload,
format(comment, {
user: opener
})
)

closeIssue(payload)
addLabelsToIssue(payload, 'invalid')
}
})
closeIssue(payload)
addLabelsToIssue(payload, 'invalid')
}
})
}
}

module.exports = replyInvalid
27 changes: 14 additions & 13 deletions src/modules/issues/replyNeedDemo.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@ const { commentIssue } = require('../../github')

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

function replyNeedDemo (on) {
on('issues_labeled', ({ payload, repo }) => {
if (payload.label.name === 'need demo') {
commentIssue(
payload,
format(comment, {
user: payload.issue.user.login
})
)
}
})
module.exports = {
name: 'issue/replyNeedDemo',
register (on) {
on('issues_labeled', ({ payload, repo }) => {
if (payload.label.name === 'need demo') {
commentIssue(
payload,
format(comment, {
user: payload.issue.user.login
})
)
}
})
}
}

module.exports = replyNeedDemo
26 changes: 26 additions & 0 deletions src/modules/pullRequest/autoReviewRequest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* @file PR 自动根据 tag 去添加 reviewer
* @author xuexb <fe.xiaowu@gmail.com>
*/

const { getPkgConfig } = require('../../utils')
const { createReviewRequest } = require('../../github')

const config = getPkgConfig()
const assignMap = config.labelToAuthor || {}

module.exports = {
name: 'pullRequest/autoReviewRequest',
register (on) {
on('pull_request_labeled', ({payload}) => {
if (assignMap[payload.label.name]) {
createReviewRequest(
payload,
{
reviewers: assignMap[payload.label.name]
}
)
}
})
}
}
61 changes: 61 additions & 0 deletions src/modules/pullRequest/replyInvalidTitle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* @file PR 提示标题正确性
* @author xuexb <fe.xiaowu@gmail.com>
*/

const format = require('string-template')
const { getPkgCommitPrefix } = require('../../utils')
const {
commentPullRequest,
addLabelsToPullRequest,
removeLabelsToPullRequest,
pullRequestHasLabel
} = require('../../github')

const actions = getPkgCommitPrefix()
const match = title => {
return actions.some(action => title.indexOf(`${action}:`) === 0)
}

const commentSuccess = [
'hi @{user},非常感谢您及时修正标题格式,祝您玩的开心!'
].join('')

const commentError = [
'hi @{user},非常感谢您的 PR ,',
'但是您没有使用 [PR 标题规则](https://github.com/xuexb/github-bot#commit-log-和-pr-标题规则) 格式,',
'请及时修改, 谢谢!'
].join('')

module.exports = {
name: 'pullRequest/replyInvaidTitle',
register (on) {
if (actions.length) {
on('pull_request_opened', ({ payload, repo }) => {
if (!match(payload.pull_request.title)) {
commentPullRequest(
payload,
format(commentError, {
user: payload.pull_request.user.login
})
)

addLabelsToPullRequest(payload, 'invalid')
}
})

on('pull_request_edited', async ({ payload, repo }) => {
if (match(payload.pull_request.title) && await pullRequestHasLabel(payload, 'invalid')) {
commentPullRequest(
payload,
format(commentSuccess, {
user: payload.pull_request.user.login
})
)

removeLabelsToPullRequest(payload, 'invalid')
}
})
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@ const handle = async ({ payload, repo }) => {
}
}

module.exports = on => {
on('pull_request_edited', handle)
on('pull_request_opened', handle)
module.exports = {
name: 'pullRequest/titlePrefixToLabel',
register (on) {
on('pull_request_edited', handle)
on('pull_request_opened', handle)
}
}
23 changes: 0 additions & 23 deletions src/modules/pull_request/autoReviewRequest.js

This file was deleted.

0 comments on commit 46b0667

Please sign in to comment.