UNPKG

1.69 kBJavaScriptView Raw
1'use strict'
2
3const debug = require('debug')('elint:walker:stage')
4const fs = require('fs-extra')
5const minimatch = require('minimatch')
6const sgf = require('staged-git-files')
7const { getBaseDir } = require('../env')
8
9/**
10 * 执行 minimatch
11 *
12 * @param {string} filename 文件名
13 * @param {Array<string>} patterns 匹配模式
14 * @param {Array<string>} ignorePatterns 忽略模式
15 *
16 * @returns {boolean} 是否匹配
17 */
18function match (filename, patterns, ignorePatterns) {
19 function isMatch (ps) {
20 return ps.some(p => {
21 return minimatch(filename, p, {
22 dot: true
23 })
24 })
25 }
26
27 let isIgnore = false
28
29 if (Array.isArray(ignorePatterns) && ignorePatterns.length) {
30 isIgnore = isMatch(ignorePatterns)
31 }
32
33 if (isIgnore) {
34 return false
35 }
36
37 return isMatch(patterns)
38}
39
40/**
41 * Git 暂存文件遍历
42 *
43 * @param {Array<string>} patterns 要搜寻的 glob 数组
44 * @param {Array<string>} ignorePatterns 忽略的 glob 数组
45 *
46 * @returns {Promise<object>} fileTree
47 */
48function stageFiles (patterns, ignorePatterns) {
49 const baseDir = getBaseDir()
50
51 // 如果 baseDir 根本不存在 sgf 会抛出异常
52 if (!fs.existsSync(baseDir)) {
53 return Promise.resolve([])
54 }
55
56 sgf.cwd = baseDir
57
58 return new Promise(resolve => {
59 sgf((err, result) => {
60 if (err) {
61 debug('staged-git-files error: %o', err)
62 return resolve([])
63 }
64
65 const fileList = result
66 .filter(item => item.status !== 'Deleted') // 过滤已删除的文件
67 .filter(item => match(item.filename, patterns, ignorePatterns))
68 .map(item => item.filename)
69
70 resolve(fileList)
71 })
72 })
73}
74
75module.exports = stageFiles