Skip to content

Commit 6fdd91f

Browse files
committed
1. shot at resolving sub system labels by files changed in PR
1 parent 77ec3fd commit 6fdd91f

File tree

5 files changed

+148
-2
lines changed

5 files changed

+148
-2
lines changed

lib/node-labels.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'use strict'
2+
3+
const subSystemLabels = {
4+
'c++': /^src\//
5+
}
6+
7+
const rxTests = /^test\//
8+
9+
function resolveLabels (filepathsChanged) {
10+
if (isOnly(rxTests, filepathsChanged)) {
11+
return ['test']
12+
}
13+
14+
return matchBySubSystemRegex(filepathsChanged)
15+
}
16+
17+
function isOnly (regexToMatch, filepathsChanged) {
18+
return filepathsChanged.every((filepath) => regexToMatch.test(filepath))
19+
}
20+
21+
function matchBySubSystemRegex (filepathsChanged) {
22+
// by putting matched labels into a map, we avoid duplicate labels
23+
const labelsMap = filepathsChanged.reduce((map, filepath) => {
24+
const mappedSubSystem = mappedSubSystemForFile(filepath)
25+
26+
if (mappedSubSystem) {
27+
map[mappedSubSystem] = true
28+
}
29+
30+
return map
31+
}, {})
32+
33+
return Object.keys(labelsMap)
34+
}
35+
36+
function mappedSubSystemForFile (filepath) {
37+
return Object.keys(subSystemLabels).find((labelName) => {
38+
const rxForLabel = subSystemLabels[labelName]
39+
40+
return rxForLabel.test(filepath) ? labelName : undefined
41+
})
42+
}
43+
44+
exports.resolveLabels = resolveLabels

lib/node-repo.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict'
2+
3+
const githubClient = require('./github-client')
4+
5+
const resolveLabels = require('./node-labels').resolveLabels
6+
7+
function findLabelsForPr (prId, cb) {
8+
githubClient.pullRequests.getFiles({
9+
user: 'nodejs',
10+
repo: 'node',
11+
number: prId
12+
}, (err, res) => {
13+
if (err) {
14+
return cb(err)
15+
}
16+
17+
const filepathsChanged = res.map((fileMeta) => fileMeta.filename)
18+
19+
cb(err, resolveLabels(filepathsChanged))
20+
})
21+
}
22+
23+
exports.findLabelsForPr = findLabelsForPr

package.json

Lines changed: 5 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": "tap test/*.test.js && standard",
8+
"test:watch": "nodemon -q -x 'npm test'"
89
},
910
"engines": {
1011
"node": ">= 4.2.0"
@@ -22,6 +23,8 @@
2223
},
2324
"devDependencies": {
2425
"eventsource": "^0.2.1",
25-
"standard": "^6.0.7"
26+
"nodemon": "^1.9.1",
27+
"standard": "^6.0.7",
28+
"tap": "^5.7.1"
2629
}
2730
}

server.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ require('dotenv').load({ silent: true })
55
const glob = require('glob')
66
const express = require('express')
77
const bodyParser = require('body-parser')
8+
9+
const nodeRepo = require('./lib/node-repo')
10+
811
const captureRaw = (req, res, buffer) => { req.raw = buffer }
912

1013
const app = express()
@@ -39,3 +42,16 @@ if (process.env.SSE_RELAY) {
3942
}
4043
}
4144
}
45+
46+
app.get('/labels/:prId', (req, res) => {
47+
nodeRepo.findLabelsForPr(req.params.prId, (err, labels) => {
48+
let statusCode = 200
49+
50+
if (err) {
51+
statusCode = 500
52+
console.log('Error while finding labels', err)
53+
}
54+
55+
res.status(statusCode).json(labels)
56+
})
57+
})

test/node-labels.test.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
'use strict'
2+
3+
const tap = require('tap')
4+
5+
const nodeLabels = require('../lib/node-labels')
6+
7+
tap.test('label: "test" when only ./test/ files has been changed', (t) => {
8+
const labels = nodeLabels.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: "c++" when ./src/* has been changed', (t) => {
20+
const labels = nodeLabels.resolveLabels([
21+
'src/async-wrap.h',
22+
'src/async-wrap.cc'
23+
])
24+
25+
t.same(labels, ['c++'])
26+
27+
t.end()
28+
})
29+
30+
//
31+
// Planned tests to be resolved later
32+
//
33+
34+
tap.test('label: "repl" when ./lib/repl.js has been changed', (t) => {
35+
const labels = nodeLabels.resolveLabels([
36+
'lib/repl.js',
37+
'test/debugger/test-debugger-pid.js',
38+
'test/debugger/test-debugger-repl-break-in-module.js',
39+
'test/debugger/test-debugger-repl-term.js'
40+
])
41+
42+
t.same(labels, ['repl'], { todo: true })
43+
44+
t.end()
45+
})
46+
47+
tap.test('label: "lib / src" when more than 5 sub-systems has been changed', (t) => {
48+
const labels = nodeLabels.resolveLabels([
49+
'lib/assert.js',
50+
'lib/dns.js',
51+
'lib/repl.js',
52+
'lib/process.js',
53+
'src/async-wrap.cc',
54+
'lib/module.js'
55+
])
56+
57+
t.same(labels, ['lib / src'], { todo: true })
58+
59+
t.end()
60+
})

0 commit comments

Comments
 (0)