Skip to content

Commit a24da27

Browse files
committed
First shot at actually resolving labels w/tests.
Needs more work: - doesn't handle any C++ changes - changes to ./lib/_*.js and ./lib/internal has to be mapped manually, e.g. currently changes to ./lib/_stream_readable.js would be resolved to a "_stream_readable" label
1 parent 98c4562 commit a24da27

File tree

5 files changed

+92
-16
lines changed

5 files changed

+92
-16
lines changed

lib/githubClient.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
const GitHub = require('github')
44

5+
const token = process.env.GITHUB_TOKEN || ''
6+
57
const githubClient = new GitHub({
68
version: '3.0.0',
79
protocol: 'https',
@@ -12,9 +14,11 @@ const githubClient = new GitHub({
1214
}
1315
})
1416

15-
githubClient.authenticate({
16-
type: 'oauth',
17-
token: process.env.GITHUB_TOKEN
18-
})
17+
if (token) {
18+
githubClient.authenticate({
19+
type: 'oauth',
20+
token: token
21+
})
22+
}
1923

20-
module.exports = githubClient;
24+
module.exports = githubClient

lib/nodeRepo.js

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
'use strict'
22

3+
const path = require('path')
4+
35
const githubClient = require('./githubClient')
46

5-
function resolvePrLabels(prId, cb) {
7+
function findLabelsForPr (prId, cb) {
68
githubClient.pullRequests.getFiles({
79
user: 'nodejs',
810
repo: 'node',
@@ -12,10 +14,43 @@ function resolvePrLabels(prId, cb) {
1214
return cb(err)
1315
}
1416

15-
const filenamesChanged = res.map((fileMeta) => fileMeta.filename)
17+
const filepathsChanged = res.map((fileMeta) => fileMeta.filename)
1618

17-
cb(err, filenamesChanged)
19+
cb(err, resolveLabels(filepathsChanged))
1820
})
1921
}
2022

21-
exports.resolvePrLabels = resolvePrLabels;
23+
function resolveLabels (filepathsChanged) {
24+
const affectedRootDirs = filepathsChanged.reduce(reduceToRootDirs, {})
25+
let labels = []
26+
27+
if (isOnlyTests(affectedRootDirs)) {
28+
labels.push('test')
29+
} else if (hasCoreModules(affectedRootDirs)) {
30+
labels.push.apply(labels, coreModuleLabels(filepathsChanged))
31+
}
32+
33+
return labels
34+
}
35+
36+
function coreModuleLabels (filepathsChanged) {
37+
return filepathsChanged.filter((filepath) => filepath.startsWith('lib'))
38+
.map((filepath) => path.basename(filepath, '.js'))
39+
}
40+
41+
function hasCoreModules (affectedRootDirs) {
42+
return !!affectedRootDirs.lib
43+
}
44+
45+
function isOnlyTests (affectedRootDirs) {
46+
return affectedRootDirs.test && Object.keys(affectedRootDirs).length === 1
47+
}
48+
49+
function reduceToRootDirs (dirs, filepath) {
50+
const rootDirForFile = filepath.split(path.sep)[0]
51+
dirs[rootDirForFile] = true
52+
return dirs
53+
}
54+
55+
exports.findLabelsForPr = findLabelsForPr
56+
exports.resolveLabels = resolveLabels

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"description": "Node.js GitHub Bot",
55
"scripts": {
66
"start": "node server.js",
7-
"test": "standard"
7+
"test": "standard && tap test/*.test.js",
8+
"test:watch": "nodemon -q -x 'npm test'"
89
},
910
"engines": {
1011
"node": ">= 4.2.0"
@@ -20,6 +21,9 @@
2021
"travis-ci": "^2.1.0"
2122
},
2223
"devDependencies": {
23-
"standard": "^6.0.7"
24+
"ava": "^0.14.0",
25+
"nodemon": "^1.9.1",
26+
"standard": "^6.0.7",
27+
"tap": "^5.7.1"
2428
}
2529
}

server.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ require('dotenv').load({ silent: true })
55
const express = require('express')
66
const bodyParser = require('body-parser')
77

8-
const pollTravis = require('./lib/pollTravis')
98
const nodeRepo = require('./lib/nodeRepo')
109

1110
const captureRaw = (req, res, buffer) => { req.raw = buffer }
@@ -27,10 +26,14 @@ app.listen(port, () => {
2726
})
2827

2928
app.get('/labels/:prId', (req, res) => {
30-
nodeRepo.resolvePrLabels(req.params.prId, (err, labels) => {
31-
const statusCode = err ? 500 : 200;
29+
nodeRepo.findLabelsForPr(req.params.prId, (err, labels) => {
30+
let statusCode = 200
3231

33-
res.json(labels)
34-
res.status(statusCode).end()
32+
if (err) {
33+
statusCode = 500
34+
console.log('Error while finding labels', err)
35+
}
36+
37+
res.status(statusCode).json(labels)
3538
})
3639
})

test/nodeRepo.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict'
2+
3+
const tap = require('tap')
4+
5+
const nodeRepo = require('../lib/nodeRepo')
6+
7+
tap.test('label: "test" when only ./test/ files has been changed', (t) => {
8+
const labels = nodeRepo.resolveLabels([
9+
'test/debugger/test-debugger-pid.js',
10+
'test/debugger/test-debugger-repl-break-in-module.js',
11+
'test/debugger/test-debugger-repl-term.js'
12+
])
13+
14+
t.same(labels, ['test'])
15+
16+
t.end()
17+
})
18+
19+
tap.test('label: "repl" when ./lib/repl.js has been changed', (t) => {
20+
const labels = nodeRepo.resolveLabels([
21+
'lib/repl.js',
22+
'test/debugger/test-debugger-pid.js',
23+
'test/debugger/test-debugger-repl-break-in-module.js',
24+
'test/debugger/test-debugger-repl-term.js'
25+
])
26+
27+
t.same(labels, ['repl'])
28+
29+
t.end()
30+
})

0 commit comments

Comments
 (0)