diff --git a/.jshintrc b/.jshintrc index daeaf45072..9240a3ae9f 100644 --- a/.jshintrc +++ b/.jshintrc @@ -27,5 +27,5 @@ "jest": true, "pit": true }, - "predef": [ "Promise" ] + "predef": [ "-Promise" ] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f0a4c54814..209f81f62e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ To run the app in development: **Note: This architecture is work in progress and doesn't reflect the current state of the app, yet!** -Kitematic is an application built using [atom-shell](https://github.com/atom/atom-shell) and is powered by the [Docker Engine](https://github.com/docker/docker). While it's work in progress, the goal is to make Kitematic a high-performance, portable Javascript ES6 application built with React and Reflux. It adopts a single data flow pattern: +Kitematic is an application built using [electron](https://github.com/atom/electron) and is powered by the [Docker Engine](https://github.com/docker/docker). While it's work in progress, the goal is to make Kitematic a high-performance, portable Javascript ES6 application built with React and Reflux. It adopts a single data flow pattern: ``` ╔═════════╗ ╔════════╗ ╔═════════════════╗ diff --git a/gulpfile.js b/gulpfile.js index e25a452e10..9dacf2ed44 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,7 @@ var babel = require('gulp-babel'); var changed = require('gulp-changed'); var concat = require('gulp-concat'); var cssmin = require('gulp-cssmin'); -var downloadatomshell = require('gulp-download-atom-shell'); +var downloadelectron = require('gulp-download-electron'); var fs = require('fs'); var gulp = require('gulp'); var gulpif = require('gulp-if'); @@ -76,8 +76,8 @@ gulp.task('styles', function () { }); gulp.task('download', function (cb) { - downloadatomshell({ - version: packagejson['atom-shell-version'], + downloadelectron({ + version: packagejson['electron-version'], outputDir: 'cache' }, cb); }); @@ -97,8 +97,8 @@ gulp.task('dist', function () { var stream = gulp.src('').pipe(shell([ 'rm -Rf dist', 'mkdir -p ./dist/osx', - 'cp -R ./cache/Atom.app ./dist/osx/<%= filename %>', - 'mv ./dist/osx/<%= filename %>/Contents/MacOS/Atom ./dist/osx/<%= filename %>/Contents/MacOS/<%= name %>', + 'cp -R ./cache/Electron.app ./dist/osx/<%= filename %>', + 'mv ./dist/osx/<%= filename %>/Contents/MacOS/Electron ./dist/osx/<%= filename %>/Contents/MacOS/<%= name %>', 'mkdir -p ./dist/osx/<%= filename %>/Contents/Resources/app', 'mkdir -p ./dist/osx/<%= filename %>/Contents/Resources/app/node_modules', 'cp package.json dist/osx/<%= filename %>/Contents/Resources/app/', @@ -138,9 +138,19 @@ gulp.task('sign', function () { try { var signing_identity = fs.readFileSync('./identity', 'utf8').trim(); return gulp.src('').pipe(shell([ - 'codesign --deep --force --verbose --sign "' + signing_identity + '" ' + options.appFilename.replace(' ', '\\ ').replace('(','\\(').replace(')','\\)') + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Framework.framework', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Helper\\ EH.app', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Helper\\ NP.app', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Electron\\ Helper.app', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/ReactiveCocoa.framework', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Squirrel.framework', + 'codesign --deep --force --verbose --sign <%= identity %> <%= filename %>/Contents/Frameworks/Mantle.framework', + 'codesign --force --verbose --sign <%= identity %> <%= filename %>', ], { - cwd: './dist/osx/' + templateData: { + filename: 'dist/osx/' + options.appFilename.replace(' ', '\\ ').replace('(','\\(').replace(')','\\)'), + identity: '\"' + signing_identity + '\"' + } })); } catch (error) { gutil.log(gutil.colors.red('Error: ' + error.message)); @@ -207,11 +217,11 @@ gulp.task('default', ['download-deps', 'download', 'copy', 'js', 'images', 'styl env.NODE_ENV = 'development'; if(process.platform === 'win32') { - gulp.src('').pipe(shell(['cache\\atom.exe .'], { + gulp.src('').pipe(shell(['cache\\electron.exe .'], { env: env })); } else { - gulp.src('').pipe(shell(['./cache/Atom.app/Contents/MacOS/Atom .'], { + gulp.src('').pipe(shell(['./cache/Electron.app/Contents/MacOS/Electron .'], { env: env })); } diff --git a/package.json b/package.json index f68216f331..3eb77adfe8 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "tty", "net", "crypto", + "babel", "/node_modules/.*JSONStream", "/node_modules/object-assign", "/node_modules/underscore", @@ -46,7 +47,7 @@ }, "docker-version": "1.6.0", "docker-machine-version": "0.2.0", - "atom-shell-version": "0.23.0", + "electron-version": "0.24.0", "virtualbox-version": "4.3.26", "virtualbox-filename": "VirtualBox-4.3.26.pkg", "virtualbox-filename-win": "VirtualBox-4.3.26.exe", @@ -58,6 +59,7 @@ "async": "^0.9.0", "bluebird": "^2.9.24", "bugsnag-js": "^2.4.7", + "classnames": "^1.2.0", "coveralls": "^2.11.2", "dockerode": "^2.1.1", "exec": "0.2.0", @@ -83,7 +85,7 @@ "gulp-changed": "^1.2.1", "gulp-concat": "^2.5.2", "gulp-cssmin": "^0.1.6", - "gulp-download-atom-shell": "0.0.4", + "gulp-download-electron": "^0.0.5", "gulp-if": "^1.2.5", "gulp-insert": "^0.4.0", "gulp-less": "^3.0.2", @@ -93,7 +95,6 @@ "gulp-shell": "^0.4.1", "gulp-sourcemaps": "^1.5.2", "gulp-util": "^3.0.4", - "gulp": "^3.8.11", "jest-cli": "kitematic/jest", "jsxhint": "^0.14.0", "minimist": "^1.1.1", diff --git a/src/ContainerDetails.react.js b/src/ContainerDetails.react.js index f101b603ba..b18d69819b 100644 --- a/src/ContainerDetails.react.js +++ b/src/ContainerDetails.react.js @@ -5,7 +5,9 @@ var ContainerDetailsSubheader = require('./ContainerDetailsSubheader.react'); var Router = require('react-router'); var ContainerDetail = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { currentRoute: null @@ -18,9 +20,9 @@ var ContainerDetail = React.createClass({ this.init(); }, init: function () { - var currentRoute = _.last(this.getRoutes()).name; + var currentRoute = _.last(this.context.router.getCurrentRoutes()).name; if (currentRoute === 'containerDetails') { - this.transitionTo('containerHome', {name: this.getParams().name}); + this.context.router.transitionTo('containerHome', {name: this.context.router.getCurrentParams().name}); } }, render: function () { diff --git a/src/ContainerDetailsSubheader.react.js b/src/ContainerDetailsSubheader.react.js index 163f7edc11..5543109347 100644 --- a/src/ContainerDetailsSubheader.react.js +++ b/src/ContainerDetailsSubheader.react.js @@ -1,19 +1,21 @@ var _ = require('underscore'); var $ = require('jquery'); -var React = require('react/addons'); +var React = require('react'); var exec = require('exec'); var metrics = require('./Metrics'); var ContainerStore = require('./ContainerStore'); var ContainerUtil = require('./ContainerUtil'); var machine = require('./DockerMachine'); var RetinaImage = require('react-retina-image'); -var Router = require('react-router'); var webPorts = require('./Util').webPorts; var shell = require('shell'); var resources = require('./Resources'); +var classNames = require('classNames'); var ContainerDetailsSubheader = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { defaultPort: null @@ -27,9 +29,9 @@ var ContainerDetailsSubheader = React.createClass({ }, init: function () { this.setState({ - currentRoute: _.last(this.getRoutes()).name + currentRoute: _.last(this.context.router.getCurrentRoutes()).name }); - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -70,19 +72,19 @@ var ContainerDetailsSubheader = React.createClass({ metrics.track('Viewed Home', { from: 'header' }); - this.transitionTo('containerHome', {name: this.getParams().name}); + this.context.router.transitionTo('containerHome', {name: this.context.router.getCurrentParams().name}); } }, showLogs: function () { if (!this.disableTab()) { metrics.track('Viewed Logs'); - this.transitionTo('containerLogs', {name: this.getParams().name}); + this.context.router.transitionTo('containerLogs', {name: this.context.router.getCurrentParams().name}); } }, showSettings: function () { if (!this.disableTab()) { metrics.track('Viewed Settings'); - this.transitionTo('containerSettings', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettings', {name: this.context.router.getCurrentParams().name}); } }, handleRun: function () { @@ -139,29 +141,29 @@ var ContainerDetailsSubheader = React.createClass({ $action.css("visibility", "hidden"); }, render: function () { - var runActionClass = React.addons.classSet({ + var runActionClass = classNames({ action: true, disabled: this.disableRun() }); - var restartActionClass = React.addons.classSet({ + var restartActionClass = classNames({ action: true, disabled: this.disableRestart() }); - var terminalActionClass = React.addons.classSet({ + var terminalActionClass = classNames({ action: true, disabled: this.disableTerminal() }); - var tabHomeClasses = React.addons.classSet({ + var tabHomeClasses = classNames({ 'tab': true, 'active': this.state.currentRoute === 'containerHome', disabled: this.disableTab() }); - var tabLogsClasses = React.addons.classSet({ + var tabLogsClasses = classNames({ 'tab': true, 'active': this.state.currentRoute === 'containerLogs', disabled: this.disableTab() }); - var tabSettingsClasses = React.addons.classSet({ + var tabSettingsClasses = classNames({ 'tab': true, 'active': this.state.currentRoute && (this.state.currentRoute.indexOf('containerSettings') >= 0), disabled: this.disableTab() diff --git a/src/ContainerHome.react.js b/src/ContainerHome.react.js index b8c74b6722..f9278ca65a 100644 --- a/src/ContainerHome.react.js +++ b/src/ContainerHome.react.js @@ -2,7 +2,6 @@ var _ = require('underscore'); var $ = require('jquery'); var React = require('react/addons'); var ContainerStore = require('./ContainerStore'); -var Router = require('react-router'); var Radial = require('./Radial.react'); var ContainerHomePreview = require('./ContainerHomePreview.react'); var ContainerHomeLogs = require('./ContainerHomeLogs.react'); @@ -17,7 +16,9 @@ var resizeWindow = function () { }; var ContainerHome = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { ports: {}, @@ -48,7 +49,7 @@ var ContainerHome = React.createClass({ resizeWindow(); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -58,12 +59,12 @@ var ContainerHome = React.createClass({ defaultPort: _.find(_.keys(ports), function (port) { return util.webPorts.indexOf(port) !== -1; }), - progress: ContainerStore.progress(this.getParams().name), - blocked: ContainerStore.blocked(this.getParams().name) + progress: ContainerStore.progress(this.context.router.getCurrentParams().name), + blocked: ContainerStore.blocked(this.context.router.getCurrentParams().name) }); }, updateProgress: function (name) { - if (name === this.getParams().name) { + if (name === this.context.router.getCurrentParams().name) { this.setState({ blocked: ContainerStore.blocked(name), progress: ContainerStore.progress(name) diff --git a/src/ContainerHomeFolders.react.js b/src/ContainerHomeFolders.react.js index aa1218f4a6..9f5d6b4c71 100644 --- a/src/ContainerHomeFolders.react.js +++ b/src/ContainerHomeFolders.react.js @@ -5,11 +5,12 @@ var path = require('path'); var shell = require('shell'); var util = require('./Util'); var metrics = require('./Metrics'); -var Router = require('react-router'); var ContainerStore = require('./ContainerStore'); var ContainerHomeFolder = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, handleClickFolder: function (hostVolume, containerVolume) { metrics.track('Opened Volume Directory', { from: 'home' @@ -47,7 +48,7 @@ var ContainerHomeFolder = React.createClass({ metrics.track('Viewed Volume Settings', { from: 'preview' }); - this.transitionTo('containerSettingsVolumes', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettingsVolumes', {name: this.context.router.getCurrentParams().name}); }, render: function () { if (!this.props.container) { diff --git a/src/ContainerHomeLogs.react.js b/src/ContainerHomeLogs.react.js index fba6a1b4f4..771765dfa9 100644 --- a/src/ContainerHomeLogs.react.js +++ b/src/ContainerHomeLogs.react.js @@ -44,9 +44,12 @@ module.exports = React.createClass({ metrics.track('Viewed Logs', { from: 'preview' }); - this.transitionTo('containerLogs', {name: this.props.container.Name}); + this.context.router.transitionTo('containerLogs', {name: this.props.container.Name}); }, update: function () { + if (!this.props.container) { + return; + } this.setState({ logs: LogStore.logs(this.props.container.Name) }); diff --git a/src/ContainerHomePreview.react.js b/src/ContainerHomePreview.react.js index b9efa4973d..3e33a535da 100644 --- a/src/ContainerHomePreview.react.js +++ b/src/ContainerHomePreview.react.js @@ -3,14 +3,15 @@ var React = require('react/addons'); var exec = require('exec'); var ContainerStore = require('./ContainerStore'); var ContainerUtil = require('./ContainerUtil'); -var Router = require('react-router'); var request = require('request'); var metrics = require('./Metrics'); var webPorts = require('./Util').webPorts; var util = require('./Util'); var ContainerHomePreview = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { ports: {}, @@ -42,7 +43,7 @@ var ContainerHomePreview = React.createClass({ clearInterval(this.timer); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -66,7 +67,7 @@ var ContainerHomePreview = React.createClass({ metrics.track('Viewed Port Settings', { from: 'preview' }); - this.transitionTo('containerSettingsPorts', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettingsPorts', {name: this.context.router.getCurrentParams().name}); }, render: function () { var preview; diff --git a/src/ContainerListNewItem.react.js b/src/ContainerListNewItem.react.js index 21c3d53c45..108e7b78e4 100644 --- a/src/ContainerListNewItem.react.js +++ b/src/ContainerListNewItem.react.js @@ -5,7 +5,6 @@ var ContainerStore = require('./ContainerStore'); var metrics = require('./Metrics'); var ContainerListNewItem = React.createClass({ - mixins: [Router.State, Router.Navigation], handleItemMouseEnter: function () { var $action = $(this.getDOMNode()).find('.action'); $action.show(); diff --git a/src/ContainerLogs.react.js b/src/ContainerLogs.react.js index f7b0b24064..36689c44af 100644 --- a/src/ContainerLogs.react.js +++ b/src/ContainerLogs.react.js @@ -20,6 +20,10 @@ module.exports = React.createClass({ LogStore.fetch(this.props.container.Name); }, componentWillUnmount: function() { + if (!this.props.container) { + return; + } + LogStore.detach(this.props.container.Name); LogStore.removeListener(LogStore.SERVER_LOGS_EVENT, this.update); }, @@ -34,6 +38,9 @@ module.exports = React.createClass({ _prevBottom = parent[0].scrollHeight - parent.height(); }, update: function () { + if (!this.props.container) { + return; + } this.setState({ logs: LogStore.logs(this.props.container.Name) }); diff --git a/src/ContainerSettings.react.js b/src/ContainerSettings.react.js index 3b0ba56e88..7a25dd73ae 100644 --- a/src/ContainerSettings.react.js +++ b/src/ContainerSettings.react.js @@ -3,7 +3,9 @@ var React = require('react/addons'); var Router = require('react-router'); var ContainerSettings = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, componentWillReceiveProps: function () { this.init(); }, @@ -11,9 +13,9 @@ var ContainerSettings = React.createClass({ this.init(); }, init: function () { - var currentRoute = _.last(this.getRoutes()).name; + var currentRoute = _.last(this.context.router.getCurrentRoutes()).name; if (currentRoute === 'containerSettings') { - this.transitionTo('containerSettingsGeneral', {name: this.getParams().name}); + this.context.router.transitionTo('containerSettingsGeneral', {name: this.context.router.getCurrentParams().name}); } }, render: function () { diff --git a/src/ContainerSettingsGeneral.react.js b/src/ContainerSettingsGeneral.react.js index d44a8baa58..f54728cff7 100644 --- a/src/ContainerSettingsGeneral.react.js +++ b/src/ContainerSettingsGeneral.react.js @@ -28,7 +28,9 @@ var containerNameSlugify = function (text) { }; var ContainerSettingsGeneral = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { slugName: null, @@ -44,7 +46,7 @@ var ContainerSettingsGeneral = React.createClass({ this.init(); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -98,7 +100,7 @@ var ContainerSettingsGeneral = React.createClass({ return; } metrics.track('Changed Container Name'); - this.transitionTo('containerSettingsGeneral', {name: newName}); + this.context.router.transitionTo('containerSettingsGeneral', {name: newName}); var oldPath = path.join(process.env.HOME, 'Kitematic', oldName); var newPath = path.join(process.env.HOME, 'Kitematic', newName); rimraf(newPath, () => { diff --git a/src/ContainerSettingsPorts.react.js b/src/ContainerSettingsPorts.react.js index 1b5321bcd0..09b766cffc 100644 --- a/src/ContainerSettingsPorts.react.js +++ b/src/ContainerSettingsPorts.react.js @@ -1,6 +1,5 @@ var _ = require('underscore'); var React = require('react/addons'); -var Router = require('react-router'); var ContainerStore = require('./ContainerStore'); var ContainerUtil = require('./ContainerUtil'); var metrics = require('./Metrics'); @@ -8,7 +7,9 @@ var webPorts = require('./Util').webPorts; var shell = require('shell'); var ContainerSettingsPorts = React.createClass({ - mixins: [Router.State, Router.Navigation], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { ports: {}, @@ -22,7 +23,7 @@ var ContainerSettingsPorts = React.createClass({ this.init(); }, init: function () { - var container = ContainerStore.container(this.getParams().name); + var container = ContainerStore.container(this.context.router.getCurrentParams().name); if (!container) { return; } @@ -41,7 +42,6 @@ var ContainerSettingsPorts = React.createClass({ shell.openExternal(url); }, handleChangeDefaultPort: function (port, e) { - console.log(e.target.checked); if (e.target.checked) { this.setState({ defaultPort: port diff --git a/src/ContainerSettingsVolumes.react.js b/src/ContainerSettingsVolumes.react.js index 43616ac0f4..f9ca6568a6 100644 --- a/src/ContainerSettingsVolumes.react.js +++ b/src/ContainerSettingsVolumes.react.js @@ -1,6 +1,5 @@ var _ = require('underscore'); var React = require('react/addons'); -var Router = require('react-router'); var remote = require('remote'); var dialog = remote.require('dialog'); var metrics = require('./Metrics'); @@ -8,7 +7,6 @@ var ContainerStore = require('./ContainerStore'); var util = require('./Util'); var ContainerSettingsVolumes = React.createClass({ - mixins: [Router.State, Router.Navigation], handleChooseVolumeClick: function (dockerVol) { var self = this; dialog.showOpenDialog({properties: ['openDirectory', 'createDirectory']}, function (filenames) { diff --git a/src/Containers.react.js b/src/Containers.react.js index 793731a961..40742e36f4 100644 --- a/src/Containers.react.js +++ b/src/Containers.react.js @@ -15,7 +15,9 @@ var Tooltip = require('react-bootstrap').Tooltip; var shell = require('shell'); var Containers = React.createClass({ - mixins: [Router.Navigation, Router.State], + contextTypes: { + router: React.PropTypes.func + }, getInitialState: function () { return { sidebarOffset: 0, @@ -34,7 +36,7 @@ var Containers = React.createClass({ ContainerStore.on(ContainerStore.CLIENT_CONTAINER_EVENT, this.updateFromClient); if (this.state.sorted.length) { - this.transitionTo('containerHome', {name: this.state.sorted[0].Name}); + this.context.router.transitionTo('containerHome', {name: this.state.sorted[0].Name}); } ipc.on('application:update-available', () => { @@ -50,9 +52,9 @@ var Containers = React.createClass({ }, onDestroy: function () { if (this.state.sorted.length) { - this.transitionTo('containerHome', {name: this.state.sorted[0].Name}); + this.context.router.transitionTo('containerHome', {name: this.state.sorted[0].Name}); } else { - this.transitionTo('containers'); + this.context.router.transitionTo('containers'); } }, updateError: function (err) { @@ -77,7 +79,7 @@ var Containers = React.createClass({ downloading: ContainerStore.downloading() }); if (status === 'create') { - this.transitionTo('containerHome', {name: name}); + this.context.router.transitionTo('containerHome', {name: name}); } else if (status === 'destroy') { this.onDestroy(); } @@ -95,7 +97,7 @@ var Containers = React.createClass({ }, handleNewContainer: function () { $(this.getDOMNode()).find('.new-container-item').parent().fadeIn(); - this.transitionTo('new'); + this.context.router.transitionTo('new'); metrics.track('Pressed New Container'); }, handleAutoUpdateClick: function () { @@ -106,7 +108,7 @@ var Containers = React.createClass({ metrics.track('Opened Preferences', { from: 'app' }); - this.transitionTo('preferences'); + this.context.router.transitionTo('preferences'); }, handleClickDockerTerminal: function () { metrics.track('Opened Docker Terminal', { @@ -173,7 +175,7 @@ var Containers = React.createClass({ button = ; } - var container = this.getParams().name ? this.state.containers[this.getParams().name] : {}; + var container = this.context.router.getCurrentParams().name ? this.state.containers[this.context.router.getCurrentParams().name] : {}; return (
diff --git a/src/Docker.js b/src/Docker.js index 443468798b..8c7d3c2404 100644 --- a/src/Docker.js +++ b/src/Docker.js @@ -33,7 +33,6 @@ var Docker = { delay = delay || 1000; var tryCount = 1; while (true) { - console.log('Connecting: ' + tryCount + ' tries...'); try { yield new Promise((resolve, reject) => { this._client.listContainers((err) => { diff --git a/src/LogStore.js b/src/LogStore.js index fa14b34e11..60f707ce80 100644 --- a/src/LogStore.js +++ b/src/LogStore.js @@ -30,7 +30,7 @@ module.exports = assign(Object.create(EventEmitter.prototype), { follow: false }, (err, logStream) => { if (err) { - throw err; + return; } var logs = []; var outstream = new stream.PassThrough(); @@ -56,8 +56,9 @@ module.exports = assign(Object.create(EventEmitter.prototype), { stream: true }, (err, logStream) => { if (err) { - throw err; + return; } + _streams[name] = logStream; var outstream = new stream.PassThrough(); docker.client().modem.demuxStream(logStream, outstream, outstream); outstream.on('data', (chunk) => { diff --git a/src/NewContainer.react.js b/src/NewContainer.react.js index 05e772cedd..39de7011f8 100644 --- a/src/NewContainer.react.js +++ b/src/NewContainer.react.js @@ -1,11 +1,12 @@ var _ = require('underscore'); var $ = require('jquery'); -var React = require('react/addons'); +var React = require('react'); var RetinaImage = require('react-retina-image'); var Radial = require('./Radial.react'); var ImageCard = require('./ImageCard.react'); var Promise = require('bluebird'); var metrics = require('./Metrics'); +var classNames = require('classnames'); var _recommended = []; var _searchPromise = null; @@ -132,11 +133,11 @@ var NewContainer = React.createClass({ ); } } - var loadingClasses = React.addons.classSet({ + var loadingClasses = classNames({ hidden: !this.state.loading, loading: true }); - var magnifierClasses = React.addons.classSet({ + var magnifierClasses = classNames({ hidden: this.state.loading, icon: true, 'icon-magnifier': true, diff --git a/src/Radial.react.js b/src/Radial.react.js index cc826167cd..bdc9ea1773 100644 --- a/src/Radial.react.js +++ b/src/Radial.react.js @@ -1,4 +1,5 @@ -var React = require('react/addons'); +var React = require('react'); +var classNames = require('classnames'); var Radial = React.createClass({ render: function () { @@ -10,7 +11,7 @@ var Radial = React.createClass({ } else { percentage =
; } - var classes = React.addons.classSet({ + var classes = classNames({ 'radial-progress': true, 'radial-spinner': this.props.spin, 'radial-negative': this.props.error, diff --git a/src/SetupStore.js b/src/SetupStore.js index ea62de9860..d876e902fe 100644 --- a/src/SetupStore.js +++ b/src/SetupStore.js @@ -245,7 +245,6 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { setup: Promise.coroutine(function * () { while (true) { try { - console.log('Starting Steps'); var ip = yield this.run(); if (!ip || !ip.length) { throw { @@ -254,8 +253,6 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { ip: ip }; } - console.log('Finished Steps'); - console.log(ip); docker.setup(ip, machine.name()); yield docker.waitForConnection(); metrics.track('Setup Finished');