diff --git a/.gitignore b/.gitignore index 4316ad2eb7..e8be61e269 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +.swp build dist node_modules diff --git a/__tests__/Boot2Docker-test.js b/__tests__/Boot2Docker-test.js index 897b427194..5d9482128c 100644 --- a/__tests__/Boot2Docker-test.js +++ b/__tests__/Boot2Docker-test.js @@ -6,14 +6,6 @@ var util = require('../src/Util'); var Promise = require('bluebird'); describe('Boot2Docker', () => { - pit('cli version is parsed correctly', function () { - util.exec.mockReturnValueOnce(Promise.resolve('Boot2Docker-cli version: v1.4.1\nGit commit: 43241cb')); - return boot2docker.cliversion().then(version => { - expect(util.exec).toBeCalledWith([boot2docker.command(), 'version']); - expect(version).toBe('1.4.1'); - }); - }); - it('iso version parsed correctly', function () { fs.readFileSync.mockReturnValueOnce('9adjaldijaslkjd123Boot2Docker-v1.4.1aisudhha82jj123'); expect(boot2docker.isoversion()).toBe('1.4.1'); diff --git a/__tests__/util/reset b/__tests__/util/reset index ca8de23bde..0c5afc1cdd 100755 --- a/__tests__/util/reset +++ b/__tests__/util/reset @@ -4,10 +4,10 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" sudo rm -f /usr/local/bin/docker sudo rm -f /usr/local/bin/boot2docker +pkill VirtualBox +pkill VBox rm -rf ~/Library/Application\ Support/Kitematic/ rm -rf ~/.boot2docker rm -rf ~/VirtualBox\ VMs/boot2docker-vm rm -rf ~/Library/VirtualBox/ -pkill VBox -pkill VirtualBox $DIR/VirtualBox_Uninstall.tool diff --git a/package.json b/package.json index dbf4ea630d..a9db93d138 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "virtualbox-version": "4.3.22", "virtualbox-filename": "VirtualBox-4.3.22.pkg", "virtualbox-checksum": "4a7dff25bdeef0d112e16ac11bee6d52e856d36bb412aa75576036ba560082eb", - "virtualbox-required-version": "4.3.12", + "virtualbox-required-version": "4.3.0", "dependencies": { "ansi-to-html": "0.2.0", "async": "^0.9.0", diff --git a/src/Boot2Docker.js b/src/Boot2Docker.js index 7a8b8acbc7..f643cf8d51 100644 --- a/src/Boot2Docker.js +++ b/src/Boot2Docker.js @@ -16,18 +16,6 @@ var Boot2Docker = { return null; } }, - cliversion: function () { - return util.exec([Boot2Docker.command(), 'version']).then(stdout => { - var match = stdout.match(/version: v(\d+\.\d+\.\d+)/); - if (!match || match.length < 2) { - return Promise.reject('Could not parse the boot2docker cli version.'); - } else { - return Promise.resolve(match[1]); - } - }).catch(err => { - return Promise.reject(err); - }); - }, isoversion: function () { try { var data = fs.readFileSync(path.join(util.home(), '.boot2docker', 'boot2docker.iso'), 'utf8'); diff --git a/src/Setup.react.js b/src/Setup.react.js index f97495f33d..891c97eecf 100644 --- a/src/Setup.react.js +++ b/src/Setup.react.js @@ -83,10 +83,10 @@ var Setup = React.createClass({
-

Installation Cancelled

-

Couldn't Install

+

Setup Cancelled

+

Couldn't Install Requirements

Kitematic didn't receive the administrative privileges required to install or upgrade VirtualBox & Docker.

-

Please retry or download & install VirutalBox manually from the official Oracle website.

+

Please click retry. If VirtualBox is not installed, you can download & install it manually from the official Oracle website.

@@ -106,7 +106,7 @@ var Setup = React.createClass({
-

Installation Error

+

Setup Error

We're Sorry!

There seems to have been an unexpected error with Kitematic:

{this.state.error}
{this.state.error.message}

diff --git a/src/SetupStore.js b/src/SetupStore.js index 8160f9bbc8..0c62637c52 100644 --- a/src/SetupStore.js +++ b/src/SetupStore.js @@ -143,8 +143,9 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { var isoversion = boot2docker.isoversion(); var required = {}; var vboxfile = path.join(util.supportDir(), packagejson['virtualbox-filename']); - required.download = !virtualBox.installed() && (!fs.existsSync(vboxfile) || setupUtil.checksum(vboxfile) !== packagejson['virtualbox-checksum']); - required.install = !virtualBox.installed() || setupUtil.needsBinaryFix() || setupUtil.compareVersions(yield virtualBox.version(), packagejson['virtualbox-required-version']) < 0; + var vboxUpgradeRequired = setupUtil.compareVersions(yield virtualBox.version(), packagejson['virtualbox-required-version']) < 0; + required.download = vboxUpgradeRequired || !virtualBox.installed() && (!fs.existsSync(vboxfile) || setupUtil.checksum(vboxfile) !== packagejson['virtualbox-checksum']); + required.install = vboxUpgradeRequired || !virtualBox.installed() || setupUtil.needsBinaryFix(); required.init = !(yield boot2docker.exists()) || !isoversion || setupUtil.compareVersions(isoversion, boot2docker.version()) < 0; required.start = required.install || required.init || (yield boot2docker.status()) !== 'running'; diff --git a/src/SetupUtil.js b/src/SetupUtil.js index 381ec30119..5598ecaa01 100644 --- a/src/SetupUtil.js +++ b/src/SetupUtil.js @@ -9,6 +9,9 @@ var util = require('./Util'); var SetupUtil = { needsBinaryFix: function () { + if (!fs.existsSync('/usr/local') || !fs.existsSync('/usr/local/bin')) { + return true; + } if (!fs.existsSync('/usr/local/bin/docker') && !fs.existsSync('/usr/local/bin/boot2docker')) { return fs.statSync('/usr/local/bin').gid !== 80 || fs.statSync('/usr/local/bin').uid !== process.getuid(); } diff --git a/src/Util.js b/src/Util.js index 0b036ae320..9d47e5b921 100644 --- a/src/Util.js +++ b/src/Util.js @@ -40,7 +40,8 @@ module.exports = { }, copyBinariesCmd: function () { var packagejson = this.packagejson(); - var cmd = []; + var cmd = ['mkdir', '-p', '/usr/local/bin']; + cmd.push('&&'); cmd.push.apply(cmd, this.copycmd(this.escapePath(path.join(this.resourceDir(), 'boot2docker-' + packagejson['boot2docker-version'])), '/usr/local/bin/boot2docker')); cmd.push('&&'); cmd.push.apply(cmd, this.copycmd(this.escapePath(path.join(this.resourceDir(), 'docker-' + packagejson['docker-version'])), '/usr/local/bin/docker')); diff --git a/src/VirtualBox.js b/src/VirtualBox.js index 880a06b806..0ce03e1f9a 100644 --- a/src/VirtualBox.js +++ b/src/VirtualBox.js @@ -20,14 +20,14 @@ var VirtualBox = { }).catch(reject); }); }, - poweroffall: function () { + saveall: function () { if (!this.installed()) { return Promise.reject('VirtualBox not installed.'); } - return util.exec(this.command() + ' list runningvms | sed -E \'s/.*\\{(.*)\\}/\\1/\' | xargs -L1 -I {} ' + this.command() + ' controlvm {} poweroff'); + return util.exec(this.command() + ' list runningvms | sed -E \'s/.*\\{(.*)\\}/\\1/\' | xargs -L1 -I {} ' + this.command() + ' controlvm {} savestate'); }, killall: function () { - return this.poweroffall().then(() => { + return this.saveall().then(() => { return util.exec(['pkill', 'VirtualBox']); }).then(() => { return util.exec(['pkill', 'VBox']);