index.js
2.2 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
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.findRepos = exports.getChangedFilesForRoots = void 0;
function _throat() {
const data = _interopRequireDefault(require('throat'));
_throat = function () {
return data;
};
return data;
}
var _git = _interopRequireDefault(require('./git'));
var _hg = _interopRequireDefault(require('./hg'));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {default: obj};
}
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
function notEmpty(value) {
return value != null;
} // This is an arbitrary number. The main goal is to prevent projects with
// many roots (50+) from spawning too many processes at once.
const mutex = (0, _throat().default)(5);
const findGitRoot = dir => mutex(() => _git.default.getRoot(dir));
const findHgRoot = dir => mutex(() => _hg.default.getRoot(dir));
const getChangedFilesForRoots = async (roots, options) => {
const repos = await findRepos(roots);
const changedFilesOptions = {
includePaths: roots,
...options
};
const gitPromises = Array.from(repos.git).map(repo =>
_git.default.findChangedFiles(repo, changedFilesOptions)
);
const hgPromises = Array.from(repos.hg).map(repo =>
_hg.default.findChangedFiles(repo, changedFilesOptions)
);
const changedFiles = (
await Promise.all(gitPromises.concat(hgPromises))
).reduce((allFiles, changedFilesInTheRepo) => {
for (const file of changedFilesInTheRepo) {
allFiles.add(file);
}
return allFiles;
}, new Set());
return {
changedFiles,
repos
};
};
exports.getChangedFilesForRoots = getChangedFilesForRoots;
const findRepos = async roots => {
const gitRepos = await Promise.all(
roots.reduce((promises, root) => promises.concat(findGitRoot(root)), [])
);
const hgRepos = await Promise.all(
roots.reduce((promises, root) => promises.concat(findHgRoot(root)), [])
);
return {
git: new Set(gitRepos.filter(notEmpty)),
hg: new Set(hgRepos.filter(notEmpty))
};
};
exports.findRepos = findRepos;