|
@ -30,9 +30,6 @@ the preferred channel for [Bug Reports](#bug-reports), [Features Requests](#feat
|
|||
and [Submitting Pull Requests](#submitting-pull-requests), but please respect the following
|
||||
restrictions:
|
||||
|
||||
* Please don't use the issue tracker for personal support requests. Our
|
||||
[HipChat room](https://www.hipchat.com/giAT9Fqb5) is a better place to get help.
|
||||
|
||||
## Bug Reports
|
||||
|
||||
A bug is a _demonstrable problem_ that is caused by the code in the repository.
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
{"error":"Not Found"}
|
|
@ -18,14 +18,6 @@ process.env.RESOURCES_PATH = __dirname + '/../resources';
|
|||
process.chdir(path.join(__dirname, '..'));
|
||||
process.env.PATH = '/usr/local/bin:' + process.env.PATH;
|
||||
|
||||
if (argv.integration) {
|
||||
process.env.TEST_TYPE = 'integration';
|
||||
} else {
|
||||
process.env.TEST_TYPE = 'test';
|
||||
}
|
||||
|
||||
app.commandLine.appendSwitch('js-flags', '--harmony');
|
||||
|
||||
var mainWindow = null;
|
||||
var windowOptions = {
|
||||
width: 1000,
|
||||
|
@ -53,7 +45,7 @@ app.on('ready', function() {
|
|||
mainWindow.loadUrl(path.normalize('file://' + path.join(__dirname, '..', 'build/index.html')));
|
||||
app.on('will-quit', function () {
|
||||
if (saveVMOnQuit) {
|
||||
exec('VBoxManage controlvm boot2docker-vm savestate', function () {});
|
||||
exec('/usr/bin/VBoxManage controlvm boot2docker-vm savestate', function () {});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -64,17 +56,14 @@ app.on('ready', function() {
|
|||
|
||||
mainWindow.webContents.on('will-navigate', function (e, url) {
|
||||
if (url.indexOf('build/index.html#/containers') < 0) {
|
||||
console.log(url);
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
mainWindow.webContents.on('did-finish-load', function() {
|
||||
if (!argv.test) {
|
||||
mainWindow.show();
|
||||
}
|
||||
mainWindow.focus();
|
||||
mainWindow.setTitle('');
|
||||
mainWindow.show();
|
||||
mainWindow.focus();
|
||||
|
||||
// Auto Updates
|
||||
if (process.env.NODE_ENV !== 'development' && !argv.test) {
|
||||
|
|
10
gulpfile.js
|
@ -1,3 +1,5 @@
|
|||
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');
|
||||
|
@ -7,21 +9,19 @@ var gulpif = require('gulp-if');
|
|||
var gutil = require('gulp-util');
|
||||
var less = require('gulp-less');
|
||||
var livereload = require('gulp-livereload');
|
||||
var packagejson = require('./package.json');
|
||||
var plumber = require('gulp-plumber');
|
||||
var react = require('gulp-react');
|
||||
var babel = require('gulp-babel');
|
||||
var runSequence = require('run-sequence');
|
||||
var shell = require('gulp-shell');
|
||||
var sourcemaps = require('gulp-sourcemaps');
|
||||
var packagejson = require('./package.json');
|
||||
var changed = require('gulp-changed');
|
||||
|
||||
var dependencies = Object.keys(packagejson.dependencies);
|
||||
var isBeta = process.argv.indexOf('--beta') !== -1;
|
||||
|
||||
var settings;
|
||||
try {
|
||||
settings = JSON.parse(fs.readFileSync('settings.json'), 'utf8');
|
||||
settings = require('./settings.json');
|
||||
} catch (err) {
|
||||
settings = {};
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ var options = {
|
|||
beta: isBeta,
|
||||
filename: isBeta ? 'Kitematic (Beta).app' : 'Kitematic.app',
|
||||
name: isBeta ? 'Kitematic (Beta)' : 'Kitematic',
|
||||
icon: isBeta ? 'kitematic-beta.icns' : 'kitematic.icns'
|
||||
icon: isBeta ? './util/kitematic-beta.icns' : './util/kitematic.icns'
|
||||
};
|
||||
|
||||
gulp.task('js', function () {
|
||||
|
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 1023 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1018 B After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 473 B After Width: | Height: | Size: 844 B |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 953 B After Width: | Height: | Size: 966 B |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 706 B After Width: | Height: | Size: 749 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
@ -3,7 +3,6 @@
|
|||
<head>
|
||||
<link rel="stylesheet" href="main.css"/>
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' http://localhost:35729; style-src 'self' 'unsafe-inline';">
|
||||
|
||||
<title>Kitematic</title>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
"test": "jest",
|
||||
"release": "gulp release",
|
||||
"release:beta": "gulp release --beta",
|
||||
"preinstall": "./deps",
|
||||
"preinstall": "./util/deps",
|
||||
"lint": "jsxhint src && jsxhint browser"
|
||||
},
|
||||
"licenses": [
|
||||
|
@ -25,8 +25,8 @@
|
|||
}
|
||||
],
|
||||
"jest": {
|
||||
"scriptPreprocessor": "<rootDir>/preprocessor.js",
|
||||
"setupEnvScriptFile": "<rootDir>/testenv.js",
|
||||
"scriptPreprocessor": "<rootDir>/util/preprocessor.js",
|
||||
"setupEnvScriptFile": "<rootDir>/util/testenv.js",
|
||||
"unmockedModulePathPatterns": [
|
||||
"tty",
|
||||
"net",
|
||||
|
|
|
@ -9,6 +9,7 @@ var ContainerUtil = require('./ContainerUtil');
|
|||
var boot2docker = require('./Boot2Docker');
|
||||
var RetinaImage = require('react-retina-image');
|
||||
var Router = require('react-router');
|
||||
var webPorts = require('./Util').webPorts;
|
||||
|
||||
var ContainerDetailsSubheader = React.createClass({
|
||||
mixins: [Router.State, Router.Navigation],
|
||||
|
@ -32,7 +33,6 @@ var ContainerDetailsSubheader = React.createClass({
|
|||
return;
|
||||
}
|
||||
var ports = ContainerUtil.ports(container);
|
||||
var webPorts = ['80', '8000', '8080', '3000', '5000', '2368'];
|
||||
this.setState({
|
||||
ports: ports,
|
||||
defaultPort: _.find(_.keys(ports), function (port) {
|
||||
|
@ -113,12 +113,12 @@ var ContainerDetailsSubheader = React.createClass({
|
|||
});
|
||||
}
|
||||
},
|
||||
handleItemMouseEnterRun: function () {
|
||||
var $action = $(this.getDOMNode()).find('.action .run');
|
||||
handleItemMouseEnterView: function () {
|
||||
var $action = $(this.getDOMNode()).find('.action .view');
|
||||
$action.css("visibility", "visible");
|
||||
},
|
||||
handleItemMouseLeaveRun: function () {
|
||||
var $action = $(this.getDOMNode()).find('.action .run');
|
||||
handleItemMouseLeaveView: function () {
|
||||
var $action = $(this.getDOMNode()).find('.action .view');
|
||||
$action.css("visibility", "hidden");
|
||||
},
|
||||
handleItemMouseEnterRestart: function () {
|
||||
|
@ -168,9 +168,9 @@ var ContainerDetailsSubheader = React.createClass({
|
|||
return (
|
||||
<div className="details-subheader">
|
||||
<div className="details-header-actions">
|
||||
<div className={runActionClass} onMouseEnter={this.handleItemMouseEnterRun} onMouseLeave={this.handleItemMouseLeaveRun}>
|
||||
<span className="action-icon" onClick={this.handleRun}><RetinaImage src="button-run.png"/></span>
|
||||
<span className="btn-label run">Run</span>
|
||||
<div className={runActionClass} onMouseEnter={this.handleItemMouseEnterView} onMouseLeave={this.handleItemMouseLeaveView}>
|
||||
<span className="action-icon" onClick={this.handleRun}><RetinaImage src="button-view.png"/></span>
|
||||
<span className="btn-label view">View</span>
|
||||
</div>
|
||||
<div className={restartActionClass} onMouseEnter={this.handleItemMouseEnterRestart} onMouseLeave={this.handleItemMouseLeaveRestart}>
|
||||
<span className="action-icon" onClick={this.handleRestart}><RetinaImage src="button-restart.png"/></span>
|
||||
|
|
|
@ -8,6 +8,7 @@ var ContainerHomePreview = require('./ContainerHomePreview.react');
|
|||
var ContainerHomeLogs = require('./ContainerHomeLogs.react');
|
||||
var ContainerHomeFolders = require('./ContainerHomeFolders.react');
|
||||
var ContainerUtil = require('./ContainerUtil');
|
||||
var webPorts = require('./Util').webPorts;
|
||||
|
||||
var resizeWindow = function () {
|
||||
$('.left .wrapper').height(window.innerHeight - 240);
|
||||
|
@ -48,7 +49,6 @@ var ContainerHome = React.createClass({
|
|||
return;
|
||||
}
|
||||
var ports = ContainerUtil.ports(container);
|
||||
var webPorts = ['80', '8000', '8080', '3000', '5000', '2368'];
|
||||
this.setState({
|
||||
ports: ports,
|
||||
defaultPort: _.find(_.keys(ports), function (port) {
|
||||
|
|
|
@ -6,6 +6,7 @@ var ContainerUtil = require('./ContainerUtil');
|
|||
var Router = require('react-router');
|
||||
var request = require('request');
|
||||
var metrics = require('./Metrics');
|
||||
var webPorts = require('./Util').webPorts;
|
||||
|
||||
var ContainerHomePreview = React.createClass({
|
||||
mixins: [Router.State, Router.Navigation],
|
||||
|
@ -48,7 +49,6 @@ var ContainerHomePreview = React.createClass({
|
|||
return;
|
||||
}
|
||||
var ports = ContainerUtil.ports(container);
|
||||
var webPorts = ['80', '8000', '8080', '3000', '5000', '2368'];
|
||||
this.setState({
|
||||
ports: ports,
|
||||
defaultPort: _.find(_.keys(ports), function (port) {
|
||||
|
|
|
@ -5,6 +5,7 @@ var exec = require('exec');
|
|||
var ContainerStore = require('./ContainerStore');
|
||||
var ContainerUtil = require('./ContainerUtil');
|
||||
var metrics = require('./Metrics');
|
||||
var webPorts = require('./Util').webPorts;
|
||||
|
||||
var ContainerSettingsPorts = React.createClass({
|
||||
mixins: [Router.State, Router.Navigation],
|
||||
|
@ -26,7 +27,6 @@ var ContainerSettingsPorts = React.createClass({
|
|||
return;
|
||||
}
|
||||
var ports = ContainerUtil.ports(container);
|
||||
var webPorts = ['80', '8000', '8080', '3000', '5000', '2368'];
|
||||
this.setState({
|
||||
ports: ports,
|
||||
defaultPort: _.find(_.keys(ports), function (port) {
|
||||
|
|
15
src/Main.js
|
@ -1,5 +1,15 @@
|
|||
require.main.paths.splice(0, 0, process.env.NODE_PATH);
|
||||
var remote = require('remote');
|
||||
if (localStorage.getItem('settings.width') && localStorage.getItem('settings.height')) {
|
||||
remote.getCurrentWindow().setSize(parseInt(localStorage.getItem('settings.width')), parseInt(localStorage.getItem('settings.height')));
|
||||
remote.getCurrentWindow().center();
|
||||
}
|
||||
|
||||
window.addEventListener('resize', function () {
|
||||
localStorage.setItem('settings.width', window.innerWidth);
|
||||
localStorage.setItem('settings.height', window.innerHeight);
|
||||
});
|
||||
|
||||
require.main.paths.splice(0, 0, process.env.NODE_PATH);
|
||||
var app = remote.require('app');
|
||||
var React = require('react');
|
||||
var fs = require('fs');
|
||||
|
@ -10,13 +20,13 @@ var boot2docker = require('./boot2docker');
|
|||
var ContainerStore = require('./ContainerStore');
|
||||
var SetupStore = require('./SetupStore');
|
||||
var metrics = require('./Metrics');
|
||||
var settingsjson;
|
||||
|
||||
var MenuTemplate = require('./MenuTemplate');
|
||||
var Menu = remote.require('menu');
|
||||
var menu = Menu.buildFromTemplate(MenuTemplate);
|
||||
Menu.setApplicationMenu(menu);
|
||||
|
||||
var settingsjson;
|
||||
try {
|
||||
settingsjson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'settings.json'), 'utf8'));
|
||||
} catch (err) {
|
||||
|
@ -73,7 +83,6 @@ setInterval(function () {
|
|||
|
||||
router.run(Handler => React.render(<Handler/>, document.body));
|
||||
SetupStore.run().then(boot2docker.ip).then(ip => {
|
||||
console.log(ip);
|
||||
docker.setHost(ip);
|
||||
ContainerStore.init(function (err) {
|
||||
if (err) { console.log(err); }
|
||||
|
|
|
@ -2,7 +2,6 @@ var remote = require('remote');
|
|||
var app = remote.require('app');
|
||||
var path = require('path');
|
||||
var docker = require('./Docker');
|
||||
var BrowserWindow = remote.require('browser-window');
|
||||
var router = require('./Router');
|
||||
var util = require('./Util');
|
||||
var metrics = require('./Metrics');
|
||||
|
@ -124,7 +123,7 @@ var MenuTemplate = [
|
|||
{
|
||||
label: 'Toggle DevTools',
|
||||
accelerator: 'Alt+Command+I',
|
||||
click: function() { BrowserWindow.getFocusedWindow().toggleDevTools(); }
|
||||
click: function() { remote.getCurrentWindow().toggleDevTools(); }
|
||||
},
|
||||
]
|
||||
},
|
||||
|
@ -139,7 +138,9 @@ var MenuTemplate = [
|
|||
{
|
||||
label: 'Close',
|
||||
accelerator: 'Command+W',
|
||||
selector: 'performClose:'
|
||||
click: function () {
|
||||
remote.getCurrentWindow().hide();
|
||||
}
|
||||
},
|
||||
{
|
||||
type: 'separator'
|
||||
|
|
|
@ -40,5 +40,6 @@ module.exports = {
|
|||
},
|
||||
escapePath: function (str) {
|
||||
return str.replace(/ /g, '\\ ').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
|
||||
}
|
||||
},
|
||||
webPorts: ['80', '8000', '8080', '3000', '5000', '2368', '9200', '8983']
|
||||
};
|
||||
|
|
|
@ -21,6 +21,7 @@ html, body {
|
|||
height: 100%;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
background: none;
|
||||
-webkit-user-select: none;
|
||||
font-family: @font-regular;
|
||||
cursor: default;
|
||||
|
|
|
@ -24,28 +24,32 @@
|
|||
margin-top: -12px;
|
||||
.action {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
top: 10px;
|
||||
&.disabled {
|
||||
opacity: 0.3;
|
||||
}
|
||||
.action-icon {
|
||||
color: @gray-normal;
|
||||
font-size: 30px;
|
||||
margin-right: 20px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.btn-label {
|
||||
position: relative;
|
||||
top: 0px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
color: @brand-action;
|
||||
font-size: 10px;
|
||||
&.run {
|
||||
left: 8px;
|
||||
width: 200px;
|
||||
top: 30px;
|
||||
&.view {
|
||||
left: 6px;
|
||||
//left: 0px;
|
||||
}
|
||||
&.restart {
|
||||
left: 1px;
|
||||
left: 2px;
|
||||
//left: -18px;
|
||||
}
|
||||
&.terminal {
|
||||
left: -2px;
|
||||
left: -1px;
|
||||
//left: -30px;
|
||||
}
|
||||
visibility: hidden;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
#!/bin/bash
|
||||
<<<<<<< HEAD:deps
|
||||
BASE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
DOCKER_MACHINE_CLI_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-machine-version']" "$(cat $BASE/package.json)")
|
||||
DOCKER_MACHINE_CLI_FILE=docker-machine-$DOCKER_MACHINE_CLI_VERSION
|
||||
=======
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
BASE=$DIR/..
|
||||
BOOT2DOCKER_CLI_VERSION=$(node -pe "JSON.parse(process.argv[1])['boot2docker-version']" "$(cat $BASE/package.json)")
|
||||
BOOT2DOCKER_CLI_FILE=boot2docker-$BOOT2DOCKER_CLI_VERSION
|
||||
>>>>>>> master:util/deps
|
||||
DOCKER_CLI_VERSION=$(node -pe "JSON.parse(process.argv[1])['docker-version']" "$(cat $BASE/package.json)")
|
||||
DOCKER_CLI_FILE=docker-$DOCKER_CLI_VERSION
|
||||
|