var colors = require('colors')
|
var util = require('util')
|
var pathUtils = require('path')
|
|
var PATH_SEP = pathUtils.sep
|
|
// Prints dir compare results.
|
// 'program' represents display options and correspond to dircompare command line parameters.
|
// Example: 'dircompare --show-all --exclude *.js dir1 dir2' translates into
|
// program: {showAll: true, exclude: '*.js'}
|
//
|
var print = function (res, writer, program) {
|
var noColor = function (str) { return str }
|
var colorEqual = program.nocolors ? noColor : colors.green
|
var colorDistinct = program.nocolors ? noColor : colors.red
|
var colorLeft = noColor
|
var colorRight = noColor
|
var colorDir = noColor
|
var colorBrokenLinks = noColor
|
var colorMissing = program.nocolors ? noColor : colors.yellow
|
|
// calculate relative path length for pretty print
|
var relativePathMaxLength = 0, fileNameMaxLength = 0
|
if (!program.csv && res.diffSet) {
|
res.diffSet.forEach(function (diff) {
|
if (diff.relativePath.length > relativePathMaxLength) {
|
relativePathMaxLength = diff.relativePath.length
|
}
|
var len = getCompareFile(diff, '??', colorMissing).length
|
if (len > fileNameMaxLength) {
|
fileNameMaxLength = len
|
}
|
})
|
}
|
|
// csv header
|
if (program.csv) {
|
writer.write('path,name,state,type,size1,size2,date1,date2,reason\n')
|
}
|
if (res.diffSet) {
|
for (var i = 0; i < res.diffSet.length; i++) {
|
var detail = res.diffSet[i]
|
var color, show = true
|
|
if (!program.wholeReport) {
|
// show only files or broken links
|
var type = detail.type1 !== 'missing' ? detail.type1 : detail.type2
|
if (type !== 'file' && type !== 'broken-link') {
|
show = false
|
}
|
}
|
if (show) {
|
switch (detail.state) {
|
case 'equal':
|
color = colorEqual
|
show = program.showAll || program.showEqual ? true : false
|
break
|
case 'left':
|
color = colorLeft
|
show = program.showAll || program.showLeft ? true : false
|
break
|
case 'right':
|
color = colorRight
|
show = program.showAll || program.showRight ? true : false
|
break
|
case 'distinct':
|
color = colorDistinct
|
show = program.showAll || program.showDistinct ? true : false
|
break
|
default:
|
show = true
|
color = colors.gray
|
}
|
if (show) {
|
if (program.csv) {
|
printCsv(writer, detail, color)
|
} else {
|
printPretty(writer, program, detail, color, colorDir, colorMissing, relativePathMaxLength, fileNameMaxLength)
|
}
|
}
|
}
|
}
|
}
|
|
// PRINT STATISTICS
|
var statTotal, statEqual, statLeft, statRight, statDistinct
|
if (program.wholeReport) {
|
statTotal = res.total
|
statEqual = res.equal
|
statLeft = res.left
|
statRight = res.right
|
statDistinct = res.distinct
|
} else {
|
var brokenLInksStats = res.brokenLinks
|
statTotal = res.totalFiles + brokenLInksStats.totalBrokenLinks
|
statEqual = res.equalFiles
|
statLeft = res.leftFiles + brokenLInksStats.leftBrokenLinks
|
statRight = res.rightFiles + brokenLInksStats.rightBrokenLinks
|
statDistinct = res.distinctFiles + brokenLInksStats.distinctBrokenLinks
|
}
|
if (!program.noDiffIndicator) {
|
writer.write(res.same ? colorEqual('Entries are identical\n') : colorDistinct('Entries are different\n'))
|
}
|
var stats = util.format('total: %s, equal: %s, distinct: %s, only left: %s, only right: %s',
|
statTotal,
|
colorEqual(statEqual),
|
colorDistinct(statDistinct),
|
colorLeft(statLeft),
|
colorRight(statRight)
|
)
|
if (res.brokenLinks.totalBrokenLinks > 0) {
|
stats += util.format(', broken links: %s', colorBrokenLinks(res.brokenLinks.totalBrokenLinks))
|
}
|
stats += '\n'
|
writer.write(stats)
|
}
|
|
/**
|
* Print details for default view mode
|
*/
|
var printPretty = function (writer, program, detail, color, dirColor, missingColor, relativePathMaxLength, fileNameMaxLength) {
|
var path = detail.relativePath === '' ? PATH_SEP : detail.relativePath
|
|
var state
|
switch (detail.state) {
|
case 'equal':
|
state = '=='
|
break
|
case 'left':
|
state = '->'
|
break
|
case 'right':
|
state = '<-'
|
break
|
case 'distinct':
|
state = '<>'
|
break
|
default:
|
state = '?'
|
}
|
var type = ''
|
type = detail.type1 !== 'missing' ? detail.type1 : detail.type2
|
if (type === 'directory') {
|
type = dirColor(type)
|
}
|
var cmpEntry = getCompareFile(detail, color(state), missingColor)
|
var reason = ''
|
if (program.reason && detail.reason) {
|
reason = util.format(' <%s>', detail.reason)
|
}
|
if (program.wholeReport || type === 'broken-link') {
|
writer.write(util.format('[%s] %s (%s)%s\n', path, cmpEntry, type, reason))
|
} else {
|
writer.write(util.format('[%s] %s%s\n', path, cmpEntry, reason))
|
}
|
}
|
|
var getCompareFile = function (detail, state, missingcolor) {
|
p1 = detail.name1 ? detail.name1 : ''
|
p2 = detail.name2 ? detail.name2 : ''
|
var missing1 = detail.type1 === 'missing' ? missingcolor('missing') : ''
|
var missing2 = detail.type2 === 'missing' ? missingcolor('missing') : ''
|
return util.format('%s%s %s %s%s', missing1, p1, state, missing2, p2)
|
}
|
|
/**
|
* Print csv details.
|
*/
|
var printCsv = function (writer, detail, color) {
|
var size1 = '', size2 = ''
|
if (detail.type1 === 'file') {
|
size1 = detail.size1 !== undefined ? detail.size1 : ''
|
}
|
if (detail.type2 === 'file') {
|
size2 = detail.size2 !== undefined ? detail.size2 : ''
|
}
|
|
var date1 = '', date2 = ''
|
date1 = detail.date1 !== undefined ? detail.date1.toISOString() : ''
|
date2 = detail.date2 !== undefined ? detail.date2.toISOString() : ''
|
|
var type = ''
|
type = detail.type1 !== 'missing' ? detail.type1 : detail.type2
|
|
var path = detail.relativePath ? detail.relativePath : PATH_SEP
|
var name = (detail.name1 ? detail.name1 : detail.name2)
|
var reason = detail.reason || ''
|
|
writer.write(util.format('%s,%s,%s,%s,%s,%s,%s,%s,%s\n', path, name, color(detail.state), type, size1, size2, date1, date2, reason))
|
}
|
|
module.exports = print
|