#!/usr/bin/env node
|
|
var program = require('commander')
|
var dircompare = require('../index')
|
var fs = require('fs')
|
var util = require('util')
|
var print = require('./print')
|
var pjson = require('../../package.json')
|
|
program
|
.version(pjson.version)
|
.usage('[options] leftdir rightdir')
|
.option('-c, --compare-content', 'compare files by content')
|
.option('-D, --compare-date', 'compare files by date')
|
.option('--date-tolerance [type]', 'tolerance to be used in date comparison (milliseconds)')
|
.option('--compare-symlink', 'compare files and directories by symlink')
|
.option('-f, --filter [type]', 'file name filter', undefined)
|
.option('-x, --exclude [type]', 'file/directory name exclude filter', undefined)
|
.option('-S, --skip-subdirs', 'do not recurse into subdirectories')
|
.option('-L, --skip-symlinks', 'ignore symlinks')
|
.option('-i, --ignore-case', 'ignores case when comparing file names')
|
.option('-l, --show-left', 'report - show entries occurring in left dir')
|
.option('-r, --show-right', 'report - show entries occurring in right dir')
|
.option('-e, --show-equal', 'report - show identic entries occurring in both dirs')
|
.option('-d, --show-distinct', 'report - show distinct entries occurring in both dirs')
|
.option('-a, --show-all', 'report - show all entries')
|
.option('-w, --whole-report', 'report - include directories in detailed report')
|
.option('--reason', 'report - show reason when entries are distinct')
|
.option('--csv', 'report - print details as csv')
|
.option('--nocolors', 'don\'t use console colors')
|
.option('--async', 'Make use of multiple cores')
|
|
|
program.on('--help', function () {
|
console.log(' By default files are compared by size.')
|
console.log(' --date-tolerance defaults to 1000 ms. Two files are considered to have')
|
console.log(' the same date if the difference between their modification dates fits')
|
console.log(' within date tolerance.')
|
console.log()
|
console.log(' Exit codes:')
|
console.log(' 0 - entries are identical')
|
console.log(' 1 - entries are different')
|
console.log(' 2 - error occurred')
|
console.log()
|
console.log(' Examples:')
|
console.log(' compare by content dircompare -c dir1 dir2')
|
console.log(' show only different files dircompare -d dir1 dir2')
|
console.log()
|
console.log(' exclude filter dircompare -x ".git,node_modules" dir1 dir2')
|
console.log(' dircompare -x "/tests/expected" dir1 dir2')
|
console.log(' dircompare -x "**/expected" dir1 dir2')
|
console.log(' dircompare -x "**/tests/**/*.ts" dir1 dir2')
|
console.log()
|
console.log(' include filter dircompare -f "*.js,*.yml" dir1 dir2')
|
console.log(' dircompare -f "/tests/**/*.js" dir1 dir2')
|
console.log(' dircompare -f "**/tests/**/*.ts" dir1 dir2')
|
})
|
|
// Fix for https://github.com/tj/commander.js/issues/125
|
program.allowUnknownOption()
|
program.parse(process.argv)
|
var parsed = program.parseOptions(program.normalize(process.argv.slice(2)))
|
if (parsed.unknown.length > 0) {
|
console.error('Unknown options: ' + parsed.unknown)
|
process.exit(2)
|
}
|
|
var run = function () {
|
try {
|
if (program.args.length !== 2) {
|
program.outputHelp()
|
process.exit(2)
|
} else {
|
var options = {}
|
|
|
options.compareContent = program.compareContent
|
options.compareDate = program.compareDate
|
options.compareSymlink = program.compareSymlink
|
options.compareSize = true
|
options.skipSubdirs = program.skipSubdirs
|
options.skipSymlinks = program.skipSymlinks
|
options.ignoreCase = program.ignoreCase
|
options.includeFilter = program.filter
|
options.excludeFilter = program.exclude
|
options.noDiffSet = !(program.showAll || program.showEqual || program.showLeft || program.showRight || program.showDistinct)
|
options.dateTolerance = program.dateTolerance || 1000
|
|
var async = program.async
|
|
var path1 = program.args[0]
|
var path2 = program.args[1]
|
var abort = false
|
if (!isNumeric(options.dateTolerance)) {
|
console.error("Numeric value expected for --date-tolerance")
|
abort = true
|
}
|
if (!fs.existsSync(path1)) {
|
console.error(util.format("Path '%s' missing"), path1)
|
abort = true
|
}
|
if (!fs.existsSync(path2)) {
|
console.error(util.format("Path '%s' missing"), path2)
|
abort = true
|
}
|
if (!abort) {
|
// compare
|
var comparePromise
|
if (async) {
|
comparePromise = dircompare.compare(path1, path2, options)
|
} else {
|
comparePromise = new Promise(function (resolve, reject) {
|
resolve(dircompare.compareSync(path1, path2, options))
|
})
|
}
|
|
comparePromise.then(
|
function (res) {
|
// PRINT DETAILS
|
print(res, process.stdout, program)
|
if (res.same) {
|
process.exit(0)
|
} else {
|
process.exit(1)
|
}
|
},
|
function (error) {
|
console.error('Error occurred: ' + (error instanceof Error ? error.stack : error))
|
process.exit(2)
|
})
|
} else {
|
process.exit(2)
|
}
|
}
|
} catch (e) {
|
console.error(e.stack)
|
process.exit(2)
|
}
|
}
|
|
function isNumeric(n) {
|
return !isNaN(parseFloat(n)) && isFinite(n)
|
}
|
|
|
|
run()
|