lcov-result-merger
Advanced tools
Comparing version 0.0.2 to 1.0.0
155
index.js
@@ -14,6 +14,4 @@ /** | ||
var glob = require('glob'), | ||
fs = require('fs'), | ||
path = require('path'), | ||
cwd = process.cwd(); | ||
var through2 = require('through2'), | ||
File = require('vinyl'); | ||
@@ -24,4 +22,4 @@ /* | ||
function DA (lineNumber, hits) { | ||
this.lineNumber = lineNumber | ||
this.hits = hits | ||
this.lineNumber = lineNumber; | ||
this.hits = hits; | ||
} | ||
@@ -33,6 +31,6 @@ | ||
function BRDA (lineNumber, blockNumber, branchNumber, hits) { | ||
this.lineNumber = lineNumber | ||
this.blockNumber = blockNumber | ||
this.branchNumber = branchNumber | ||
this.hits = hits | ||
this.lineNumber = lineNumber; | ||
this.blockNumber = blockNumber; | ||
this.branchNumber = branchNumber; | ||
this.hits = hits; | ||
} | ||
@@ -45,4 +43,4 @@ | ||
this.filename = filename; | ||
this.DARecords = [] | ||
this.BRDARecords = [] | ||
this.DARecords = []; | ||
this.BRDARecords = []; | ||
} | ||
@@ -67,5 +65,5 @@ | ||
for (var i=0; i < source.length; i++) { | ||
if (source[i].blockNumber === blockNumber | ||
&& source[i].branchNumber === branchNumber | ||
&& source[i].lineNumber === lineNumber) { | ||
if (source[i].blockNumber === blockNumber && | ||
source[i].branchNumber === branchNumber && | ||
source[i].lineNumber === lineNumber) { | ||
return source[i]; | ||
@@ -119,6 +117,8 @@ } | ||
var numberSplit, lineNumber, hits; | ||
if(prefix === 'DA') { | ||
var numberSplit = prefixSplit[1].split(','), | ||
lineNumber = parseInt(numberSplit[0], 10), | ||
hits = parseInt(numberSplit[1], 10); | ||
numberSplit = prefixSplit[1].split(','); | ||
lineNumber = parseInt(numberSplit[0], 10); | ||
hits = parseInt(numberSplit[1], 10); | ||
var existingDA = findDA(currentCoverageFile.DARecords, lineNumber); | ||
@@ -135,8 +135,9 @@ if(existingDA) { | ||
if(prefix === 'BRDA') { | ||
var numberSplit = prefixSplit[1].split(','), | ||
lineNumber = parseInt(numberSplit[0], 10), | ||
blockNumber = parseInt(numberSplit[1], 10), | ||
branchNumber = parseInt(numberSplit[2], 10), | ||
hits = parseInt(numberSplit[3], 10); | ||
var existingBRDA = findBRDA(currentCoverageFile.BRDARecords, blockNumber, branchNumber, lineNumber); | ||
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) { | ||
@@ -150,4 +151,5 @@ existingBRDA.hits += hits; | ||
} | ||
//We could throw an error here, or, we could simply ignore it, since we're not interested. | ||
//throw new Error('Unknown Prefix "' + prefix + '"'); | ||
// We could throw an error here, or, we could simply ignore it, since | ||
// we're not interested. | ||
// throw new Error('Unknown Prefix "' + prefix + '"'); | ||
} | ||
@@ -158,75 +160,40 @@ return lcov; | ||
/* | ||
* Helper function to write output to either file or stdout | ||
* Creates LCOV records for given list of files. | ||
*/ | ||
function writer(filePath, data) { | ||
if (filePath) { | ||
fs.appendFileSync(filePath, data); | ||
} else { | ||
process.stdout.write(data); | ||
} | ||
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(''); | ||
} | ||
/* | ||
* Read in the multiple lcov files and merge them into one output | ||
*/ | ||
function mergeFiles(files, filePath) { | ||
var lcov = []; | ||
for(var i = 0, l = files.length; i < l; i++) { | ||
var file = files[i], | ||
data = fs.readFileSync(file); | ||
lcov = processFile(data.toString(), lcov); | ||
} | ||
for (var fileIndex in lcov) { | ||
var coverageFile = lcov[fileIndex]; | ||
writer(filePath, 'SF:' + coverageFile.filename + '\n'); | ||
for (var daIndex in coverageFile.DARecords) { | ||
var daRecord = coverageFile.DARecords[daIndex]; | ||
writer(filePath, 'DA:' + daRecord.lineNumber + ',' + daRecord.hits + '\n'); | ||
module.exports = function() { | ||
var coverageFiles = []; | ||
return through2.obj(function process(file, encoding, callback) { | ||
if (file.isNull()) { | ||
callback(); | ||
return; | ||
} | ||
for (var brdaIndex in coverageFile.BRDARecords) { | ||
var brdaRecord = coverageFile.BRDARecords[brdaIndex]; | ||
writer(filePath, 'BRDA:' + brdaRecord.lineNumber + ',' + brdaRecord.blockNumber + ',' | ||
+ brdaRecord.branchNumber + ',' + brdaRecord.hits + '\n'); | ||
if (file.isStream()) { | ||
throw new Error('Streaming not supported'); | ||
} | ||
writer(filePath, 'end_of_record\n'); | ||
} | ||
} | ||
/* | ||
This will determine if the filepath is relative or absolute. | ||
If relative, it will return the full absolute path based on CWD. | ||
*/ | ||
function getFilePath(outputFile) { | ||
if (outputFile) { | ||
if (outputFile.match("^/") == "/") { | ||
return outputFile; | ||
} else { | ||
return path.join(cwd, "/", outputFile); | ||
} | ||
} | ||
return null; | ||
} | ||
module.exports = function() { | ||
if (process.argv.length < 3) { | ||
console.error(""); | ||
console.error("Usage: node lcov-result-merger 'pattern' ['output file']"); | ||
console.error("EX: node lcov-result-merger 'target/**/lcov.out' 'target/lcov-merged.out'"); | ||
console.error(""); | ||
process.exit(1); | ||
} | ||
var files = process.argv[2]; | ||
var outputFile = process.argv[3]; | ||
var filePath = getFilePath(outputFile); | ||
if (filePath && fs.existsSync(filePath)) { | ||
fs.unlinkSync(filePath); | ||
} | ||
var options = {}; | ||
glob(files, options, function(err, files) { | ||
if(err) { | ||
throw new Error(err); | ||
} | ||
mergeFiles(files, filePath); | ||
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": "0.0.2", | ||
"version": "1.0.0", | ||
"description": "Merges multiple lcov results into one", | ||
"main": "index.js", | ||
"files": [ | ||
"index.js", | ||
"bin" | ||
], | ||
"scripts": { | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
"test": "./node_modules/.bin/gulp test" | ||
}, | ||
"bin": { | ||
"lcov-result-merger": "./bin/lcov-result-merger" | ||
"lcov-result-merger": "./bin/lcov-result-merger.js" | ||
}, | ||
"dependencies": { | ||
"glob": "~3.2.1" | ||
"through2": "^0.5.1", | ||
"vinyl": "^0.2.3", | ||
"vinyl-fs": "^0.3.3" | ||
}, | ||
@@ -30,6 +36,16 @@ "repository": { | ||
"contributors": [ | ||
"M. Adam Kendall <akendall@devis.com>" | ||
"M. Adam Kendall <akendall@devis.com>", | ||
"Jussi Kalliokoski <jussi.kalliokoski@gmail.com>" | ||
], | ||
"license": "MIT", | ||
"readmeFilename": "README.md" | ||
"readmeFilename": "README.md", | ||
"devDependencies": { | ||
"chai": "^1.9.1", | ||
"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" | ||
} | ||
} |
# LCOV Result Merger | ||
[![Build Status](https://travis-ci.org/mweibel/lcov-result-merger.png)](https://travis-ci.org/mweibel/lcov-result-merger) | ||
@@ -3,0 +4,0 @@ When you have multiple test suites for the same application you still want to |
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
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
7412
0
27
3
7
4
199
+ Addedthrough2@^0.5.1
+ Addedvinyl@^0.2.3
+ Addedvinyl-fs@^0.3.3
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedclone@0.2.01.0.4(transitive)
+ Addedclone-stats@0.0.1(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addeddefaults@1.0.4(transitive)
+ Addedfind-index@0.1.1(transitive)
+ Addedfirst-chunk-stream@1.0.0(transitive)
+ Addedgaze@0.5.2(transitive)
+ Addedglob@3.1.214.5.3(transitive)
+ Addedglob-stream@3.1.18(transitive)
+ Addedglob-watcher@0.0.6(transitive)
+ Addedglob2base@0.0.12(transitive)
+ Addedglobule@0.1.0(transitive)
+ Addedgraceful-fs@1.2.33.0.12(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@1.0.2(transitive)
+ Addedis-utf8@0.2.1(transitive)
+ Addedisarray@0.0.1(transitive)
+ Addedlodash@1.0.2(transitive)
+ Addedminimatch@0.2.142.0.10(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp@0.5.6(transitive)
+ Addednatives@1.1.6(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedordered-read-streams@0.1.0(transitive)
+ Addedreadable-stream@1.0.34(transitive)
+ Addedstring_decoder@0.10.31(transitive)
+ Addedstrip-bom@1.0.0(transitive)
+ Addedthrough2@0.5.10.6.5(transitive)
+ Addedunique-stream@1.0.0(transitive)
+ Addedvinyl@0.2.30.4.6(transitive)
+ Addedvinyl-fs@0.3.14(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedxtend@3.0.04.0.2(transitive)
- Removedglob@~3.2.1
- Removedglob@3.2.11(transitive)
- Removedminimatch@0.3.0(transitive)