lcov-result-merger
Advanced tools
Comparing version 1.0.0 to 1.0.1
269
index.js
@@ -14,4 +14,4 @@ /** | ||
var through2 = require('through2'), | ||
File = require('vinyl'); | ||
var through2 = require('through2') | ||
, File = require('vinyl'); | ||
@@ -21,5 +21,5 @@ /* | ||
*/ | ||
function DA (lineNumber, hits) { | ||
this.lineNumber = lineNumber; | ||
this.hits = hits; | ||
function DA(lineNumber, hits) { | ||
this.lineNumber = lineNumber; | ||
this.hits = hits; | ||
} | ||
@@ -30,7 +30,7 @@ | ||
*/ | ||
function BRDA (lineNumber, blockNumber, branchNumber, hits) { | ||
this.lineNumber = lineNumber; | ||
this.blockNumber = blockNumber; | ||
this.branchNumber = branchNumber; | ||
this.hits = hits; | ||
function BRDA(lineNumber, blockNumber, branchNumber, hits) { | ||
this.lineNumber = lineNumber; | ||
this.blockNumber = blockNumber; | ||
this.branchNumber = branchNumber; | ||
this.hits = hits; // Always a string. See below. | ||
} | ||
@@ -42,5 +42,5 @@ | ||
function coverageFile(filename) { | ||
this.filename = filename; | ||
this.DARecords = []; | ||
this.BRDARecords = []; | ||
this.filename = filename; | ||
this.DARecords = []; | ||
this.BRDARecords = []; | ||
} | ||
@@ -52,8 +52,8 @@ | ||
function findDA(source, lineNumber) { | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].lineNumber === lineNumber) { | ||
return source[i]; | ||
} | ||
} | ||
return null; | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].lineNumber === lineNumber) { | ||
return source[i]; | ||
} | ||
} | ||
return null; | ||
} | ||
@@ -65,10 +65,10 @@ | ||
function findBRDA(source, blockNumber, branchNumber, lineNumber) { | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].blockNumber === blockNumber && | ||
source[i].branchNumber === branchNumber && | ||
source[i].lineNumber === lineNumber) { | ||
return source[i]; | ||
} | ||
} | ||
return null; | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].blockNumber === blockNumber && | ||
source[i].branchNumber === branchNumber && | ||
source[i].lineNumber === lineNumber) { | ||
return source[i]; | ||
} | ||
} | ||
return null; | ||
} | ||
@@ -80,8 +80,8 @@ | ||
function findCoverageFile(source, filename) { | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].filename === filename) { | ||
return source[i]; | ||
} | ||
} | ||
return null; | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].filename === filename) { | ||
return source[i]; | ||
} | ||
} | ||
return null; | ||
} | ||
@@ -93,65 +93,90 @@ | ||
function processFile(data, lcov) { | ||
var lines = data.split('\n'), | ||
currentFileName = '', | ||
currentCoverageFile = null; | ||
var lines = data.split('\n'), | ||
currentFileName = '', | ||
currentCoverageFile = null; | ||
for(var i = 0, l = lines.length; i < l; i++) { | ||
var line = lines[i]; | ||
if(line === 'end_of_record' || line === '') { | ||
currentFileName = ''; | ||
currentCoverageFile = null; | ||
continue; | ||
} | ||
function _numericHits(hits) { | ||
if (hits === '-'){ | ||
return 0; | ||
} | ||
return parseInt(hits, 10); | ||
} | ||
var prefixSplit = line.split(':'), | ||
prefix = prefixSplit[0]; | ||
function _mergedBRDAHits(existingBRDAHits, newBRDAHits) { | ||
if(prefix === 'SF') { | ||
currentFileName = prefixSplit[1]; | ||
currentCoverageFile = findCoverageFile(lcov, currentFileName); | ||
if(currentCoverageFile) { | ||
continue; | ||
} | ||
currentCoverageFile = new coverageFile(currentFileName); | ||
lcov.push(currentCoverageFile); | ||
continue; | ||
} | ||
// If we've never executed the branch code path in an existing coverage | ||
// record and we've never executed it here either, then keep it as '-' | ||
// (eg, never executed). If either of them is a number, then | ||
// use the number value. | ||
if(existingBRDA.hits !== '-' || hits !== '-') { | ||
return _numericHits(existingBRDAHits) + _numericHits(newBRDAHits); | ||
} | ||
var numberSplit, lineNumber, hits; | ||
return '-'; | ||
} | ||
if(prefix === 'DA') { | ||
numberSplit = prefixSplit[1].split(','); | ||
lineNumber = parseInt(numberSplit[0], 10); | ||
hits = parseInt(numberSplit[1], 10); | ||
var existingDA = findDA(currentCoverageFile.DARecords, lineNumber); | ||
if(existingDA) { | ||
existingDA.hits += hits; | ||
continue; | ||
} | ||
var newDA = new DA(lineNumber, hits); | ||
currentCoverageFile.DARecords.push(newDA); | ||
continue; | ||
} | ||
for(var i = 0, l = lines.length; i < l; i++) { | ||
var line = lines[i]; | ||
if(line === 'end_of_record' || line === '') { | ||
currentFileName = ''; | ||
currentCoverageFile = null; | ||
continue; | ||
} | ||
if(prefix === 'BRDA') { | ||
numberSplit = prefixSplit[1].split(','); | ||
lineNumber = parseInt(numberSplit[0], 10); | ||
var blockNumber = parseInt(numberSplit[1], 10), | ||
branchNumber = parseInt(numberSplit[2], 10); | ||
hits = parseInt(numberSplit[3], 10); | ||
var existingBRDA = findBRDA(currentCoverageFile.BRDARecords, | ||
blockNumber, branchNumber, lineNumber); | ||
if(existingBRDA) { | ||
existingBRDA.hits += hits; | ||
continue; | ||
} | ||
var newBRDA = new BRDA(lineNumber, blockNumber, branchNumber, hits); | ||
currentCoverageFile.BRDARecords.push(newBRDA); | ||
continue; | ||
} | ||
// We could throw an error here, or, we could simply ignore it, since | ||
// we're not interested. | ||
// throw new Error('Unknown Prefix "' + prefix + '"'); | ||
} | ||
return lcov; | ||
var prefixSplit = line.split(':'), | ||
prefix = prefixSplit[0]; | ||
if(prefix === 'SF') { | ||
currentFileName = prefixSplit[1]; | ||
currentCoverageFile = findCoverageFile(lcov, currentFileName); | ||
if(currentCoverageFile) { | ||
continue; | ||
} | ||
currentCoverageFile = new coverageFile(currentFileName); | ||
lcov.push(currentCoverageFile); | ||
continue; | ||
} | ||
var numberSplit, lineNumber, hits; | ||
if(prefix === 'DA') { | ||
numberSplit = prefixSplit[1].split(','); | ||
lineNumber = parseInt(numberSplit[0], 10); | ||
hits = parseInt(numberSplit[1], 10); | ||
var existingDA = findDA(currentCoverageFile.DARecords, lineNumber); | ||
if(existingDA) { | ||
existingDA.hits += hits; | ||
continue; | ||
} | ||
var newDA = new DA(lineNumber, hits); | ||
currentCoverageFile.DARecords.push(newDA); | ||
continue; | ||
} | ||
if(prefix === 'BRDA') { | ||
numberSplit = prefixSplit[1].split(','); | ||
lineNumber = parseInt(numberSplit[0], 10); | ||
var blockNumber = parseInt(numberSplit[1], 10), | ||
branchNumber = parseInt(numberSplit[2], 10); | ||
var existingBRDA = findBRDA(currentCoverageFile.BRDARecords, | ||
blockNumber, branchNumber, lineNumber); | ||
// Special case, hits might be a '-'. This means that the code block | ||
// where the branch was contained was never executed at all (as opposed | ||
// to the code being executed, but the branch not being taken). Keep | ||
// it as a string and let _mergedBRDAHits work it out. | ||
hits = numberSplit[3]; | ||
if (existingBRDA) { | ||
existingBRDA.hits = _mergedBRDAHits(existingBRDA.hits, hits); | ||
continue; | ||
} | ||
var newBRDA = new BRDA(lineNumber, blockNumber, branchNumber, hits); | ||
currentCoverageFile.BRDARecords.push(newBRDA); | ||
continue; | ||
} | ||
// We could throw an error here, or, we could simply ignore it, since | ||
// we're not interested. | ||
// throw new Error('Unknown Prefix "' + prefix + '"'); | ||
} | ||
return lcov; | ||
} | ||
@@ -163,37 +188,37 @@ | ||
function createRecords(coverageFiles) { | ||
return coverageFiles.map(function(coverageFile) { | ||
var header = 'SF:' + coverageFile.filename + '\n'; | ||
var footer = 'end_of_record\n'; | ||
var body = coverageFile.DARecords.map(function(daRecord) { | ||
return 'DA:' + daRecord.lineNumber + ',' + | ||
daRecord.hits + '\n'; | ||
}).join('') + coverageFile.BRDARecords.map(function(brdaRecord) { | ||
return 'BRDA:' + brdaRecord.lineNumber + ',' + | ||
brdaRecord.blockNumber + ',' + brdaRecord.branchNumber + ',' + | ||
brdaRecord.hits + '\n'; | ||
}).join(''); | ||
return header + body + footer; | ||
}).join(''); | ||
return coverageFiles.map(function(coverageFile) { | ||
var header = 'SF:' + coverageFile.filename + '\n'; | ||
var footer = 'end_of_record\n'; | ||
var body = coverageFile.DARecords.map(function(daRecord) { | ||
return 'DA:' + daRecord.lineNumber + ',' + | ||
daRecord.hits + '\n'; | ||
}).join('') + coverageFile.BRDARecords.map(function(brdaRecord) { | ||
return 'BRDA:' + brdaRecord.lineNumber + ',' + | ||
brdaRecord.blockNumber + ',' + brdaRecord.branchNumber + ',' + | ||
brdaRecord.hits + '\n'; | ||
}).join(''); | ||
return header + body + footer; | ||
}).join(''); | ||
} | ||
module.exports = function() { | ||
var coverageFiles = []; | ||
return through2.obj(function process(file, encoding, callback) { | ||
if (file.isNull()) { | ||
callback(); | ||
return; | ||
} | ||
if (file.isStream()) { | ||
throw new Error('Streaming not supported'); | ||
} | ||
coverageFiles = processFile(file.contents.toString(), coverageFiles); | ||
callback(); | ||
}, function flush() { | ||
var file = new File({ | ||
path: 'lcov.info', | ||
contents: new Buffer(createRecords(coverageFiles)) | ||
}); | ||
this.push(file); | ||
this.emit('end'); | ||
}); | ||
var coverageFiles = []; | ||
return through2.obj(function process(file, encoding, callback) { | ||
if (file.isNull()) { | ||
callback(); | ||
return; | ||
} | ||
if (file.isStream()) { | ||
throw new Error('Streaming not supported'); | ||
} | ||
coverageFiles = processFile(file.contents.toString(), coverageFiles); | ||
callback(); | ||
}, function flush() { | ||
var file = new File({ | ||
path: 'lcov.info', | ||
contents: new Buffer(createRecords(coverageFiles)) | ||
}); | ||
this.push(file); | ||
this.emit('end'); | ||
}); | ||
}; |
{ | ||
"name": "lcov-result-merger", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"description": "Merges multiple lcov results into one", | ||
@@ -17,5 +17,5 @@ "main": "index.js", | ||
"dependencies": { | ||
"through2": "^0.5.1", | ||
"vinyl": "^0.2.3", | ||
"vinyl-fs": "^0.3.3" | ||
"through2": "^0.6.3", | ||
"vinyl": "^0.4.6", | ||
"vinyl-fs": "^0.3.13" | ||
}, | ||
@@ -43,10 +43,10 @@ "repository": { | ||
"devDependencies": { | ||
"chai": "^1.9.1", | ||
"chai": "^1.10.0", | ||
"chai-gulp-helpers": "^0.0.3", | ||
"gulp": "^3.8.3", | ||
"gulp-istanbul": "^0.2.0", | ||
"gulp-jshint": "^1.6.3", | ||
"gulp-mocha": "^0.4.1", | ||
"jshint": "~2.1.11" | ||
"gulp": "^3.8.10", | ||
"gulp-istanbul": "^0.5.0", | ||
"gulp-jshint": "^1.9.0", | ||
"gulp-mocha": "^2.0.0", | ||
"jshint": "^2.5.10" | ||
} | ||
} |
@@ -18,3 +18,3 @@ # LCOV Result Merger | ||
1. Generate LCOV Code Coverage into different files, e.g. `build/coverage/coverage_X.log` | ||
2. Run `./node_modules/bin/lcov-result-merger 'build/coverage/coverage_*.log'` | ||
2. Run `./node_modules/.bin/lcov-result-merger 'build/coverage/coverage_*.log'` | ||
3. Use the stdout to pipe it to e.g. [Coveralls](http://coveralls.io) | ||
@@ -25,4 +25,4 @@ 4. Done. | ||
1. Generate LCOV Code Coverage into different files, e.g. `build/coverage/coverage_X.log` | ||
2. Run `./node_modules/bin/lcov-result-merger 'build/coverage/coverage_*.log' 'target/coverage/coverage_merged.log'` | ||
2. Run `./node_modules/.bin/lcov-result-merger 'build/coverage/coverage_*.log' 'target/coverage/coverage_merged.log'` | ||
3. Done. Enjoy your merged file. | ||
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
8607
219
- Removedthrough2@0.5.1(transitive)
- Removedvinyl@0.2.3(transitive)
- Removedxtend@3.0.0(transitive)
Updatedthrough2@^0.6.3
Updatedvinyl@^0.4.6
Updatedvinyl-fs@^0.3.13