forked from todogroup/repolinter
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgit-grep-log.js
More file actions
86 lines (74 loc) · 1.95 KB
/
git-grep-log.js
File metadata and controls
86 lines (74 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2017 TODO Group. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
const spawnSync = require('child_process').spawnSync
const Result = require('../lib/result')
// eslint-disable-next-line no-unused-vars
const FileSystem = require('../lib/file_system')
function grepLog(fileSystem, options) {
const args = [
'-C',
fileSystem.targetDir,
'log',
'--all',
'--format=full',
'-E'
].concat(options.denylist.map(pattern => `--grep=${pattern}`))
if (options.ignoreCase) {
args.push('-i')
}
const log = spawnSync('git', args).stdout.toString()
return parseLog(log)
}
/**
* @param log
* @ignore
*/
function parseLog(log) {
const logEntries = log.split('\ncommit ').filter(x => !!x)
return logEntries.map(entry => extractInfo(entry))
}
/**
* @param commit
* @ignore
*/
function extractInfo(commit) {
const [hash, , , ...message] = commit.split('\n')
return {
hash: hash.split(' ')[1],
message: message.join('\n')
}
}
/**
*
* @param {FileSystem} fs A filesystem object configured with filter paths and target directories
* @param {object} options The rule configuration
* @returns {Result} The lint rule result
* @ignore
*/
function gitGrepLog(fs, options) {
// backwards compatibility with blacklist
options.denylist = options.denylist || options.blacklist
const commits = grepLog(fs, options)
const targets = commits.map(commit => {
const message = [
`The commit message for commit ${commit.hash.substr(
0,
7
)} contains denylisted words.\n`,
`\tDenylist: ${options.denylist.join(', ')}`
].join('\n')
return {
passed: false,
message,
path: commit
}
})
if (targets.length === 0) {
const message = `No denylisted words found in any commit messages.\n\tDenylist: ${options.denylist.join(
', '
)}`
return new Result(message, [], true)
}
return new Result('', targets, false)
}
module.exports = gitGrepLog