files-extractor
Advanced tools
Comparing version 0.0.5 to 0.0.6
170
index.js
@@ -15,4 +15,5 @@ /*! | ||
const fs = require('fs-extra') | ||
const chalk = require('chalk'); | ||
const yaml = require('js-yaml'); | ||
const chalk = require('chalk'); | ||
const cluster = require('cluster'); | ||
const utils = require('./lib/utils'); | ||
@@ -26,12 +27,16 @@ const async = require('./lib/async'); | ||
const YAMLFILE = path.join(CWD, YAML); | ||
const searching = chalk.reset.green.bold('Searching'); | ||
const filtering = chalk.reset.green.bold('Filtering'); | ||
const load = ora({ text: searching, stream: process.stdout, spinner: spinners.line }); | ||
function color(value, color) { | ||
return chalk.reset.bold[color || 'cyan'](value); | ||
} | ||
function filter(files, options) { | ||
return files.filter(function(file) { | ||
load.text = `${ filtering }: ${ chalk.reset.cyan.bold(file) }`; | ||
let stat; | ||
process.send({ | ||
status: STATUS.FILTERING, | ||
data: file | ||
}); | ||
try { | ||
@@ -92,47 +97,140 @@ stat = fs.statSync(path.join(CWD, file)); | ||
const STATUS = { | ||
FAILED: 0, | ||
WARNING: 1, | ||
SEARCHING: 2, | ||
FILTERING: 3, | ||
FILTERED: 4, | ||
EXTRACTING: 5, | ||
EXTRACTED: 6 | ||
}; | ||
const starting = color('Starting...', 'green'); | ||
const searching = color('Searching', 'green'); | ||
const filtering = color('Filtering', 'green'); | ||
const extracting = color('Extracting', 'green'); | ||
const fmt = `${ extracting }: [:bar] (:current/:total) :percent - :file`; | ||
FilesExtractor.prototype = { | ||
extract: function() { | ||
load.start(); | ||
spinner: function() { | ||
return this.load = ora({ | ||
stream: process.stdout, | ||
spinner: spinners.line | ||
}).start(starting); | ||
}, | ||
bar: function(total) { | ||
return this.progress = new ProgressBar(fmt, { | ||
width: 30, | ||
clear: true, | ||
total: total, | ||
stream: process.stdout, | ||
head: '>' | ||
}); | ||
}, | ||
UI: function(message) { | ||
let context = this; | ||
let data = message.data; | ||
let load = context.load; | ||
let progress = context.progress; | ||
let options = this.options; | ||
switch (message.status) { | ||
case STATUS.FAILED: | ||
load.fail(data.message); | ||
glob(options.files, { root: CWD, dot: options.dot, nodir: true, ignore: options.ignore }, function(error, files) { | ||
if (error) { | ||
process.exit(); | ||
break; | ||
case STATUS.WARNING: | ||
progress.interrupt(`${ extracting }: ${ data.syscall } ${ color(data.file, 'red') } ${ data.code }!`); | ||
break; | ||
case STATUS.SEARCHING: | ||
load.text = `${ searching }: ${ color(data) }`; | ||
break; | ||
case STATUS.FILTERING: | ||
load.text = `${ filtering }: ${ color(data) }`; | ||
break; | ||
case STATUS.FILTERED: | ||
load.stop(); | ||
context.bar(data); | ||
break; | ||
case STATUS.EXTRACTING: | ||
progress.tick({ | ||
file: color(data) | ||
}); | ||
break; | ||
case STATUS.EXTRACTED: | ||
process.stdout.write(color(data, 'green')); | ||
process.exit(); | ||
break; | ||
} | ||
}, | ||
extract: function() { | ||
let context = this; | ||
let options = context.options; | ||
return process.stderr.write(error); | ||
} | ||
if (cluster.isMaster) { | ||
cluster.setupMaster({ | ||
silent: true | ||
}); | ||
files = filter(files, options); | ||
context.spinner(); | ||
load.stop(); | ||
let worker = cluster.fork(); | ||
let extracting = chalk.reset.green.bold('Extracting'); | ||
let fmt = `${ extracting }: [:bar] (:current/:total) :percent - :file`; | ||
let bar = new ProgressBar(fmt, { width: 30, clear: true, total: files.length, stream: process.stdout, head: '>' }); | ||
// Listen event | ||
worker.on('message', context.UI.bind(context)); | ||
} else { | ||
glob(options.files, { root: CWD, dot: options.dot, nodir: true, ignore: options.ignore }, function(error, files) { | ||
if (error) { | ||
return process.send({ | ||
status: STATUS.FAILED, | ||
data: error | ||
}); | ||
} | ||
async.series(files, function(file, next) { | ||
fs.copy(file, dest(file, options), { preserveTimestamps: true }, function(error) { | ||
bar.tick({ file: chalk.reset.cyan.bold(file) }); | ||
files = filter(files, options); | ||
if (error) { | ||
let syscall = error.syscall || 'extract'; | ||
let code = error.code || 'failed'; | ||
process.send({ | ||
status: STATUS.FILTERED, | ||
data: files.length | ||
}); | ||
bar.interrupt(`${ extracting }: ${ syscall } ${ chalk.reset.red.bold(file) } ${ code }!`); | ||
} | ||
async.series(files, function(file, next) { | ||
fs.copy(file, dest(file, options), { preserveTimestamps: true }, function(error) { | ||
process.send({ | ||
status: STATUS.EXTRACTING, | ||
data: file | ||
}); | ||
next(); | ||
if (error) { | ||
let syscall = error.syscall || 'extract'; | ||
let code = error.code || 'failed'; | ||
process.send({ | ||
status: STATUS.WARNING, | ||
data: { syscall, file, code } | ||
}); | ||
} | ||
next(); | ||
}); | ||
}, function() { | ||
let message = files.length | ||
? 'Oh yeah, extract the matched files successfully!' | ||
: 'Oops, there is no files matched the condition!'; | ||
process.send({ | ||
status: STATUS.EXTRACTED, | ||
data: message | ||
}); | ||
process.exit(); | ||
}); | ||
}, function() { | ||
let message = files.length ? 'Oh yeah, extract the matched files successfully!' : 'Oops, there is no files matched the condition!'; | ||
process.stdout.write(chalk.reset.green.bold(message)); | ||
process.exit(); | ||
}).on('match', function(file) { | ||
process.send({ | ||
status: STATUS.SEARCHING, | ||
data: file | ||
}); | ||
}); | ||
}).on('match', function(file) { | ||
load.text = `${ searching }: ${ chalk.reset.cyan.bold(file) }`; | ||
}); | ||
} | ||
return this; | ||
return context; | ||
} | ||
@@ -139,0 +237,0 @@ }; |
@@ -11,2 +11,4 @@ /*! | ||
const toString = Object.prototype.toString; | ||
const padStart = String.prototype.padStart ? function(value, length, pad) { | ||
@@ -39,3 +41,6 @@ return String.prototype.padStart.call(value, length, pad); | ||
padStart: padStart, | ||
dateIsValid: dateIsValid | ||
dateIsValid: dateIsValid, | ||
isString: function(value) { | ||
return toString.call(value) === '[object String]'; | ||
} | ||
}; |
{ | ||
"name": "files-extractor", | ||
"version": "0.0.5", | ||
"version": "0.0.6", | ||
"description": "Extract files that have changed between the specified date.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
Sorry, the diff of this file is not supported yet
15677
306