diff options
| author | Gregg Caines <[email protected]> | 2013-08-24 18:00:40 -0700 |
|---|---|---|
| committer | Gregg Caines <[email protected]> | 2013-08-24 18:00:40 -0700 |
| commit | 0c817523ee2a74a7912250056f474156dc755100 (patch) | |
| tree | b3ac61d91440216fddc7537cf1af8090fd4b6cc8 | |
| parent | 829e407f57e6a0abb15cafd69a0983165777535b (diff) | |
| download | node-coveralls-0c817523ee2a74a7912250056f474156dc755100.tar.xz node-coveralls-0c817523ee2a74a7912250056f474156dc755100.zip | |
removed exec-sync. version 2.2.0 candidate
| -rw-r--r-- | lib/fetchGitData.js | 90 | ||||
| -rw-r--r-- | lib/getOptions.js | 35 | ||||
| -rw-r--r-- | lib/handleInput.js | 29 | ||||
| -rw-r--r-- | package.json | 5 | ||||
| -rw-r--r-- | test/convertLcovToCoveralls.js | 27 | ||||
| -rw-r--r-- | test/fetchGitData.js | 212 | ||||
| -rw-r--r-- | test/getOptions.js | 114 | ||||
| -rw-r--r-- | test/handleInput.js | 12 |
8 files changed, 301 insertions, 223 deletions
diff --git a/lib/fetchGitData.js b/lib/fetchGitData.js index 629d650..a77b4a8 100644 --- a/lib/fetchGitData.js +++ b/lib/fetchGitData.js @@ -1,41 +1,39 @@ -var exec = require("exec-sync"); +var exec = require('child_process').exec; var logger = require('./logger')(); -var fetchGitData = function(git) { +var fetchGitData = function(git, cb) { + if (!cb){ + throw new Error("fetchGitData requires a callback"); + } var i; var execGit = true; var head = { "author_name": { "format": "'%aN'", - "default": "Unknown Author" }, "author_email": { "format": "'%ae'", - "default": "" }, "committer_name": { "format": "'%cN'", - "default": "Unknown Committer" }, "committer_email": { "format": "'%ce'", - "default" :"" }, "message": { "format": "'%s'", - "default": "Unknown Commit Message" } }; var remotes = {}; //-- Malformed/undefined git object if ('undefined' === typeof git) { - throw new Error('No options passed'); + return cb(new Error('No options passed')); } else if (!git.hasOwnProperty('head')) { - throw new Error('You must provide the head'); + return cb(new Error('You must provide the head')); } else if (!git.head.hasOwnProperty('id')) { - throw new Error('You must provide the head.id'); + return cb(new Error('You must provide the head.id')); } function saveRemote(name, url, push) { @@ -71,37 +69,53 @@ var fetchGitData = function(git) { } //-- Use git? - try { - exec("git log -1 " + git.head.id + " --pretty=format:'%H'"); - } catch (e) { - execGit = false; - } - - //-- Head - for (i in head) { - if (!git.head.hasOwnProperty(i)) { - if (execGit) { - git.head[i] = exec("git log -1 " + git.head.id + " --pretty=format:" + head[i].format); - } else { - git.head[i] = head[i].default; - } + exec("git log -1 " + git.head.id + " --pretty=format:'%H'", function(err, response){ + if (err){ + // git is not available... + git.head.author_name = git.head.author_name || "Unknown Author"; + git.head.author_email = git.head.author_email || ""; + git.head.committer_name = git.head.committer_name || "Unknown Committer"; + git.head.committer_email = git.head.committer_email || ""; + git.head.message = git.head.message || "Unknown Commit Message"; + return cb(null, git); } - } - - if (execGit) { - - //-- Branch - git.branch = exec("git branch").split("\n")[0].replace(/^\*\ /, "").trim(); - exec("git remote -v").split("\n").forEach(function(remote) { - remote = remote.split(/\s/); - saveRemote(remote[0], remote[1]); + //-- Head + var commands = []; + var fields = []; + for (var field in head) { + fields.push(field); + var command = "git log -1 " + git.head.id + " --pretty=format:" + head[field].format; + commands.push(command); + } + var i = 0; + var remaining = commands.length; + commands.forEach(function(command){ + var field = fields[i]; + i++; + exec(command, function(err, response){ + if (err) return cb(err); + git.head[field] = response; + remaining--; + if (remaining === 0){ + //-- Branch + exec("git branch", function(err, branches){ + if (err) return cb(err); + git.branch = branches.split("\n")[0].replace(/^\*\ /, "").trim(); + exec("git remote -v", function(err, remotes){ + if (err) return cb(err); + remotes.split("\n").forEach(function(remote) { + remote = remote.split(/\s/); + saveRemote(remote[0], remote[1]); + }); + return cb(null, git); + }); + }); + } + }); }); - - } - - return git; - + }); }; + module.exports = fetchGitData; diff --git a/lib/getOptions.js b/lib/getOptions.js index deb1072..97c79d5 100644 --- a/lib/getOptions.js +++ b/lib/getOptions.js @@ -2,9 +2,12 @@ var fs = require('fs'); var path = require('path'); var yaml = require('yaml'); var logger = require('./logger')(); -var git = require('./fetchGitData'); +var fetchGitData = require('./fetchGitData'); -var getOptions = function(){ +var getOptions = function(cb){ + if (!cb){ + throw new Error('getOptions requires a callback'); + } var options = {}; // try to get filepath from the command-line @@ -41,14 +44,6 @@ var getOptions = function(){ git_branch = process.env.CIRCLE_BRANCH; } - if (git_commit){ - options.git = git({ - head: { - id: git_commit - }, - branch: git_branch - }); - } options.run_at = process.env.COVERALLS_RUN_AT || JSON.stringify(new Date()).slice(1, -1); if (process.env.COVERALLS_SERVICE_NAME){ @@ -73,7 +68,25 @@ var getOptions = function(){ logger.warn("Repo token could not be determined. Continuing without it."); } } - return options; + + if (git_commit){ + fetchGitData({ + head: { + id: git_commit + }, + branch: git_branch + }, function(err, git){ + if (err){ + logger.warn('there was an error getting git data: ', err); + } else { + options.git = git; + } + return cb(err, options); + }); + } else { + return cb(null, options); + } + }; module.exports = getOptions; diff --git a/lib/handleInput.js b/lib/handleInput.js index 8dee588..1435c1c 100644 --- a/lib/handleInput.js +++ b/lib/handleInput.js @@ -3,24 +3,29 @@ var logger = require('./logger')(); var handleInput = function(input){ logger.debug(input); - var options = index.getOptions(); - logger.debug(options); - - index.convertLcovToCoveralls(input, options, function(err, postData){ + var options = index.getOptions(function(err, options){ if (err){ - logger.error("error from convertLcovToCoveralls"); + logger.error("error from getOptions"); throw err; } - logger.info("sending this to coveralls.io: ", JSON.stringify(postData)); - index.sendToCoveralls(postData, function(err, response, body){ + logger.debug(options); + + index.convertLcovToCoveralls(input, options, function(err, postData){ if (err){ + logger.error("error from convertLcovToCoveralls"); throw err; } - if (response.statusCode >= 400){ - throw "Bad response: " + response.statusCode + " " + body; - } - logger.debug(response.statusCode); - logger.debug(body); + logger.info("sending this to coveralls.io: ", JSON.stringify(postData)); + index.sendToCoveralls(postData, function(err, response, body){ + if (err){ + throw err; + } + if (response.statusCode >= 400){ + throw "Bad response: " + response.statusCode + " " + body; + } + logger.debug(response.statusCode); + logger.debug(body); + }); }); }); diff --git a/package.json b/package.json index b3816ba..72e6267 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "coverage", "coveralls" ], - "version": "2.1.0", + "version": "2.2.0", "bugs": { "url": "https://github.com/cainus/node-coveralls/issues" }, @@ -33,8 +33,7 @@ "yaml": "0.2.3", "request": "2.16.2", "lcov-parse": "0.0.4", - "log-driver": "1.2.1", - "exec-sync": "~0.1.6" + "log-driver": "1.2.1" }, "devDependencies": { "blanket": "~1.1.5", diff --git a/test/convertLcovToCoveralls.js b/test/convertLcovToCoveralls.js index eab2dd8..2e07a87 100644 --- a/test/convertLcovToCoveralls.js +++ b/test/convertLcovToCoveralls.js @@ -6,7 +6,7 @@ var logger = require('../lib/logger'); logger = require('log-driver')({level : false}); describe("convertLcovToCoveralls", function(){ - it ("should convert a simple lcov file", function(){ + it ("should convert a simple lcov file", function(done){ process.env.TRAVIS_JOB_ID = -1; var path = __dirname + "/../fixtures/onefile.lcov"; var input = fs.readFileSync(path, "utf8"); @@ -17,10 +17,11 @@ describe("convertLcovToCoveralls", function(){ output.source_files[0].source.split("\n").length.should.equal(173); output.source_files[0].coverage[54].should.equal(0); output.source_files[0].coverage[60].should.equal(0); + done(); }); }); - it ("should pass on all appropriate parameters from the environment", function(){ + it ("should pass on all appropriate parameters from the environment", function(done){ process.env.TRAVIS_JOB_ID = -1; process.env.COVERALLS_GIT_COMMIT = "GIT_HASH"; process.env.COVERALLS_GIT_BRANCH = "master"; @@ -28,18 +29,19 @@ describe("convertLcovToCoveralls", function(){ process.env.COVERALLS_SERVICE_JOB_ID = "SERVICE_JOB_ID"; process.env.COVERALLS_REPO_TOKEN = "REPO_TOKEN"; - var options = getOptions(); - var path = __dirname + "/../fixtures/onefile.lcov"; - var input = fs.readFileSync(path, "utf8"); - var libpath = "fixtures/lib"; - options.filepath = libpath; - convertLcovToCoveralls(input, options, function(err, output){ - should.not.exist(err); - console.log(output); - //output.git.should.equal("GIT_HASH"); + getOptions(function(err, options){ + var path = __dirname + "/../fixtures/onefile.lcov"; + var input = fs.readFileSync(path, "utf8"); + var libpath = "fixtures/lib"; + options.filepath = libpath; + convertLcovToCoveralls(input, options, function(err, output){ + should.not.exist(err); + //output.git.should.equal("GIT_HASH"); + done(); + }); }); }); - it ("should work with a relative path as well", function(){ + it ("should work with a relative path as well", function(done){ process.env.TRAVIS_JOB_ID = -1; var path = __dirname + "/../fixtures/onefile.lcov"; var input = fs.readFileSync(path, "utf8"); @@ -48,6 +50,7 @@ describe("convertLcovToCoveralls", function(){ should.not.exist(err); output.source_files[0].name.should.equal("index.js"); output.source_files[0].source.split("\n").length.should.equal(173); + done(); }); }); }); diff --git a/test/fetchGitData.js b/test/fetchGitData.js index 94d243f..de5c474 100644 --- a/test/fetchGitData.js +++ b/test/fetchGitData.js @@ -1,5 +1,5 @@ var should = require('should'); -var git = require('../lib/fetchGitData'); +var fetchGitData = require('../lib/fetchGitData'); var getOptions = require('../index').getOptions; describe("fetchGitData", function(){ @@ -7,60 +7,46 @@ describe("fetchGitData", function(){ process.env = {}; }); it("should throw an error when no data is passed", function() { - git.should.throw(/No options passed/); + fetchGitData.should.throw(/fetchGitData requires a callback/); }); - it("should throw an error if no head is provided", function() { - var fn = function() { - git({}); - }; - fn.should.throw(/You must provide the head/); + it("should throw an error if no head is provided", function(done) { + fetchGitData({ + }, function(err){ + err.should.match(/You must provide the head/); + done(); + }); }); - it("should throw an error if no head.id is provided", function() { - var fn = function() { - git({ - head: {} - }); - }; - fn.should.throw(/You must provide the head.id/); + it("should throw an error if no head.id is provided", function(done) { + fetchGitData({ + head: {} + }, function(err){ + err.should.match(/You must provide the head.id/); + done(); + }); }); - it("should return default values", function() { - var options = git({ + it("should return default values", function(done) { + var options = fetchGitData({ head: { id: "COMMIT_HASH" } - }); - options.should.eql({ - "head": { - "id": "COMMIT_HASH", - "author_name": "Unknown Author", - "author_email": "", - "committer_name": "Unknown Committer", - "committer_email": "", - "message": "Unknown Commit Message" - }, - "branch": "", - "remotes": [] + }, function(err, options){ + options.should.eql({ + "head": { + "id": "COMMIT_HASH", + "author_name": "Unknown Author", + "author_email": "", + "committer_name": "Unknown Committer", + "committer_email": "", + "message": "Unknown Commit Message" + }, + "branch": "", + "remotes": [] + }); + done(); }); }); - it("should override default values", function() { - var options = git({ - "head": { - "id": "COMMIT_HASH", - "author_name": "MY AUTHOR", - "author_email": "", - "committer_name": "MY COMMITTER", - "committer_email": "", - "message": "MY COMMIT MESSAGE" - }, - "branch": "TEST", - "remotes": [ - { - "name": "TEST", - "url": "test-url" - } - ] - }); - options.should.eql({ + it("should override default values", function(done) { + var options = fetchGitData({ "head": { "id": "COMMIT_HASH", "author_name": "MY AUTHOR", @@ -76,46 +62,71 @@ describe("fetchGitData", function(){ "url": "test-url" } ] + }, function(err, options){ + options.should.eql({ + "head": { + "id": "COMMIT_HASH", + "author_name": "MY AUTHOR", + "author_email": "", + "committer_name": "MY COMMITTER", + "committer_email": "", + "message": "MY COMMIT MESSAGE" + }, + "branch": "TEST", + "remotes": [ + { + "name": "TEST", + "url": "test-url" + } + ] + }); + done(); }); }); - it("should convert git.branch to a string", function() { - var objectToString = git({ + it("should convert git.branch to a string", function(done) { + fetchGitData({ "head": { "id": "COMMIT_HASH" }, "branch": { "covert": "to a string" } + }, function(err, str){ + str.branch.should.be.a("string"); + fetchGitData({ + "head": { + "id": "COMMIT_HASH" + }, + "branch": ["convert", "to", "a", "string"] + }, function(err, str){ + str.branch.should.be.a("string"); + done(); + }); }); - var arrayToString = git({ - "head": { - "id": "COMMIT_HASH" - }, - "branch": ["convert", "to", "a", "string"] - }); - objectToString.branch.should.be.a("string"); - arrayToString.branch.should.be.a("string"); }); - it("should convert git.remotes to an array", function() { - var stringToArray = git({ + it("should convert git.remotes to an array", function(done) { + fetchGitData({ "head": { "id": "COMMIT_HASH" }, "remotes": "convert from string to an array" + }, function(err, arr){ + arr.remotes.should.be.instanceof(Array); + fetchGitData({ + "head": { + "id": "COMMIT_HASH" + }, + "remotes": { + "convert": "from object to an array" + } + }, function(err, arr){ + arr.remotes.should.be.instanceof(Array); + done(); + }); }); - var objectToArray = git({ - "head": { - "id": "COMMIT_HASH" - }, - "remotes": { - "convert": "from object to an array" - } - }); - stringToArray.remotes.should.be.instanceof(Array); - objectToArray.remotes.should.be.instanceof(Array); }); - it("should save passed remotes", function() { - var options = git({ + it("should save passed remotes", function(done) { + fetchGitData({ "head": { "id": "COMMIT_HASH" }, @@ -125,36 +136,41 @@ describe("fetchGitData", function(){ "url": "https://my.test.url" } ] - }); - options.should.eql({ - "head": { - "id": "COMMIT_HASH", - "author_name": "Unknown Author", - "author_email": "", - "committer_name": "Unknown Committer", - "committer_email": "", - "message": "Unknown Commit Message" - }, - "branch": "", - "remotes": [ - { - "name": "test", - "url": "https://my.test.url" - } - ] + }, function(err, options){ + options.should.eql({ + "head": { + "id": "COMMIT_HASH", + "author_name": "Unknown Author", + "author_email": "", + "committer_name": "Unknown Committer", + "committer_email": "", + "message": "Unknown Commit Message" + }, + "branch": "", + "remotes": [ + { + "name": "test", + "url": "https://my.test.url" + } + ] + }); + done(); }); }); - it("should execute git commands when a valid commit hash is given", function() { + it("should execute git commands when a valid commit hash is given", function(done) { process.env.COVERALLS_GIT_COMMIT = "HEAD"; process.env.COVERALLS_GIT_BRANCH = "master"; - var options = getOptions().git; - options.head.should.be.a("object"); - options.head.author_name.should.not.equal("Unknown Author"); - options.head.committer_name.should.not.equal("Unknown Committer"); - options.head.message.should.not.equal("Unknown Commit Message"); - options.branch.should.be.a("string"); - options.should.have.property("remotes"); - options.remotes.should.be.instanceof(Array); - options.remotes.length.should.be.above(0); + getOptions(function(err, options){ + options = options.git; + options.head.should.be.a("object"); + options.head.author_name.should.not.equal("Unknown Author"); + options.head.committer_name.should.not.equal("Unknown Committer"); + options.head.message.should.not.equal("Unknown Commit Message"); + options.branch.should.be.a("string"); + options.should.have.property("remotes"); + options.remotes.should.be.instanceof(Array); + options.remotes.length.should.be.above(0); + done(); + }); }); }); diff --git a/test/getOptions.js b/test/getOptions.js index ba3b7f0..67276af 100644 --- a/test/getOptions.js +++ b/test/getOptions.js @@ -5,77 +5,105 @@ describe("getOptions", function(){ beforeEach(function(){ process.env = {}; }); - it ("should get a filepath if there is one", function(){ + it ("should get a filepath if there is one", function(done){ process.argv[2] = "somepath"; - getOptions().filepath.should.equal("somepath"); + getOptions(function(err, options){ + options.filepath.should.equal("somepath"); + done(); + }); }); - it ("should get a filepath if there is one, even in verbose mode", function(){ + it ("should get a filepath if there is one, even in verbose mode", function(done){ process.argv[2] = "--verbose"; process.argv[3] = "somepath"; - getOptions().filepath.should.equal("somepath"); + getOptions(function(err, options){ + options.filepath.should.equal("somepath"); + done(); + }); }); - it ("should set service_job_id if it exists", function(){ + it ("should set service_job_id if it exists", function(done){ process.env.COVERALLS_SERVICE_JOB_ID = "SERVICE_JOB_ID"; - getOptions().service_job_id.should.equal("SERVICE_JOB_ID"); + getOptions(function(err, options){ + options.service_job_id.should.equal("SERVICE_JOB_ID"); + done(); + }); }); - it ("should set git hash if it exists", function(){ + it ("should set git hash if it exists", function(done){ process.env.COVERALLS_GIT_COMMIT = "e3e3e3e3e3e3e3e3e"; - getOptions().git.head.id.should.equal("e3e3e3e3e3e3e3e3e"); + getOptions(function(err, options){ + options.git.head.id.should.equal("e3e3e3e3e3e3e3e3e"); + done(); + }); }); - it ("should set git hash if it exists", function(){ + it ("should set git hash if it exists", function(done){ process.env.COVERALLS_GIT_COMMIT = "e3e3e3e3e3e3e3e3e"; process.env.COVERALLS_GIT_BRANCH = "master"; - getOptions().git.branch.should.equal("master"); + getOptions(function(err, options){ + options.git.branch.should.equal("master"); + done(); + }); }); - it ("should set repo_token if it exists", function(){ + it ("should set repo_token if it exists", function(done){ process.env.COVERALLS_REPO_TOKEN = "REPO_TOKEN"; - getOptions().repo_token.should.equal("REPO_TOKEN"); + getOptions(function(err, options){ + options.repo_token.should.equal("REPO_TOKEN"); + done(); + }); }); - it ("should set service_name if it exists", function(){ + it ("should set service_name if it exists", function(done){ process.env.COVERALLS_SERVICE_NAME = "SERVICE_NAME"; - getOptions().service_name.should.equal("SERVICE_NAME"); + getOptions(function(err, options){ + options.service_name.should.equal("SERVICE_NAME"); + done(); + }); }); - it ("should set service_name and service_job_id if it's running on travis-ci", function(){ + it ("should set service_name and service_job_id if it's running on travis-ci", function(done){ process.env.TRAVIS = "TRUE"; process.env.TRAVIS_JOB_ID = "1234"; - getOptions().service_name.should.equal("travis-ci"); - getOptions().service_job_id.should.equal("1234"); + getOptions(function(err, options){ + options.service_name.should.equal("travis-ci"); + options.service_job_id.should.equal("1234"); + done(); + }); }); - it ("should set service_name and service_job_id if it's running on jenkins", function(){ + it ("should set service_name and service_job_id if it's running on jenkins", function(done){ process.env.JENKINS_URL = "something"; process.env.BUILD_ID = "1234"; process.env.GIT_COMMIT = "a12s2d3df4f435g45g45g67h5g6"; process.env.GIT_BRANCH = "master"; - var options = getOptions(); - options.service_name.should.equal("jenkins"); - options.service_job_id.should.equal("1234"); - options.git.should.eql({ head: - { id: 'a12s2d3df4f435g45g45g67h5g6', - author_name: 'Unknown Author', - author_email: '', - committer_name: 'Unknown Committer', - committer_email: '', - message: 'Unknown Commit Message' }, - branch: 'master', - remotes: [] }); + getOptions(function(err, options){ + options.service_name.should.equal("jenkins"); + options.service_job_id.should.equal("1234"); + options.git.should.eql({ head: + { id: 'a12s2d3df4f435g45g45g67h5g6', + author_name: 'Unknown Author', + author_email: '', + committer_name: 'Unknown Committer', + committer_email: '', + message: 'Unknown Commit Message' }, + branch: 'master', + remotes: [] }); + done(); + }); }); - it ("should set service_name and service_job_id if it's running on circleci", function(){ + it ("should set service_name and service_job_id if it's running on circleci", function(done){ process.env.CIRCLECI = true; process.env.CIRCLE_BRANCH = "master"; process.env.CIRCLE_BUILD_NUM = "1234"; process.env.CIRCLE_SHA1 = "e3e3e3e3e3e3e3e3e"; - var options = getOptions(); - options.service_name.should.equal("circleci"); - options.service_job_id.should.equal("1234"); - options.git.should.eql({ head: - { id: 'e3e3e3e3e3e3e3e3e', - author_name: 'Unknown Author', - author_email: '', - committer_name: 'Unknown Committer', - committer_email: '', - message: 'Unknown Commit Message' }, - branch: 'master', - remotes: [] }); + getOptions(function(err, options){ + options.service_name.should.equal("circleci"); + options.service_job_id.should.equal("1234"); + options.git.should.eql({ head: + { id: 'e3e3e3e3e3e3e3e3e', + author_name: 'Unknown Author', + author_email: '', + committer_name: 'Unknown Committer', + committer_email: '', + message: 'Unknown Commit Message' }, + branch: 'master', + remotes: [] }); + done(); }); + }); }); diff --git a/test/handleInput.js b/test/handleInput.js index 45f0482..f06e8a4 100644 --- a/test/handleInput.js +++ b/test/handleInput.js @@ -9,8 +9,8 @@ describe("handleInput", function(){ sinon.restoreAll(); }); it ("throws an error when there's an error sending", function(done){ - sinon.stub(index, 'getOptions', function(){ - return {}; + sinon.stub(index, 'getOptions', function(cb){ + return cb(null, {}); }); sinon.stub(index, 'sendToCoveralls', function(postData, cb){ try { @@ -25,8 +25,8 @@ describe("handleInput", function(){ index.handleInput(input); }); it ("throws an error when there's a bad status code", function(done){ - sinon.stub(index, 'getOptions', function(){ - return {}; + sinon.stub(index, 'getOptions', function(cb){ + return cb(null, {}); }); sinon.stub(index, 'sendToCoveralls', function(postData, cb){ try { @@ -41,8 +41,8 @@ describe("handleInput", function(){ index.handleInput(input); }); it ("completes successfully when there are now errors", function(done){ - sinon.stub(index, 'getOptions', function(){ - return {}; + sinon.stub(index, 'getOptions', function(cb){ + return cb(null, {}); }); sinon.stub(index, 'sendToCoveralls', function(postData, cb){ cb(null, {statusCode : 200}, "body"); |
