From d92a102a8388ca7e6ff8911290cbc59ef7efc297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Wed, 1 Apr 2015 21:05:42 +0000 Subject: [PATCH 01/16] Remove `componentDidMount` function with reload. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removing the reload (and the whole `componentDidMount` function since the reload was the only thing in there) makes sure that the container view isn't reloaded when the DOM changes and so does not make a request to the container. Because of this change kitematic will not make a request to the container when hovering over the preference button. (I wasn't sure if this was used somewhere for real. If it is, I couldn't find it). Fixes #333. Signed-off-by: Kristján Oddsson --- src/ContainerHomePreview.react.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ContainerHomePreview.react.js b/src/ContainerHomePreview.react.js index 9e0d21a108..e03c448411 100644 --- a/src/ContainerHomePreview.react.js +++ b/src/ContainerHomePreview.react.js @@ -37,9 +37,6 @@ var ContainerHomePreview = React.createClass({ }); } }, - componentDidUpdate: function () { - this.reload(); - }, componentWillUnmount: function() { clearInterval(this.timer); }, From b5acaafd9e7eabc3cadf13e06729fd6fc334f3ca Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 3 Apr 2015 10:58:14 -0400 Subject: [PATCH 02/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 795d88e9c1..ce35ee50c7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![Kitematic Logo](https://cloud.githubusercontent.com/assets/251292/5269258/1b229c3c-7a2f-11e4-96f1-e7baf3c86d73.png) -Kitematic is a simple application for managing Docker containers on Mac OS X. +Kitematic is a simple application for managing Docker containers on Mac OS X and Windows (coming soon!). ## Installing Kitematic From 584c7955125c408333caf4033770604ddf38d57c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Fri, 3 Apr 2015 20:07:11 +0000 Subject: [PATCH 03/16] Replace hard-coded error message with props. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make sure that errors that happen when pulling image layers bubble up to the UI. We do this by catching errors coming from the docker client, calling the callback with that error and setting the global variable `_error` as the error we just caught. This is to make sure that when the stream ends we call the callback with the error as well as to not to over-ride it. Finally we remove the hard-coded message in the UI and display the error that gets passed in to it through the props attribute. This is the only part I'm not super sure on if we really want since it must have been set there for a reason. If I can get a re-producible test case I can make sure that it's still passing with this patch. Fixes #355. Signed-off-by: Kristján Oddsson --- src/ContainerHome.react.js | 4 +++- src/ContainerStore.js | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/ContainerHome.react.js b/src/ContainerHome.react.js index bb3c4655f1..de13f769c0 100644 --- a/src/ContainerHome.react.js +++ b/src/ContainerHome.react.js @@ -74,7 +74,9 @@ var ContainerHome = React.createClass({ if (this.props.error) { body = (
-

There was a problem connecting to the Docker Engine in the VirtualBox VM.
This could be caused because this Mac is currently connected to a VPN, blocking access to the VM. If the issue persists, please file a ticket on our GitHub repo.

+

An error occurred:

+

{this.props.error}

+

If you feel that this error is invalid, please file a ticket on our GitHub repo.

); diff --git a/src/ContainerStore.js b/src/ContainerStore.js index b0cc3940df..109a022d19 100644 --- a/src/ContainerStore.js +++ b/src/ContainerStore.js @@ -56,6 +56,12 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { var data = JSON.parse(str); console.log(data); + if (data.error) { + _error = data.error; + callback(data.error); + return; + } + if (data.status && (data.status === 'Pulling dependent layers' || data.status.indexOf('already being pulled by another client') !== -1)) { blockedCallback(); return; @@ -82,7 +88,8 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { progressCallback(totalProgress); }); stream.on('end', function () { - callback(); + callback(_error); + _error = null; }); }); }); From b67c1a912e11cea06d80fb693d7c0190a870168c Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sat, 4 Apr 2015 17:24:18 -0400 Subject: [PATCH 04/16] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ce35ee50c7..9d8d3fe3b2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [![CircleCI](https://img.shields.io/circleci/project/kitematic/kitematic.svg)](https://circleci.com/gh/kitematic/kitematic/tree/master) +[![Coverage Status](https://coveralls.io/repos/kitematic/kitematic/badge.svg)](https://coveralls.io/r/kitematic/kitematic) [![bitHound Score](https://app.bithound.io/kitematic/kitematic/badges/score.svg)](http://app.bithound.io/kitematic/kitematic) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kitematic/kitematic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) From dfe80af6e4c7ae1eea77b3403778dff55cf36b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Sun, 5 Apr 2015 17:01:18 +0000 Subject: [PATCH 05/16] Fall-back to image name as key when there is no id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a container is first started and the image is downloading there is no id set. With this patch we'll check if the container has a id and and is downloading, if so we'll substitute it with the image name and render such. This will fix the react key props warning in the developer console as well as maybe give us some sort of performance boost(?) Signed-off-by: Kristján Oddsson --- src/ContainerList.react.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ContainerList.react.js b/src/ContainerList.react.js index 1d6d25a034..9b1dcf9cb4 100644 --- a/src/ContainerList.react.js +++ b/src/ContainerList.react.js @@ -9,8 +9,14 @@ var ContainerList = React.createClass({ render: function () { var self = this; var containers = this.props.containers.map(function (container) { + var container_id = container.Id; + if (!container_id && container.State.Downloading) { + // Fall back to the container image name when there is no id. (when the + // image is downloading). + container_id = container.Image; + } return ( - + ); }); var newItem; From 9eab0501fde1b8c5c9ee5d02240eed1dc53a4319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Sun, 5 Apr 2015 15:41:01 +0000 Subject: [PATCH 06/16] Format the error message a little bit better. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The error message is actually a object and not a string so we format it a bit better with this patch. Signed-off-by: Kristján Oddsson --- src/ContainerHome.react.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ContainerHome.react.js b/src/ContainerHome.react.js index de13f769c0..530e1b2668 100644 --- a/src/ContainerHome.react.js +++ b/src/ContainerHome.react.js @@ -75,7 +75,7 @@ var ContainerHome = React.createClass({ body = (

An error occurred:

-

{this.props.error}

+

{this.props.error.statusCode} {this.props.error.reason} - {this.props.error.json}

If you feel that this error is invalid, please file a ticket on our GitHub repo.

From 603b9c5952b3b0a88d07af8e3cb0d2380825c38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Sun, 5 Apr 2015 15:42:11 +0000 Subject: [PATCH 07/16] Fetch tags when a Image card has been mounted. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For images that don't have a "latest" tag (such as `google/debian`) we fetch all the tags when the `ImageCard` component mounts and set the chosen tag to the first one in the list (so far it seems to be the latest tag where such a tag exists but we can add some logic here to choose a appropriate tag if we want). Signed-off-by: Kristján Oddsson --- src/ImageCard.react.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ImageCard.react.js b/src/ImageCard.react.js index db895f6e32..88f12d60fd 100644 --- a/src/ImageCard.react.js +++ b/src/ImageCard.react.js @@ -50,6 +50,14 @@ var ImageCard = React.createClass({ } util.exec(['open', $repoUri + this.props.image.name]); }, + componentDidMount: function() { + $.get('https://registry.hub.docker.com/v1/repositories/' + this.props.image.name + '/tags', function (result) { + this.setState({ + tags: result, + chosenTag: result[0].name + }); + }.bind(this)); + }, render: function () { var self = this; var name; From 6e56c4f66500d92e0671de37b46700795b557ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Sun, 5 Apr 2015 21:08:15 +0000 Subject: [PATCH 08/16] Change normal function in to a ES6 arrow function. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No need for `.bind(this)` with ECMAScript6 syntax! Signed-off-by: Kristján Oddsson --- src/ImageCard.react.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ImageCard.react.js b/src/ImageCard.react.js index 88f12d60fd..659d1407e6 100644 --- a/src/ImageCard.react.js +++ b/src/ImageCard.react.js @@ -31,11 +31,11 @@ var ImageCard = React.createClass({ handleTagOverlayClick: function (name) { var $tagOverlay = $(this.getDOMNode()).find('.tag-overlay'); $tagOverlay.fadeIn(300); - $.get('https://registry.hub.docker.com/v1/repositories/' + name + '/tags', function (result) { + $.get('https://registry.hub.docker.com/v1/repositories/' + name + '/tags', result => { this.setState({ tags: result }); - }.bind(this)); + }); }, handleCloseTagOverlay: function () { var $tagOverlay = $(this.getDOMNode()).find('.tag-overlay'); @@ -51,12 +51,12 @@ var ImageCard = React.createClass({ util.exec(['open', $repoUri + this.props.image.name]); }, componentDidMount: function() { - $.get('https://registry.hub.docker.com/v1/repositories/' + this.props.image.name + '/tags', function (result) { + $.get('https://registry.hub.docker.com/v1/repositories/' + this.props.image.name + '/tags', result => { this.setState({ tags: result, chosenTag: result[0].name }); - }.bind(this)); + }); }, render: function () { var self = this; From 748207797551fed3da91330c490598ac19bda32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Oddsson?= Date: Sun, 5 Apr 2015 21:14:34 +0000 Subject: [PATCH 09/16] Change variable from snake_case to camelCase. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Kristján Oddsson --- src/ContainerList.react.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ContainerList.react.js b/src/ContainerList.react.js index 9b1dcf9cb4..d2954dc603 100644 --- a/src/ContainerList.react.js +++ b/src/ContainerList.react.js @@ -9,14 +9,14 @@ var ContainerList = React.createClass({ render: function () { var self = this; var containers = this.props.containers.map(function (container) { - var container_id = container.Id; - if (!container_id && container.State.Downloading) { + var containerId = container.Id; + if (!containerId && container.State.Downloading) { // Fall back to the container image name when there is no id. (when the // image is downloading). - container_id = container.Image; + containerId = container.Image; } return ( - + ); }); var newItem; From be368f7a77c1be37f0f9f8db4f3f28b4a5699b80 Mon Sep 17 00:00:00 2001 From: Jeffrey Dean Morgan Date: Sun, 5 Apr 2015 19:51:45 -0400 Subject: [PATCH 10/16] Adding code coverage to unit tests Signed-off-by: Jeffrey Morgan --- .gitignore | 1 + .jshintrc | 2 +- README.md | 1 + package.json | 21 ++++++++++++++------- src/ContainerHome.react.js | 4 +++- src/ContainerStore.js | 9 ++++++++- src/ImageCard.react.js | 12 ++++++++++-- {__tests__ => src}/SetupStore-test.js | 13 ++++++------- {__tests__ => src}/Virtualbox-test.js | 7 +++---- 9 files changed, 47 insertions(+), 23 deletions(-) rename {__tests__ => src}/SetupStore-test.js (92%) rename {__tests__ => src}/Virtualbox-test.js (76%) diff --git a/.gitignore b/.gitignore index 7b9e66caf1..ca23db9e8a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build dist node_modules +coverage npm-debug.log # Signing Identity diff --git a/.jshintrc b/.jshintrc index 9240a3ae9f..daeaf45072 100644 --- a/.jshintrc +++ b/.jshintrc @@ -27,5 +27,5 @@ "jest": true, "pit": true }, - "predef": [ "-Promise" ] + "predef": [ "Promise" ] } diff --git a/README.md b/README.md index ce35ee50c7..9d8d3fe3b2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [![CircleCI](https://img.shields.io/circleci/project/kitematic/kitematic.svg)](https://circleci.com/gh/kitematic/kitematic/tree/master) +[![Coverage Status](https://coveralls.io/repos/kitematic/kitematic/badge.svg)](https://coveralls.io/r/kitematic/kitematic) [![bitHound Score](https://app.bithound.io/kitematic/kitematic/badges/score.svg)](http://app.bithound.io/kitematic/kitematic) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kitematic/kitematic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) diff --git a/package.json b/package.json index bbb611d8c7..057aac3a84 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "bugs": "https://github.com/kitematic/kitematic/issues", "scripts": { "start": "gulp", - "test": "jest", + "test": "jest --coverage", "release": "gulp release", "release:beta": "gulp release --beta", "preinstall": "./util/deps", @@ -28,16 +28,21 @@ "jest": { "scriptPreprocessor": "/util/preprocessor.js", "setupEnvScriptFile": "/util/testenv.js", + "collectCoverage": true, + "testDirectoryName": "src", + "testPathIgnorePatterns": [ + "/node_modules/", + "^((?!-test).)*$" + ], "unmockedModulePathPatterns": [ + "stream", "tty", "net", "crypto", - "stream", + "/node_modules/.*JSONStream", "/node_modules/object-assign", "/node_modules/underscore", - "/node_modules/react", - "/node_modules/bluebird", - "/node_modules/babel" + "/node_modules/bluebird" ] }, "docker-version": "1.5.0", @@ -51,7 +56,8 @@ "async": "^0.9.0", "bluebird": "^2.9.12", "bugsnag-js": "^2.4.7", - "dockerode": "^2.0.7", + "coveralls": "^2.11.2", + "dockerode": "^2.1.1", "exec": "0.2.0", "jquery": "^2.1.3", "minimist": "^1.1.0", @@ -76,6 +82,7 @@ "gulp-cssmin": "^0.1.6", "gulp-download-atom-shell": "0.0.4", "gulp-if": "^1.2.5", + "gulp-insert": "^0.4.0", "gulp-less": "^3.0.1", "gulp-livereload": "^3.8.0", "gulp-plumber": "^0.6.6", @@ -83,7 +90,7 @@ "gulp-shell": "^0.3.0", "gulp-sourcemaps": "^1.5.0", "gulp-util": "^3.0.4", - "jest-cli": "^0.4.0", + "jest-cli": "kitematic/jest", "jsxhint": "^0.12.1", "react-tools": "^0.12.2", "run-sequence": "^1.0.2" diff --git a/src/ContainerHome.react.js b/src/ContainerHome.react.js index bb3c4655f1..530e1b2668 100644 --- a/src/ContainerHome.react.js +++ b/src/ContainerHome.react.js @@ -74,7 +74,9 @@ var ContainerHome = React.createClass({ if (this.props.error) { body = (
-

There was a problem connecting to the Docker Engine in the VirtualBox VM.
This could be caused because this Mac is currently connected to a VPN, blocking access to the VM. If the issue persists, please file a ticket on our GitHub repo.

+

An error occurred:

+

{this.props.error.statusCode} {this.props.error.reason} - {this.props.error.json}

+

If you feel that this error is invalid, please file a ticket on our GitHub repo.

); diff --git a/src/ContainerStore.js b/src/ContainerStore.js index b0cc3940df..109a022d19 100644 --- a/src/ContainerStore.js +++ b/src/ContainerStore.js @@ -56,6 +56,12 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { var data = JSON.parse(str); console.log(data); + if (data.error) { + _error = data.error; + callback(data.error); + return; + } + if (data.status && (data.status === 'Pulling dependent layers' || data.status.indexOf('already being pulled by another client') !== -1)) { blockedCallback(); return; @@ -82,7 +88,8 @@ var ContainerStore = assign(Object.create(EventEmitter.prototype), { progressCallback(totalProgress); }); stream.on('end', function () { - callback(); + callback(_error); + _error = null; }); }); }); diff --git a/src/ImageCard.react.js b/src/ImageCard.react.js index db895f6e32..659d1407e6 100644 --- a/src/ImageCard.react.js +++ b/src/ImageCard.react.js @@ -31,11 +31,11 @@ var ImageCard = React.createClass({ handleTagOverlayClick: function (name) { var $tagOverlay = $(this.getDOMNode()).find('.tag-overlay'); $tagOverlay.fadeIn(300); - $.get('https://registry.hub.docker.com/v1/repositories/' + name + '/tags', function (result) { + $.get('https://registry.hub.docker.com/v1/repositories/' + name + '/tags', result => { this.setState({ tags: result }); - }.bind(this)); + }); }, handleCloseTagOverlay: function () { var $tagOverlay = $(this.getDOMNode()).find('.tag-overlay'); @@ -50,6 +50,14 @@ var ImageCard = React.createClass({ } util.exec(['open', $repoUri + this.props.image.name]); }, + componentDidMount: function() { + $.get('https://registry.hub.docker.com/v1/repositories/' + this.props.image.name + '/tags', result => { + this.setState({ + tags: result, + chosenTag: result[0].name + }); + }); + }, render: function () { var self = this; var name; diff --git a/__tests__/SetupStore-test.js b/src/SetupStore-test.js similarity index 92% rename from __tests__/SetupStore-test.js rename to src/SetupStore-test.js index 1410a883b0..42add6fd37 100644 --- a/__tests__/SetupStore-test.js +++ b/src/SetupStore-test.js @@ -1,10 +1,9 @@ -jest.dontMock('../src/SetupStore'); -var setupStore = require('../src/SetupStore'); -var virtualBox = require('../src/VirtualBox'); -var util = require('../src/Util'); -var machine = require('../src/DockerMachine'); -var setupUtil = require('../src/SetupUtil'); -var Promise = require('bluebird'); +jest.dontMock('./SetupStore'); +var setupStore = require('./SetupStore'); +var virtualBox = require('./VirtualBox'); +var util = require('./Util'); +var machine = require('./DockerMachine'); +var setupUtil = require('./SetupUtil'); describe('SetupStore', function () { describe('download step', function () { diff --git a/__tests__/Virtualbox-test.js b/src/Virtualbox-test.js similarity index 76% rename from __tests__/Virtualbox-test.js rename to src/Virtualbox-test.js index 1a8efa7aab..567210a08a 100644 --- a/__tests__/Virtualbox-test.js +++ b/src/Virtualbox-test.js @@ -1,7 +1,6 @@ -jest.dontMock('../src/VirtualBox'); -var virtualBox = require('../src/VirtualBox'); -var util = require('../src/Util'); -var Promise = require('bluebird'); +jest.dontMock('./VirtualBox'); +var virtualBox = require('./VirtualBox'); +var util = require('./Util'); describe('VirtualBox', function () { it('returns the right command', function () { From 832ba18c027a15e5d5d27ed274bb8d0289b4d211 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 6 Apr 2015 12:20:02 -0400 Subject: [PATCH 11/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d8d3fe3b2..84d453e802 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![CircleCI](https://img.shields.io/circleci/project/kitematic/kitematic.svg)](https://circleci.com/gh/kitematic/kitematic/tree/master) -[![Coverage Status](https://coveralls.io/repos/kitematic/kitematic/badge.svg)](https://coveralls.io/r/kitematic/kitematic) +[![Coverage Status](https://coveralls.io/repos/kitematic/kitematic/badge.svg?branch=master)](https://coveralls.io/r/kitematic/kitematic?branch=master) [![bitHound Score](https://app.bithound.io/kitematic/kitematic/badges/score.svg)](http://app.bithound.io/kitematic/kitematic) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kitematic/kitematic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) From 4b96ac9bc92d17e2e8117afbf50851f47948c552 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 6 Apr 2015 13:38:08 -0400 Subject: [PATCH 12/16] Update circle.yml --- circle.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/circle.yml b/circle.yml index 0ddf9ac841..9933147169 100644 --- a/circle.yml +++ b/circle.yml @@ -5,3 +5,6 @@ dependencies: cache_directories: - "resources" - "node_modules" +notify: + webhooks: + - url: https://coveralls.io/webhook From f730b5ebf2945a0d9becd7f96fd6d9e18964a783 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 6 Apr 2015 13:46:46 -0400 Subject: [PATCH 13/16] adding travis ci --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..8d530885bf --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: node_js +node_js: + - "0.10" + +sudo: false + +cache: + - resources + - node_modules + +after_success: + which ./node_modules/coveralls/bin/coveralls.js && cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js From ec43f48537dea19ed11768d4215826b7bb706415 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 6 Apr 2015 13:49:31 -0400 Subject: [PATCH 14/16] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8d530885bf..2fd698f0cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,4 @@ cache: - node_modules after_success: - which ./node_modules/coveralls/bin/coveralls.js && cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + - which ./node_modules/coveralls/bin/coveralls.js && cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js From 063e923065c59b7e35f9bd40e2c2b96ad7fc84d8 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 6 Apr 2015 13:58:11 -0400 Subject: [PATCH 15/16] Update .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 2fd698f0cb..dabf931807 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ node_js: sudo: false cache: + directories: - resources - node_modules From b6039efc768c29e3c876a2e77ac712ceef9925c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Mon, 6 Apr 2015 13:58:47 -0400 Subject: [PATCH 16/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 84d453e802..bb6f6b105e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![CircleCI](https://img.shields.io/circleci/project/kitematic/kitematic.svg)](https://circleci.com/gh/kitematic/kitematic/tree/master) +[![Build Status](https://travis-ci.org/kitematic/kitematic.svg?branch=master)](https://travis-ci.org/kitematic/kitematic) [![Coverage Status](https://coveralls.io/repos/kitematic/kitematic/badge.svg?branch=master)](https://coveralls.io/r/kitematic/kitematic?branch=master) [![bitHound Score](https://app.bithound.io/kitematic/kitematic/badges/score.svg)](http://app.bithound.io/kitematic/kitematic) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kitematic/kitematic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)