mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.2 KiB
84 lines
2.2 KiB
var common = require('./common');
|
|
var fs = require('fs');
|
|
|
|
common.register('grep', _grep, {
|
|
globStart: 2, // don't glob-expand the regex
|
|
canReceivePipe: true,
|
|
cmdOptions: {
|
|
'v': 'inverse',
|
|
'l': 'nameOnly',
|
|
'i': 'ignoreCase',
|
|
'n': 'lineNumber',
|
|
},
|
|
});
|
|
|
|
//@
|
|
//@ ### grep([options,] regex_filter, file [, file ...])
|
|
//@ ### grep([options,] regex_filter, file_array)
|
|
//@
|
|
//@ Available options:
|
|
//@
|
|
//@ + `-v`: Invert `regex_filter` (only print non-matching lines).
|
|
//@ + `-l`: Print only filenames of matching files.
|
|
//@ + `-i`: Ignore case.
|
|
//@ + `-n`: Print line numbers.
|
|
//@
|
|
//@ Examples:
|
|
//@
|
|
//@ ```javascript
|
|
//@ grep('-v', 'GLOBAL_VARIABLE', '*.js');
|
|
//@ grep('GLOBAL_VARIABLE', '*.js');
|
|
//@ ```
|
|
//@
|
|
//@ Reads input string from given files and returns a
|
|
//@ [ShellString](#shellstringstr) containing all lines of the @ file that match
|
|
//@ the given `regex_filter`.
|
|
function _grep(options, regex, files) {
|
|
// Check if this is coming from a pipe
|
|
var pipe = common.readFromPipe();
|
|
|
|
if (!files && !pipe) common.error('no paths given', 2);
|
|
|
|
files = [].slice.call(arguments, 2);
|
|
|
|
if (pipe) {
|
|
files.unshift('-');
|
|
}
|
|
|
|
var grep = [];
|
|
if (options.ignoreCase) {
|
|
regex = new RegExp(regex, 'i');
|
|
}
|
|
files.forEach(function (file) {
|
|
if (!fs.existsSync(file) && file !== '-') {
|
|
common.error('no such file or directory: ' + file, 2, { continue: true });
|
|
return;
|
|
}
|
|
|
|
var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8');
|
|
if (options.nameOnly) {
|
|
if (contents.match(regex)) {
|
|
grep.push(file);
|
|
}
|
|
} else {
|
|
var lines = contents.split('\n');
|
|
lines.forEach(function (line, index) {
|
|
var matched = line.match(regex);
|
|
if ((options.inverse && !matched) || (!options.inverse && matched)) {
|
|
var result = line;
|
|
if (options.lineNumber) {
|
|
result = '' + (index + 1) + ':' + line;
|
|
}
|
|
grep.push(result);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
if (grep.length === 0 && common.state.errorCode !== 2) {
|
|
// We didn't hit the error above, but pattern didn't match
|
|
common.error('', { silent: true });
|
|
}
|
|
return grep.join('\n') + '\n';
|
|
}
|
|
module.exports = _grep;
|
|
|