resolve merge conflict

pull/268/head
basdewachter 2016-03-04 10:23:18 +01:00
commit 5954626833
45 zmienionych plików z 470 dodań i 1728 usunięć

3
.gitignore vendored
Wyświetl plik

@ -85,4 +85,5 @@ foo.js
hello.js
plugins/c9.docker/containers/ci/files/github_c9_newclient
plugins/c9.docker/containers/shared/files/plugins/salesforce*
security-audit.log
plugins/c9.docker/containers/shared/files/plugins/google*
security-audit.log

133
b9/b9
Wyświetl plik

@ -1,133 +0,0 @@
#!/bin/bash
set -e
set -o pipefail
export CLOUDSDK_PYTHON_SITEPACKAGES=1
SCRIPT_NAME=$BASH_SOURCE
if [ -h $SCRIPT_NAME ]; then SCRIPT_NAME=$(readlink $SCRIPT_NAME); fi
cd $(dirname $SCRIPT_NAME)
B9_DIR=$(pwd)
C9_DIR=$B9_DIR/..
B9=$B9_DIR/b9
source ./lib/_init.sh
MODE=$(_b9_init_mode)
NODEJS="$(_b9_init_nodejs)"
NPM="$(_b9_init_npm)"
TMPDIR=$(_b9_init_temp)
TMP=$TMPDIR
TEMP=$TMPDIR
DEBUG=""
for MODULE in ./lib/*.sh; do
[ $MODULE == "./lib/_init.sh" ] && continue
source $MODULE
done
source $C9_DIR/plugins/c9.docker/d9/_testing.sh
source $C9_DIR/plugins/c9.docker/d9/_redis.sh
source $C9_DIR/plugins/c9.docker/d9/_settings.sh
usage() {
echo "Usage: $B9 [global options ...] COMMAND [commands options...]"
echo
echo "Cloud9 build tool"
echo
echo "Global options:"
echo " --help show this help message"
echo " --debug trace bash commands"
echo " --settings=MODE, -s=MODE which settings file to use"
echo " --deploy shortcut for '-settings=deploy'; use prod database"
echo " --devel shortcut for '-settings=devel'; use devel database"
echo
echo "Commands:"
echo
echo "[Deployment]"
echo " package Package and upload version of Cloud9"
echo " deploy Deploy a Cloud9 version"
echo " static Package static assets"
echo ""
echo "[Internal]"
echo " check Run b9 tests"
echo " exec COMMAND [ARGS] Run arbitrary b9 function"
echo
echo "Environment variables:"
echo "B9_GITHUB_SSH_FILE SSH file to use for downloading from Github"
exit 1
}
for ARG in "$@"; do
case $ARG in
--help|-h)
usage
;;
--debug)
DEBUG="--debug"
B9="$B9 --debug"
shift
;;
-s=*|--settings=*)
MODE="${ARG#*=}"
shift
;;
--deploy)
MODE=deploy
shift
;;
--devel)
MODE=devel
shift
;;
--odev|--onlinedev)
MODE=onlinedev
shift
;;
*)
break
;;
esac
done
ORIGINAL_COMMAND=$1
case $ORIGINAL_COMMAND in
package)
COMMAND=b9_package
;;
deploy)
COMMAND=b9_deploy
;;
static)
COMMAND=b9_static
;;
prepare)
COMMAND=b9_prepare
;;
check)
COMMAND=b9_check
;;
exec) # for debugging only!
shift
COMMAND=$1
;;
"")
usage
;;
*)
echo "Invalid command. See $B9 --help for usage."
exit 1
;;
esac
shift
if [ "$DEBUG" ]; then
set -x
fi
$COMMAND "$@"

Wyświetl plik

@ -1,21 +0,0 @@
FROM debian:8.2
MAINTAINER Cloud9 IDE, Inc. <info@c9.io>
ENV DEBIAN_FRONTEND noninteractive
# ubuntu user
RUN useradd --uid 1000 --shell /bin/bash -m --home-dir /home/ubuntu ubuntu && \
chmod 777 /tmp
RUN apt-get update && \
apt-get install -y curl openssh-client rsync && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# install nodejs
RUN curl https://nodejs.org/dist/v0.10.41/node-v0.10.41-linux-x64.tar.gz | tar xvzf - -C /usr/local --strip-components=1
USER ubuntu
EXPOSE 8080
WORKDIR /home/ubuntu/newclient

Wyświetl plik

@ -1,52 +0,0 @@
FROM debian:8.2
MAINTAINER Cloud9 IDE, Inc. <info@c9.io>
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y curl
# ubuntu user
RUN useradd --uid 1000 --shell /bin/bash -m --home-dir /home/ubuntu ubuntu && \
chmod 777 /tmp
# make ubuntu user sudo
RUN apt-get install -y sudo && \
sed -i 's/%sudo\s.*/%sudo ALL=NOPASSWD:ALL/' /etc/sudoers && \
usermod -a -G sudo ubuntu
RUN chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo
# install nodejs
RUN mkdir /nodejs && curl https://nodejs.org/dist/v0.10.40/node-v0.10.40-linux-x64.tar.gz | tar xvzf - -C /usr/local --strip-components=1
RUN npm install -g npm@2.14.11
# oldclient
RUN apt-get install -y openssh-client
# test runner
RUN npm install -g mocha
# install jsonalzyer dependencies
RUN apt-get install -y golang tmux python python-pip pylint php5 ruby build-essential
# test runner
RUN apt-get install -y redis-server
# for odev
RUN apt-get install -y haproxy
# for CI
RUN apt-get install -y git
ADD files/ssh_config /home/ubuntu/.ssh/config
RUN chown -R ubuntu:ubuntu /home/ubuntu/.ssh
USER ubuntu
# Cloud9 installer
RUN curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash
EXPOSE 8080
VOLUME /home/ubuntu/newclient
WORKDIR /home/ubuntu/newclient

Wyświetl plik

@ -1,14 +0,0 @@
Host github.com
User git
Port 22
Hostname github.com
IdentityFile /home/ubuntu/.ssh/id_rsa_deploy
TCPKeepAlive yes
IdentitiesOnly yes
StrictHostKeyChecking no
Host static.c9.io
IdentityFile /home/ubuntu/.ssh/id_rsa_deploy
StrictHostKeyChecking no
TCPKeepAlive yes
IdentitiesOnly yes

Wyświetl plik

@ -1,70 +0,0 @@
_b9_check_save_deploy_usage() {
echo "Use: check-deploy.sh --service=SERVICE [--server=SERVER] [--wait=WAIT_SECONDS] [--port=PORT]"
exit 1
}
_b9_check_save_deploy() {
local SERVICE
local PORT
local WAIT=default
local SERVER=${SERVER:-localhost}
local P
for P in "$@"; do
case "$P" in
--wait=*)
WAIT=${P#*=}
;;
--server=*)
SERVER=${P#*=}
;;
--service=*)
SERVICE=${P#*=}
PORT=$(_do_get_setting $SERVICE.port)
;;
--port=*)
PORT=${P#*=}
;;
*)
echo "Illegal argument: $P"
_b9_check_save_deploy_usage
esac
done
if [ "$WAIT" == "default" ]; then
WAIT=45
elif [ "$WAIT" == "long" ]; then
WAIT=60
fi
if [ ! "$PORT" ]; then
_b9_check_save_deploy_usage
fi
for I in {1..160}; do
if curl http://$SERVER:$PORT/_health &>/dev/null; then
break
fi
sleep 1
done
echo "Service $SERVICE running, testing if it stays up for $WAIT seconds..."
if ! curl http://$SERVER:$PORT/_health?delay=$((WAIT * 1000)) &>/dev/null; then
echo "Failed: service $SERVICE at $SERVER:$PORT failed to stay up for $WAIT seconds" >&2
echo "Likely it exited with an error, shown in raygun, or the process was killed." >&2
echo "" >&2
echo "Recent errors in service log that might help debug this:" >&2
if [ "$SERVICE" ] && [ "$(type -t ssh)" != "function" ]; then
echo "Warning: ssh function not defined, trying gssh instead"
gssh $SERVER ${SERVICE//_/-}/scripts/tail-log.sh $(_do_get_setting $SERVICE.logFile) >&2
elif [ "$SERVICE" ]; then
ssh $SERVER ${SERVICE//_/-}/scripts/tail-log.sh $(_do_get_setting $SERVICE.logFile) >&2
fi
echo >&2
return 1
fi
echo "Confirmed successful deploy to $SERVER!"
}

Wyświetl plik

@ -1,17 +0,0 @@
_DO_NEWCLIENT_IMAGE=
_b9_get_newclient_image() {
if [ ! -z "$_DO_NEWCLIENT_IMAGE" ]; then
echo $_DO_NEWCLIENT_IMAGE
return
fi
local RESULT=$(docker build -t newclient --rm $B9_DIR/containers/newclient)
if [[ $(echo "$RESULT" | tail -n1) =~ Successfully\ built ]]; then
_DO_NEWCLIENT_IMAGE=$(echo "$RESULT" | tail -n1 | awk '{print $3}')
echo $_DO_NEWCLIENT_IMAGE
return
fi
echo $RESULT
return 1
}

Wyświetl plik

@ -1,15 +0,0 @@
_b9_git_get_hash() {
pushd $C9_DIR &> /dev/null
git rev-parse HEAD
popd &> /dev/null
}
_b9_git_get_hash_short() {
pushd $C9_DIR &> /dev/null
git rev-parse --short=10 HEAD
popd &> /dev/null
}

Wyświetl plik

@ -1,95 +0,0 @@
_b9_init_mode() {
local SUFFIX
SUFFIX=$(hostname | sed 's/.*-//')
local MODE
case $SUFFIX in
prod)
MODE=deploy
;;
dev)
MODE=devel
shift
;;
test)
MODE=test
;;
onlinedev)
MODE=$SUFFIX
;;
*)
MODE=devel
;;
esac
if [ ! "$MODE" ]; then
MODE=devel
fi
echo $MODE
}
_b9_init_temp() {
local TMPDIR
local UNAME=$(id -n -u)
for TMPDIR in /var/lib/docker/tmp /tmp; do
TMPDIR=$TMPDIR/$UNAME
mkdir -p $TMPDIR &> /dev/null && break
TMPDIR=""
done
if [ -z "$TMPDIR" ]; then
echo "Can't find temp dir" 1>&2
exit 1
fi
rm $(mktemp --tmpdir=$TMPDIR)
echo $TMPDIR
}
_b9_init_nodejs() {
local NODEJS
. ~/.nvm/nvm.sh &> /dev/null || :
for NODEJS in $(which node 2>/dev/null) $(which nodejs 2>/dev/null) /usr/local/bin/node /usr/bin/nodejs; do
[ -x $NODEJS ] && break
NODEJS=""
done
if [ -z "$NODEJS" ]; then
echo "Can't find node executable" 1>&2
exit 1
fi
echo $NODEJS
}
_b9_init_npm() {
local NPM
. ~/.nvm/nvm.sh &> /dev/null || :
for NPM in $(which npm) /usr/local/bin/npm /usr/bin/npm; do
[ -x $NPM ] && break
NPM=""
done
if [ -z "$NPM" ]; then
echo "Can't find npm executable" 1>&2
exit 1
fi
echo $NODEJS $NPM
}
_B9_NODE_HELPER_INITIALIZED=0
_b9_init_node_helper() {
[ "$_B9_NODE_HELPER_INITIALIZED" == "1" ] && return
_B9_NODE_HELPER_INITIALIZED=1
pushd $B9_DIR/lib/js &> /dev/null
rm -rf node_modules
$NPM install
popd &> /dev/null
}

Wyświetl plik

@ -1,37 +0,0 @@
_b9_npm() {
local WORKDIR=$1
shift
# TODO run all build steps in a container
if [ $(id -u) == "1000" ]; then
docker run \
--rm \
-w /home/ubuntu/newclient \
-v $WORKDIR:/home/ubuntu/newclient \
--sig-proxy -a STDIN -a STDOUT -a STDERR \
$(_b9_get_newclient_image) bash -c "
echo \"$(_b9_npm_get_github_ssh)\" >> /home/ubuntu/.ssh/id_rsa_deploy
chmod 600 /home/ubuntu/.ssh/id_rsa_deploy
npm "$@"
"
else
pushd $WORKDIR &> /dev/null
$NPM "$@"
popd &> /dev/null
fi
}
_b9_npm_get_github_ssh() {
local FILE
for FILE in "$B9_GITHUB_SSH_FILE" ~/.ssh/id_rsa_c9robot ~/.ssh/id_rsa_deploy ~/.ssh/id_rsa; do
if [ -e "$FILE" ]; then
cat $FILE
return
fi
done
echo "Can't find SSH key for Github" 1>&2
exit 1
}

Wyświetl plik

@ -1,4 +0,0 @@
b9_check() {
echo "Running B9 tests"
_do_check_package
}

Wyświetl plik

@ -1,241 +0,0 @@
b9_deploy_usage() {
echo "Usage: $B9 deploy SERVICES TREEISH SERVER_PATTERN [ARG...]"
echo
echo "Deploy a Cloud9 version"
echo
echo "Options:"
echo " --strategy=[slow_start|parallel|serial] Deploy strategy to use (default: slow_start)"
echo " --regex Interpret server patter as regular expression"
echo " --no-check skip the health check"
exit 1
}
b9_deploy() {
[ "$1" == "--help" ] && b9_deploy_usage
local SERVICES=$1 && shift
local TREEISH=$1 && shift
local SERVER_PATTERN=$1 && shift
local DRY_RUN=""
local ASSET="gcs"
local USE_REGEX=""
local NO_CHECK=""
local TYPE=newclient
local STRATEGY=slow_start
[ -z "$SERVICES" ] && b9_deploy_usage
[ -z "$TREEISH" ] && b9_deploy_usage
[ -z "$SERVER_PATTERN" ] && b9_deploy_usage
local ARG
for ARG in "$@"; do
case $ARG in
--strategy=*)
STRATEGY="${ARG#*=}"
shift
;;
--docker)
ASSET="docker"
shift
;;
--no-check)
NO_CHECK="--no-check"
shift
;;
--regex)
USE_REGEX="--regex"
shift
;;
--dry-run)
DRY_RUN="1"
shift
;;
--help)
b9_deploy_usage
shift
;;
*)
b9_deploy_usage
;;
esac
done
[ "$SERVICES" == "docker" ] && TYPE=docker
local SERVER_LIST
local VERSION
local TMPFILE=$(mktemp --tmpdir=$TMPDIR)
b9_package $TREEISH --type=$TYPE | tee $TMPFILE
VERSION=$(cat $TMPFILE | tail -n1)
rm $TMPFILE
SERVER_LIST="$(_b9_deploy_server_list $SERVER_PATTERN $USE_REGEX)"
local CMD="$B9 --settings=$MODE exec _b9_deploy_one_from_${ASSET} $NO_CHECK $VERSION $SERVICES"
if [ "$DRY_RUN" == "1" ]; then
CMD="echo $CMD"
fi
_b9_deploy_release_event "$SERVICES" $VERSION $SERVER_PATTERN
_b9_deploy_strategy_${STRATEGY} "$SERVER_LIST" "$CMD"
}
_b9_deploy_strategy_slow_start() {
local SERVER_LIST=$1
local CMD=$2
# first one
$CMD $(echo "$SERVER_LIST" | head -n1)
# then two
echo "$SERVER_LIST" | tail -n +2 | head -n2 | parallel --halt 1 $CMD
# then the rest
echo "$SERVER_LIST" | tail -n +4 | parallel --halt 1 -j 15 $CMD
}
_b9_deploy_strategy_parallel() {
local SERVER_LIST=$1
local CMD=$2
# first one
$CMD $(echo "$SERVER_LIST" | head -n1)
# then the rest
echo "$SERVER_LIST" | tail -n +2 | parallel --halt 1 -j 30 $CMD
}
_b9_deploy_strategy_serial() {
local SERVER_LIST=$1
local CMD=$2
echo "$SERVER_LIST" | xargs -n1 $CMD
}
_b9_deploy_server_list () {
local SERVER_PATTERN=$1
local USE_REGEX=$2
$C9_DIR/scripts/gssh --no-cache $USE_REGEX --print-names "$SERVER_PATTERN" | shuf
}
_b9_deploy_one_from_gcs() {
local NO_CHECK=$1
if [ "$NO_CHECK" == "--no-check" ]; then
shift
else
NO_CHECK=""
fi
local VERSION=$1
local SERVICES=$2
local SERVER=$3
echo Deploying $VERSION \($SERVICES\) to $SERVER ... >&2
_b9_deploy_upload_from_gcs $VERSION $SERVER
_b9_deploy_update_services $VERSION $SERVICES $SERVER
[ -z "$NO_CHECK" ] && _b9_deploy_check $SERVER $SERVICES
echo Deployed $VERSION to $SERVER >&2
}
_b9_deploy_upload_from_gcs() {
local VERSION=$1
local SERVER=$2
local TGZ
TGZ=$(_b9_package_download_gcs $VERSION)
local VERSIONS_DIR="/home/ubuntu/versions"
local TARGET_FILE=${VERSIONS_DIR}/$(basename $TGZ)
local TARGET_DIR=${VERSIONS_DIR}/$(basename $TGZ ".tar.xz")
_b9_deploy_ssh $SERVER "rm -rf $TARGET_DIR $TARGET_FILE; mkdir -p /home/ubuntu/versions/history"
_b9_deploy_scp $TGZ $SERVER:$TARGET_FILE
_b9_deploy_ssh $SERVER "cd /home/ubuntu/versions && tar xf $TARGET_FILE && rm $TARGET_FILE"
}
_b9_deploy_update_services() {
local VERSION=$1
local SERVICES=$2
local SERVER=$3
local TOTAL_VERSIONS_TO_KEEP=7
local VERSIONS_DIR="/home/ubuntu/versions"
local TARGET_DIR=${VERSIONS_DIR}/$VERSION
local BUILD_NAME=$(echo $VERSION | awk -F- '{printf "%s-%s-%s", $1, $2, $3}')
_b9_deploy_ssh $SERVER "
for SERVICE in $(echo $SERVICES | sed 's/,/ /g'); do
mv /home/ubuntu/\$SERVICE /home/ubuntu/versions/history/\$SERVICE-$(date +%FT%T) &>/dev/null;
ln -s $TARGET_DIR /home/ubuntu/\$SERVICE;
done
~/supervisord_start_script.sh || ~/supervisord_start_script.sh -f || ~/supervisord_start_script.sh -f;
cd /home/ubuntu/versions;
USED_VERSIONS=\$(ls -l /home/ubuntu | grep -F -- '-> /home/ubuntu/versions' | awk -F'-> ' '{print \$2}' | awk -F/ '{print \$(NF)}');
ls -t 2>/dev/null | grep $BUILD_NAME | grep -v -F \"\$USED_VERSIONS\" | tail -n +$TOTAL_VERSIONS_TO_KEEP | xargs sudo rm -rf;"
}
_b9_deploy_check() {
local SERVER=$1
local SERVICES=$2
echo $SERVICES | sed 's/,/\n/g' | parallel --halt 1 -j 0 $B9 exec _b9_deploy_check_one $SERVER
}
_b9_deploy_check_one() {
local SERVER=$1
local SERVICE=$2
local HOST
local PORT
local WAIT=default
HOST=$(echo $SERVER | awk -F@ '{ print $2}')
if [ "$SERVICE" == "oldclient" ]; then
SERVICE="c9"
elif [ "$SERVICE" == "docker" ]; then
WAIT=long
SERVICE="docker-daemon"
elif [[ $SERVICE =~ ^vfs-[0-9]$ ]]; then
PORT="--port=804$(echo $SERVICE | awk -F- '{print $2}')"
SERVICE="vfs"
else
SERVICE=${SERVICE//-/_}
fi
if ! _b9_check_save_deploy --wait=$WAIT $PORT --server=$HOST --service=$SERVICE; then
echo "One or more safe deploy checks failed :(" >&2
exit 1
fi
}
_b9_deploy_release_event() {
local SERVICES=$1
local VERSION=$2
local SERVER_PATTERN=$3
_b9_init_node_helper
echo $SERVICES | sed 's/,/\n/g' | xargs -I '{}' -n1 $NODEJS $B9_DIR/lib/js/release_event.js '{}' $MODE $VERSION $SERVER_PATTERN
}
_b9_deploy_ssh() {
/usr/bin/ssh \
-o LogLevel=ERROR \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
-i $(find ~/.ssh/ -name "*" | grep -Pe "./(google_compute_engine|id_rsa_ansible|id_rsa)$" | head -1)\
"$@"
}
_b9_deploy_scp() {
/usr/bin/scp \
-o LogLevel=ERROR \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
-i $(find ~/.ssh/ -name "*" | grep -Pe "./(google_compute_engine|id_rsa_ansible|id_rsa)$" | head -1) \
"$@"
}

Wyświetl plik

@ -1,118 +0,0 @@
#!/usr/bin/env node
"use strict";
var DEFAULT_MODULES = ["c9", "simple-template", "architect", "amd-loader", "heapdump", "optimist"];
var DEFAULT_SETTINGS = "deploy";
var npmBuild = require("architect-build/npm_build");
var async = require("async");
var fs = require("fs");
var optimist = require("optimist");
var _ = require("lodash");
module.exports = nodeModules;
if (!module.parent) {
main(process.argv.slice(2), function(err) {
if (err) {
console.error(err);
console.error("Stacktrace: ", err.stack);
process.exit(1);
}
});
}
function main(argv, callback) {
var options = optimist(argv)
.usage("Usage: $0 [CONFIG_NAME] [--help]")
.alias("s", "settings")
.default("settings", DEFAULT_SETTINGS)
.describe("settings", "Settings file to use")
.default("source", __dirname + "/../../..")
.describe("source", "Source directory")
.describe("targetFile", "Target package.json")
.boolean("help")
.describe("help", "Show command line options.");
argv = options.argv;
if (argv.help) {
options.showHelp();
return callback();
}
if (argv._.length != 1) {
options.showHelp();
return callback();
}
var config = argv._[0];
var settings = argv.settings;
var source = argv.source;
nodeModules(source, config, settings, function(err, json) {
if (err) return callback(err);
if (argv.targetFile)
fs.writeFileSync(argv.targetFile, JSON.stringify(json, null, 2));
else
console.log(JSON.stringify(json, null, 2));
});
}
function calculateRequiredNodeModules(sourceDir, buildConfig, configNames, settingsName, callback) {
if (buildConfig.nodeModulesInclude === "*") { // If the user specifically asks for all don't bother calculating
return callback();
}
async.map(configNames.split(","), calculateModules, function (err, modules) {
if (err) return callback(err);
return callback(null, _.uniq(_.flatten(modules))); /* Flatten array and remove duplicates */
});
function calculateModules (configName, done) {
npmBuild({
root: sourceDir,
args: [configName, '-s', settingsName]
}, function (err, result) {
if (err) return done(err);
var deps = result.roots;
var nodeModules = [];
deps.forEach(function (dep) {
if (dep.match(/node_modules/)) {
nodeModules.push(dep.replace(/node_modules\//, ""));
}
});
nodeModules.sort();
return done(null, nodeModules);
});
}
}
function nodeModules(sourceDir, configNames, settingsName, callback) {
var buildConfig = require(sourceDir + "/configs/" + configNames).buildConfig({mode: settingsName});
var packageJson = require(sourceDir + "/package.json");
var nodeModules = packageJson.dependencies;
delete packageJson.devDependencies;
delete packageJson.scripts;
/* Calculates what modules are needed for this config, so they can be contact'd to nodeModulesInclude */
calculateRequiredNodeModules(sourceDir, buildConfig, configNames, settingsName, function(err, modules) {
if (err) return callback(err);
var allModules = buildConfig.nodeModulesInclude.concat(modules).concat(DEFAULT_MODULES);
packageJson.dependencies = allModules.reduce(function(deps, name) {
if (nodeModules[name])
deps[name] = nodeModules[name];
else
deps[name] = "*";
return deps;
}, {});
callback(null, packageJson);
});
}

Wyświetl plik

@ -1,23 +0,0 @@
#!/usr/bin/env node
/*global describe it before after beforeEach afterEach */
"use strict";
"use server";
require("c9/inline-mocha")(module, null, { globals: ["define"]});
var assert = require("assert-diff");
var nodeModules = require("./filter_node_modules");
describe(__filename, function() {
it("should filter node modules for docker", function(done) {
nodeModules(__dirname + "/../../..", "docker", "deploy", function(err, config) {
assert(!err, err);
assert(config.dependencies["optimist"]);
assert(!config.dependencies["nodemailer-smtp-transport"]);
done();
});
});
});

Wyświetl plik

@ -1,100 +0,0 @@
#!/usr/bin/env node
"use strict";
var DEFAULT_SETTINGS = "deploy";
var ALWAYS_INCLUDE_SETTINGS = ["node", "mode", "manifest", "domains", "primaryDomain", "primaryBaseUrl", "baseUrlPattern"];
var fs = require("fs");
var optimist = require("optimist");
var loadManifest = require("c9/manifest").load;
var reJSON = require("c9/json-with-re");
module.exports = generateSettings;
if (!module.parent) {
main(process.argv.slice(2), function(err) {
if (err) {
console.error(err);
console.error("Stacktrace: ", err.stack);
process.exit(1);
}
});
}
function main(argv, callback) {
var options = optimist(argv)
.usage("Usage: $0 [CONFIG_NAME] [--help]")
.alias("s", "settings")
.default("settings", DEFAULT_SETTINGS)
.describe("settings", "Settings file to use")
.default("source", __dirname + "/../../..")
.describe("source", "Source directory")
.describe("targetFile", "Target package.json")
.boolean("help")
.describe("help", "Show command line options.");
argv = options.argv;
if (argv.help) {
options.showHelp();
return callback();
}
if (argv._.length != 1) {
options.showHelp();
return callback();
}
var config = argv._[0];
var settingsName = argv.settings;
var source = argv.source;
generateSettings(source, config, settingsName, function(err, contents) {
if (err) return callback(err);
if (argv.targetFile)
fs.writeFileSync(argv.targetFile, contents);
else
console.log(contents);
});
}
function generateSettings(source, config, settingsName, callback) {
// Check if build already exists.
var manifest = loadManifest(source);
manifest.hostname = "[%type%]-[%provider%]-[%region%]-[%index%]-[%env%]";
var oldSettings;
try {
oldSettings = require(source + "/settings/" + settingsName)(manifest);
} catch (e) {
return callback(e);
}
var buildConfig = require(source + "/configs/" + config).buildConfig({mode: settingsName});
if (buildConfig.settingsInclude == "*") {
newSettings = oldSettings;
}
else {
buildConfig.settingsInclude = buildConfig.settingsInclude.concat(ALWAYS_INCLUDE_SETTINGS);
var newSettings =
buildConfig.settingsInclude.reduce(function(settings, name) {
settings[name] = oldSettings[name];
return settings;
}, {});
}
newSettings.node = oldSettings.node;
var contents =
"var hostname = require('c9/hostname');\n" +
"var reJSON = require('c9/json-with-re');\n" +
"var fill = require('simple-template').fill;\n" +
"module.exports = function() {\n" +
" var options = hostname.parse(hostname.get());\n" +
" options.root = __dirname + '/..';\n" +
" var template = " + reJSON.stringify(newSettings, 2).replace(new RegExp(source, "g"), "[%root%]") + ";\n" +
" return reJSON.parse(fill(JSON.stringify(template), options));\n" +
"};";
callback(null, contents);
}

Wyświetl plik

@ -1,52 +0,0 @@
#!/usr/bin/env node
/*global describe it before after beforeEach afterEach */
"use strict";
"use server";
require("c9/inline-mocha")(module, null, { globals: ["define"]});
var assert = require("assert-diff");
var vm = require("vm");
var generateSettings = require("./generate_settings");
describe(__filename, function() {
it("should filter settings file", function(done) {
generateSettings(__dirname + "/../../..", "docker", "deploy", function(err, settings) {
assert(!err, err);
settings = eval(settings)();
assert(settings.docker);
assert(settings["docker-daemon"]);
assert(settings.aws);
assert(settings.sapi);
assert(settings.rabbitmq);
assert(!settings.c9);
assert(!settings.auth);
assert(!settings.worker);
assert(!settings.captcha);
assert(!settings.sendgrid);
assert(!settings.redis);
assert(!settings["redis-slave"]);
assert(!settings.sessionredis);
assert(!settings["sessionredis-slave"]);
assert(!settings.github);
assert(!settings.bitbucket);
assert(!settings.salesforce);
assert(!settings.google);
assert(!settings.c9_auth);
assert(!settings.services);
assert(!settings.mailer);
assert(!settings.zuora);
assert(!settings.pricing);
assert(!settings.catalog);
assert(!settings.minfraud);
assert(!settings.support);
done();
});
});
});

Wyświetl plik

@ -1,69 +0,0 @@
#!/usr/bin/env node
"use strict";
var DEFAULT_SETTINGS = "deploy";
var optimist = require("optimist");
var loadManifest = require("c9/manifest").load;
module.exports = listPlugins;
if (!module.parent) {
main(process.argv.slice(2), function(err) {
if (err) {
console.error(err);
console.error("Stacktrace: ", err.stack);
process.exit(1);
}
});
}
function main(argv, callback) {
var options = optimist(argv)
.usage("Usage: $0 [CONFIG_NAME] [--help]")
.alias("s", "settings")
.default("settings", DEFAULT_SETTINGS)
.describe("settings", "Settings file to use")
.default("source", __dirname + "/../../..")
.describe("source", "Source directory")
.boolean("help")
.describe("help", "Show command line options.");
argv = options.argv;
if (argv.help) {
options.showHelp();
return callback();
}
if (argv._.length != 1) {
options.showHelp();
return callback();
}
var config = argv._[0];
var settingsName = argv.settings;
var source = argv.source;
listPlugins(source, config, settingsName).forEach(function(line) {
console.log(line);
});
}
function listPlugins(source, configName, settingsName) {
var manifest = loadManifest(source);
manifest.hostname = "[%type%]-[%provider%]-[%region%]-[%index%]-[%env%]";
var settings = require(source + "/settings/" + settingsName)(manifest);
var config = require(source + "/configs/" + configName)(settings, optimist([]));
var plugins = Object.keys(config.reduce(function(processedPlugins, plugin) {
var packagePath = plugin.packagePath || plugin;
if (packagePath.indexOf("./") === 0) {
var pluginDir = packagePath.slice(2, packagePath.indexOf("/", 2));
processedPlugins[pluginDir] = true;
}
return processedPlugins;
}, {}));
return plugins;
}

Wyświetl plik

@ -1,22 +0,0 @@
#!/usr/bin/env node
/*global describe it before after beforeEach afterEach */
"use strict";
"use server";
require("c9/inline-mocha")(module, null, { globals: ["define"]});
var assert = require("assert-diff");
var listPlugins = require("./list_plugins");
describe(__filename, function() {
it("should filter node modules for docker", function() {
var list = listPlugins(__dirname + "/../../..", "docker", "deploy");
assert(list.indexOf("c9.docker") >= 0);
assert(list.indexOf("c9.mq") >= 0);
assert(list.indexOf("c9.db.redis") == -1);
});
});

Wyświetl plik

@ -1,10 +0,0 @@
{
"name": "b9-utils",
"private": true,
"dependencies": {
"async": "^1.5.2",
"lodash": "^4.2.1",
"mkdirp": "^0.5.1",
"optimist": "^0.6.1"
}
}

Wyświetl plik

@ -1,61 +0,0 @@
"use strict";
var https = require("https");
var DATADOG_API_KEY = '64e56d39dfdd7f2bbf06f09100d51a18';
var DATADOG_API_URL = 'https://app.datadoghq.com';
module.exports = releaseEvent;
if (!module.parent) {
var argv = process.argv;
releaseEvent(argv[2], argv[3], argv[4], argv[5], function(err) {
if (err) {
console.error("Error posting release event to datadog" + err.message);
process.exit(1);
}
process.exit(0);
});
}
function datadogEvent(msg, callback) {
var payload = JSON.stringify(msg);
var req = https.request({
hostname: "app.datadoghq.com",
port: 443,
path: "/api/v1/events?api_key=" + encodeURIComponent(DATADOG_API_KEY),
method: "POST",
headers: {
"Accept": "application/json",
"Content-Type": "application/json",
"Content-Length": payload.length
}
}, function(res) {
if (res.statusCode >= 400)
return callback(new Error("request failed with status code " + res.statusCode));
callback();
});
req.on("error", function(e) {
callback(e);
});
req.write(payload);
req.end();
}
function releaseEvent(application, mode, version, pattern, callback) {
datadogEvent({
title: 'Release: ' + application + ' version ' + version + ' to "' + pattern + '"',
tags: [
'release',
'application:' + application,
'mode:' + mode,
'version:' + version,
'pattern:' + pattern
]
}, callback);
}

Wyświetl plik

@ -1,199 +0,0 @@
readonly B9_PACKAGE_GIT_CACHE=$C9_DIR
b9_package_usage() {
echo "Usage: $B9 package TREEISH [ARG...]"
echo
echo "Package and upload a version of Cloud 9"
echo
echo "Options:"
echo " --type=[newclient|docker] (default: newclient)"
echo " --no-cache"
exit 1
}
b9_package() {
[ "$1" == "--help" ] && b9_package_usage
local TREEISH=$1
local TYPE=newclient
local SETTINGS=$MODE
local STORAGE=gcs
local USE_CACHE=1
[ -z "$TREEISH" ] && b9_package_usage
[[ $TREEISH =~ -- ]] && b9_package_usage
shift
local ARG
for ARG in "$@"; do
case $ARG in
--type=*)
TYPE="${ARG#*=}"
shift
;;
--docker)
STORAGE=docker
shift
;;
--no-cache)
USE_CACHE=0
shift
;;
*)
b9_package_usage
;;
esac
done
local VERSION
local WORKDIR
[ "$TYPE" == "newclient" ] && SETTINGS=all
_b9_package_init_git_cache
VERSION=$(_b9_get_version $TREEISH $TYPE $SETTINGS)
if [ "$USE_CACHE" == "1" ] && _b9_package_is_cached $STORAGE $VERSION; then
echo $VERSION
return
fi
WORKDIR=$(_b9_package_init_work_dir $VERSION)
_b9_package_sync_workdir $TYPE $WORKDIR $VERSION $SETTINGS
_b9_package_npm_install $WORKDIR
_b9_package_cleanup_workdir $WORKDIR
_b9_package_upload $STORAGE $WORKDIR $VERSION
echo $VERSION
}
_b9_package_init_git_cache() {
pushd $B9_PACKAGE_GIT_CACHE &> /dev/null
if [ ! -d .git ]; then
git clone git@github.com:c9/newclient.git .
fi
git fetch origin
popd &> /dev/null
}
_b9_package_init_work_dir() {
local VERSION=$1
mktemp -d b9-package-${VERSION}-XXXXXXXXXXXXX --tmpdir=$TMP
}
_b9_get_version() {
local TREEISH=$1
local TYPE=${2:-newclient}
local SETTINGS=${3:-all}
pushd $B9_PACKAGE_GIT_CACHE &> /dev/null
echo c9-${TYPE}-${SETTINGS}-$(git show $TREEISH:package.json | jq -r .version)-$(git rev-parse --short=8 $TREEISH)
popd &> /dev/null
}
_b9_package_is_cached() {
local STORAGE=$1
local VERSION=$2
if [ -d $TMP/$VERSION ]; then
return
fi
case $STORAGE in
gcs)
_b9_package_is_cached_gcs $VERSION
;;
docker)
_b9_package_is_cached_docker $VERSION
;;
*)
echo "Invalid storage type: $STORAGE" 1>&2
exit 1
;;
esac
}
_b9_package_upload() {
local STORAGE=$1
local WORKDIR=$2
local VERSION=$3
case $STORAGE in
gcs)
_b9_package_upload_gcs $WORKDIR $VERSION
;;
docker)
_b9_package_upload_docker $WORKDIR $VERSION
;;
*)
exit 1
;;
esac
mv $WORKDIR $TMP/$VERSION
}
_b9_package_sync_workdir() {
local TYPE=$1
local WORKDIR=$2
local VERSION=$3
local SETTINGS=$4
case $TYPE in
newclient)
_b9_package_sync_workdir_newclient $WORKDIR $VERSION $SETTINGS
;;
docker)
_b9_package_sync_workdir_docker $WORKDIR $VERSION $SETTINGS
;;
*)
exit 1
;;
esac
}
_b9_package_npm_install() {
local WORKDIR=$1
pushd $WORKDIR &> /dev/null
_b9_install_deps
popd &> /dev/null
}
_b9_package_cleanup_workdir() {
local WORKDIR=$1
local REVISION
[ -z "$WORKDIR" ] && return 1
pushd $WORKDIR &> /dev/null
_b9_package_patch_package_json
rm -rf .git build bin local
popd &> /dev/null
}
_b9_package_patch_package_json() {
[ ! -d .git ] && return 0
REVISION=$(git rev-parse HEAD)
mv package.json _package.json
cat _package.json | jq ".revision=\"$REVISION\"" > package.json
rm _package.json
}
_do_check_package() {
MODE=devel
b9_package origin/master --type=newclient --no-cache
b9_package origin/master --type=newclient
MODE=deploy
b9_package origin/master --type=docker --no-cache
MODE=devel
b9_package origin/master --docker --no-cache
}

Wyświetl plik

@ -1,116 +0,0 @@
_b9_package_sync_workdir_docker() {
local WORKDIR=$1
local VERSION=$2
local SETTINGS=$3
local SOURCE=$WORKDIR/source
pushd $WORKDIR &> /dev/null
_b9_package_docker_init_source $WORKDIR $SOURCE $VERSION $SETTINGS
_b9_package_docker_init_workdir
_b9_init_node_helper
_b9_package_docker_node_modules $WORKDIR $SOURCE $SETTINGS
_b9_package_docker_generate_settings $WORKDIR $SOURCE $SETTINGS
_b9_package_docker_include_files $WORKDIR $SOURCE $SETTINGS
_b9_package_docker_copy_plugins $WORKDIR $SOURCE $SETTINGS
rm -rf $SOURCE
popd &> /dev/null
}
_b9_package_docker_init_source() {
local WORKDIR=$1
local SOURCE=$2
local VERSION=$3
local SETTINGS=$4
rm -rf $WORKDIR
mkdir -p $SOURCE
_b9_package_sync_workdir_newclient $SOURCE $VERSION $SETTINGS
_b9_package_npm_install $SOURCE
}
_b9_package_docker_init_workdir() {
mkdir -p plugins
mkdir -p node_modules
mkdir -p settings
mkdir -p configs
}
_b9_package_docker_node_modules() {
local WORKDIR=$1
local SOURCE=$2
local SETTINGS=$3
local NODE_MODULES
local MODULE
NODE_PATH=$B9_DIR/lib/js/node_modules $NODEJS $B9_DIR/lib/js/filter_node_modules.js docker --targetFile=$WORKDIR/package.json --source=$SOURCE --settings=$SETTINGS
NODE_MODULES=$(cat $WORKDIR/package.json | jq -r '.dependencies | keys | @sh')
mkdir -p $WORKDIR/node_modules
for MODULE in $NODE_MODULES; do
MODULE=${MODULE:1:-1}
if [ -d $SOURCE/node_modules/$MODULE ]; then
cp -a $SOURCE/node_modules/$MODULE $WORKDIR/node_modules
fi
done
pushd $WORKDIR &> /dev/null
_b9_npm "$WORKDIR" install
popd &> /dev/null
}
_b9_package_docker_generate_settings() {
local WORKDIR=$1
local SOURCE=$2
local SETTINGS=$3
$NODEJS $B9_DIR/lib/js/generate_settings.js docker --targetFile=$WORKDIR/settings/$SETTINGS.js --source=$SOURCE --settings=$SETTINGS
}
_b9_package_docker_include_files() {
local WORKDIR=$1
local SOURCE=$2
local SETTINGS=$3
local BUILD_CONFIG
local FILE_MODULES_INCLUDE
local PATTERN
pushd $WORKDIR &> /dev/null
BUILD_CONFIG=$($NODEJS -e "console.log(JSON.stringify(require('$SOURCE/configs/docker').buildConfig({mode: '$SETTINGS'})))")
FILE_INCLUDE=$(echo $BUILD_CONFIG | jq -r '.fileInclude | @sh')
for PATTERN in $FILE_INCLUDE; do
PATTERN=${PATTERN:1:-1}
mkdir -p $(dirname $PATTERN)
cp -a -R $SOURCE/$PATTERN $(dirname $PATTERN)
done
for PATTERN in "server.js" "scripts/tail-log.sh" "configs/docker.js"; do
mkdir -p $(dirname $PATTERN)
cp -a -R $SOURCE/$PATTERN $(dirname $PATTERN) || :
done
popd &> /dev/null
}
_b9_package_docker_copy_plugins() {
local WORKDIR=$1
local SOURCE=$2
local SETTINGS=$3
local PLUGINS
local PLUGIN
PLUGINS=$($NODEJS $B9_DIR/lib/js/list_plugins.js docker --source=$SOURCE --settings=$SETTINGS)
for PLUGIN in $PLUGINS; do
cp -a $SOURCE/plugins/$PLUGIN $WORKDIR/plugins
done
}

Wyświetl plik

@ -1,17 +0,0 @@
_b9_package_sync_workdir_newclient() {
local WORKDIR=$1
local VERSION=$2
local HASH
HASH=$(echo $VERSION | awk -F- '{print $5}')
rm -rf $WORKDIR
mkdir -p $WORKDIR
pushd $WORKDIR &> /dev/null
rsync -qrtv --delete $B9_PACKAGE_GIT_CACHE/.git $WORKDIR/
git reset --hard
git checkout $HASH
popd &> /dev/null
}

Wyświetl plik

@ -1,74 +0,0 @@
readonly B9_DOCKER_REGISTRY=gcr.io/c9.io/cloud9gce
readonly B9_DOCKER_BUCKET=gs://artifacts.cloud9gce.c9.io.a.appspot.com
_b9_dockerize_update_base() {
local TREEISH=origin/master
local CID
local VERSION
# build package
local TMPFILE=$(mktemp --tmpdir=$TMPDIR)
b9_package $TREEISH --type=newclient | tee $TMPFILE
VERSION=$(cat $TMPFILE | tail -n1)
rm $TMPFILE
# build base image
docker build -t $B9_DOCKER_REGISTRY/c9:base $B9_DIR/containers/c9
CID=$(docker run -d $B9_DOCKER_REGISTRY/c9:base sleep 1h)
# copy package to base
docker exec $CID bash -c "
cd /home/ubuntu &&
tar xf $TMP/$VERSION.tar.xz
rm -rf $VERSION.tgz newclient
mv $VERSION newclient"
# commit image
docker stop $CID
docker commit $CID $B9_DOCKER_REGISTRY/c9:base
# push
gcloud docker push $B9_DOCKER_REGISTRY/c9:base
}
_b9_package_is_cached_docker() {
local VERSION=$1
local TAG
TAG=$(echo $VERSION | awk -F- '{printf "%s-%s", $4, $5}')
_b9_dockerize_has_tag c9 $TAG
}
_b9_package_upload_docker() {
local WORKDIR=$1
local VERSION=$2
local CID
local TAG
gcloud docker pull $B9_DOCKER_REGISTRY/c9:base
CID=$(docker run -d -v $WORKDIR:/home/ubuntu/$(basename $WORKDIR):ro $B9_DOCKER_REGISTRY/c9:base sleep 1h)
# copy package
docker exec $CID bash -c "
cd /home/ubuntu &&
rsync -qrt --delete --checksum /home/ubuntu/$(basename $WORKDIR)/* newclient"
# commit image
TAG=$(echo $VERSION | awk -F- '{printf "%s-%s", $4, $5}')
docker stop $CID
docker commit $CID $B9_DOCKER_REGISTRY/c9:$TAG
# push
gcloud docker push $B9_DOCKER_REGISTRY/c9:$TAG
}
_b9_dockerize_has_tag() {
local REPO=$1
local TAG=$2
gsutil ls $B9_DOCKER_BUCKET/containers/repositories/library/${REPO}/tag_${TAG}
}

Wyświetl plik

@ -1,34 +0,0 @@
_b9_package_is_cached_gcs() {
local VERSION=$1
gsutil ls gs://cloud9_ci_cache/$(basename $VERSION).tar.xz &> /dev/null
}
_b9_package_upload_gcs() {
local WORKDIR=$1
local VERSION=$2
local TMP_TAR
local CACHE_FILE
pushd $WORKDIR/.. &> /dev/null
TMP_TAR=$(mktemp b9-package-XXXXXXXXXXXXX --tmpdir=$TMP --suffix=.tar.xz)
tar --transform="s/^$(basename $WORKDIR)/$VERSION/" -cJf $TMP_TAR $(basename $WORKDIR)
gsutil cp $TMP_TAR gs://cloud9_ci_cache/$VERSION.tar.xz
mv $TMP_TAR $TMP/$VERSION.tar.xz
popd &> /dev/null
}
_b9_package_download_gcs() {
local VERSION=$1
local CACHE_FILE=$TMP/${VERSION}.tar.xz
if [ -f "$CACHE_FILE" ]; then
echo $CACHE_FILE
return
fi
gsutil cp gs://cloud9_ci_cache/$(basename $CACHE_FILE) $TMP
echo $CACHE_FILE
}

Wyświetl plik

@ -1,80 +0,0 @@
readonly NPMCACHE=$TMP
b9_prepare_usage() {
echo "Usage: $B9 prepare [OPTIONS]"
echo
echo "Prepare checkout for testing"
echo
echo "Options:"
echo " --help show this help message"
exit 1
}
b9_prepare() {
for ARG in "$@"; do
case $ARG in
--help|-h)
usage
;;
*)
usage
;;
esac
done
pushd $C9_DIR &> /dev/null
# npm
rm -rf node_modules
git checkout -- node_modules
_b9_install_deps
git checkout -- node_modules
popd &> /dev/null
}
_b9_install_deps() {
if [ -f plugins/c9.profile/npm-shrinkwrap.json ]; then
_b9_setup_node_modules npm-shrinkwrap.json
fi
if [ -f plugins/c9.profile/npm-shrinkwrap.json ]; then
_b9_setup_node_modules plugins/c9.profile/npm-shrinkwrap.json
fi
}
_b9_setup_node_modules() {
local PACKAGE_FILE=$1
local PACKAGE_PATH=$(dirname $PACKAGE_FILE)
local PACKAGE_MD5=$(cat $PACKAGE_FILE | jq 'del(.version)' | md5sum | awk '{print $1}')
local CACHE_FILE="npm-${PACKAGE_MD5}.tar.xz"
if [ -e "$TMP/$CACHE_FILE" ] || gsutil cp gs://cloud9_ci_cache/$CACHE_FILE $TMP &> /dev/null; then
rm -rf $PACKAGE_PATH/node_modules
tar -xkf $TMP/$CACHE_FILE || (
rm $CACHE_FILE &>/dev/null
_b9_compile_node_modules "$CACHE_FILE" "$PACKAGE_PATH"
)
else
_b9_compile_node_modules "$CACHE_FILE" "$PACKAGE_PATH"
fi
}
_b9_compile_node_modules() {
local CACHE_FILE=$1
local PACKAGE_PATH=$2
local NPM_CMD
local TMP_TAR
if ! _b9_npm "$(pwd)/$PACKAGE_PATH" install; then
rm -rf node_modules
git checkout node_modules
_b9_npm "$(pwd)/$PACKAGE_PATH" install
fi
TMP_TAR=$(mktemp -d b9-npm-XXXXXXXXXXXXX --tmpdir=$TMP)/$CACHE_FILE
tar -cJf $TMP_TAR $PACKAGE_PATH/node_modules
gsutil cp $TMP_TAR gs://cloud9_ci_cache
mv $TMP_TAR $TMP/$CACHE_FILE
}

BIN
build/linux/c9.png 100644

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 4.2 KiB

Wyświetl plik

@ -320,6 +320,7 @@ module.exports = function(options) {
"plugins/c9.ide.language.generic/generic",
"plugins/c9.ide.language.css/css",
"plugins/c9.ide.language.html/html",
// "plugins/c9.ide.language.codeintel/codeintel",
"plugins/c9.ide.language.javascript/javascript",
"plugins/c9.ide.language.javascript.immediate/immediate",
"plugins/c9.ide.language.javascript.infer/jsinfer",

Wyświetl plik

@ -117,16 +117,33 @@ exports.detectIndentation = function(session) {
return indent;
};
exports.trimTrailingSpace = function(session, trimEmpty) {
/**
* EditSession session
* options.trimEmpty trim empty lines too
* options.keepCursorPosition do not trim whitespace before the cursor
*/
exports.trimTrailingSpace = function(session, options) {
var doc = session.getDocument();
var lines = doc.getAllLines();
var min = trimEmpty ? -1 : 0;
var min = options && options.trimEmpty ? -1 : 0;
var cursors = session.selection.rangeCount
? session.selection.ranges.map(function(x) { return x.cursor; })
: [session.selection.getCursor()];
var ci = options && options.keepCursorPosition ? 0 : -1;
var cursorRow = cursors[ci] && cursors[ci].row;
for (var i = 0, l=lines.length; i < l; i++) {
var line = lines[i];
var index = line.search(/\s+$/);
if (i == cursorRow) {
if (index < cursors[ci].column)
index = min;
ci++;
cursorRow = cursors[ci] ? cursors[ci].row : -1;
}
if (index > min)
doc.removeInLine(i, index, line.length);
}

Wyświetl plik

@ -145,10 +145,10 @@ var C9SearchHighlightRules = function() {
});
}
if (replace) {
search = replace;
options = "";
}
// if (replace) {
// search = replace;
// options = "";
// }
if (search) {
if (!/regex/.test(options))

82
node_modules/c9/cache.js wygenerowano vendored 100644
Wyświetl plik

@ -0,0 +1,82 @@
var Cache = function(maxSize, age) {
this._maxSize = (parseInt(maxSize, 10) === maxSize) ? maxSize : 1000;
this._maxAge = (parseInt(age, 10) === age) ? age : 5000;
this._items = {};
this._keys = [];
};
var proto = Cache.prototype;
proto.set = function(key, value) {
var item = this._items[key];
if (item) {
this.delete(key);
}
this._keys.push(key);
this._items[key] = {
value: value,
lastAccessed: Date.now()
};
this.purge();
};
proto.has = function(key) {
var item = this._items[key];
return (item && !this._hasExpired(item));
};
proto.get = function(key) {
var item = this._items[key];
if (item && !this._hasExpired(item)) {
return item.value;
}
return null;
};
proto.delete = function(key) {
delete this._items[key];
this._keys.splice(this._keys.indexOf(key), 1);
};
proto.purge = function() {
if (this._keys.length > this._maxSize) {
this._purgeItems();
}
};
proto.size = function() {
return this._keys.length;
};
proto._purgeItems = function() {
var maxSize = this._maxSize * 0.75;
// Remove epired items
this._keys.forEach(function(key) {
var item = this._items[key];
if (this._hasExpired(item)) {
this.delete(key);
}
}, this);
// Remove least used items
if (this._keys.length > maxSize) {
this._keys = this._keys.sort(function(a, b) {
return this._items[b].lastAccessed - this._items[a].lastAccessed;
}.bind(this));
while (this._keys.length > maxSize) {
var key = this._keys.pop();
this.delete(key);
}
}
};
proto._hasExpired = function(item) {
return (Date.now() - item.lastAccessed) > this._maxAge;
};
module.exports = Cache;

188
node_modules/c9/cache_test.js wygenerowano vendored 100644
Wyświetl plik

@ -0,0 +1,188 @@
"use strict";
"use server";
var assert = require("assert");
var Cache = require("./cache");
require("c9/inline-mocha")(module);
describe("Cache", function() {
var cache;
var maxSize = 5;
var age = 10;
beforeEach(function() {
cache = new Cache(maxSize, age) ;
});
describe("set", function() {
it("should add the item to the cache", function(){
var item = { a: 1 };
var key = "foo/bar";
cache.set(key, item);
var cachedItem = cache.get(key);
assert.equal(cachedItem, item);
});
it("should increment size", function() {
var item = { a: 1 };
cache.set("foo/bar", item);
cache.set("foo/baz", item);
cache.set("foo/bir", item);
cache.set("foo/biz", item);
cache.set("foo/bur", item);
assert(cache.size(), 5);
});
});
describe("get", function() {
it("should return item when called within age", function() {
var item = { a: 1 };
var key = "foo/bar";
cache.set(key, item);
var cachedItem = cache.get(key);
assert.equal(cachedItem, item);
});
it("should return `null` if item expired", function(done) {
var item = { a: 1 };
var key = "foo/bar";
var cache = new Cache(maxSize, 0) ;
cache.set(key, item);
// Do we use sinon to make this sync?
setTimeout(function() {
var cachedItem = cache.get(key);
assert.equal(cachedItem, null);
done();
}, 0);
});
});
describe("delete", function() {
it("should remove item from cache", function() {
var item = { a: 1 };
var key = "foo/bar";
cache.set(key, item);
cache.delete(key);
var cachedItem = cache.get(key);
assert.equal(cachedItem, null);
});
it("should decrement size", function() {
var item = { a: 1 };
var key = "foo/bar";
cache.set(key, item);
cache.delete(key);
assert.equal(cache.size(), 0);
});
});
describe("purge", function() {
it("should not purge when maxSize is not reached", function() {
var item = { a: 1 };
var cache = new Cache(7) ;
cache.set("foo/bar", item);
cache.set("foo/baz", item);
cache.set("foo/bir", item);
cache.set("foo/biz", item);
assert.equal(cache.size(), 4);
});
it("should purge when maxSize is reached", function() {
var item = { a: 1 };
var cache = new Cache(10) ;
cache.set("1", item);
cache.set("2", item);
cache.set("3", item);
cache.set("4", item);
cache.set("5", item);
cache.set("6", item);
cache.set("7", item);
cache.set("8", item);
cache.set("9", item);
cache.set("10", item);
cache.set("11", item);
assert.equal(cache.size(), 7);
});
it("should purge the least recently used items", function(done) {
var item = { a: 1 };
var cache = new Cache(10, 0) ;
cache.set("1", item);
cache.set("2", item);
cache.set("3", item);
cache.set("4", item);
cache.set("5", item);
cache.set("6", item);
cache.set("7", item);
cache.set("8", item);
cache.set("9", item);
cache.set("10", item);
// New cache hits
setTimeout(function() {
cache.get("1");
cache.get("2");
cache.get("10");
cache.get("4");
cache.get("5");
cache.get("6");
// Trigger purge
cache.set("11", item);
var cachedItem = cache.get("7");
assert.equal(cachedItem, null);
cachedItem = cache.get("8");
assert.equal(cachedItem, null);
cachedItem = cache.get("9");
assert.equal(cachedItem, null);
cachedItem = cache.get("3");
assert.equal(cachedItem, null);
done();
}, 1);
});
it("should purge expired items", function(done) {
var item = { a: 1 };
var cache = new Cache(5, 0) ;
cache.set("1", item);
cache.set("2", item);
cache.set("3", item);
cache.set("4", item);
setTimeout(function() {
cache.set("5", item);
var cachedItem = cache.get("1");
assert.equal(cachedItem, null);
cachedItem = cache.get("2");
assert.equal(cachedItem, null);
cachedItem = cache.get("3");
assert.equal(cachedItem, null);
cachedItem = cache.get("4");
assert.equal(cachedItem, null);
done();
}, 2);
});
});
});

20
node_modules/c9/hostname.js wygenerowano vendored
Wyświetl plik

@ -2,25 +2,25 @@ var fs = require("fs");
exports.parse = function(hostname) {
var m1 = hostname.match(/^([0-9a-z-]+?)-gce-([a-z]+)-([0-9]+)-([a-z0-9]+)$/);
var m2 = hostname.match(/^([0-9a-z-]+?)-gce-([a-z]+)-([a-z0-9]+)-([a-z0-9]{4})$/);
var m1 = hostname.match(/^([0-9a-z-]+?)-([a-z]+)-([a-z]+)-([0-9]+)-([a-z0-9]+)$/);
var m2 = hostname.match(/^([0-9a-z-]+?)-([a-z]+)-([a-z]+)-([a-z0-9]+)-([a-z0-9]{4})$/);
if (m1) {
return {
type: m1[1],
provider: "gce",
region: m1[2],
index: m1[3],
env: m1[4]
provider: m1[2],
region: m1[3],
index: m1[4],
env: m1[5]
};
}
else if (m2) {
return {
type: m2[1],
provider: "gce",
region: m2[2],
env: m2[3],
index: m2[4]
provider: m2[2],
region: m2[3],
env: m2[4],
index: m2[5]
};
} else {
return {};

10
node_modules/c9/hostname_test.js wygenerowano vendored
Wyświetl plik

@ -10,16 +10,18 @@ var hostname = require("./hostname");
describe(__filename, function() {
function assertServerName(sn, type, region, index, env) {
function assertServerName(sn, type, provider, region, index, env) {
assert.equal(sn.type, type);
assert.equal(sn.provider, provider);
assert.equal(sn.region, region);
assert.equal(sn.index, index);
assert.equal(sn.env, env);
}
it("parse hostname", function() {
assertServerName(hostname.parse("fabian-gce-eu-04-dev"), "fabian", "eu", "04", "dev");
assertServerName(hostname.parse("newclient-gce-eu-prod-d4fg"), "newclient", "eu", "d4fg", "prod");
assertServerName(hostname.parse("ide-old-gce-usw-02-prod"), "ide-old", "usw", "02", "prod");
assertServerName(hostname.parse("fabian-gce-eu-04-dev"), "fabian", "gce", "eu", "04", "dev");
assertServerName(hostname.parse("newclient-gce-eu-prod-d4fg"), "newclient", "gce", "eu", "d4fg", "prod");
assertServerName(hostname.parse("ide-old-gce-usw-02-prod"), "ide-old", "gce", "usw", "02", "prod");
assertServerName(hostname.parse("docker-premium-eu-115-prod"), "docker", "premium", "eu", "115", "prod");
});
});

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "c9",
"description": "New Cloud9 Client",
"version": "3.1.1539",
"version": "3.1.1655",
"author": "Ajax.org B.V. <info@ajax.org>",
"private": true,
"main": "bin/c9",
@ -19,7 +19,6 @@
"emmet": "git://github.com/cloud9ide/emmet-core.git#2ff6dc06ad",
"engine.io": "1.5.3",
"engine.io-client": "1.5.3",
"eslint": "git://github.com/cloud9ide/eslint.git#dc500e81162bf0cb4747a4a415c121b0c46975cb",
"jsonm": "1.0.6",
"http-error": "~0.0.5",
"less": "^2.4.0",
@ -56,32 +55,32 @@
"c9"
],
"c9plugins": {
"c9.ide.language": "#4c02a26baf",
"c9.ide.language": "#db77f906a2",
"c9.ide.language.css": "#be07d72209",
"c9.ide.language.generic": "#a4023db7f6",
"c9.ide.language.generic": "#92210f5a48",
"c9.ide.language.html": "#22fdc74869",
"c9.ide.language.html.diff": "#24f3608d26",
"c9.ide.language.javascript": "#c6d102471f",
"c9.ide.language.javascript.immediate": "#c8b1e5767a",
"c9.ide.language.javascript.eslint": "#c74767544c",
"c9.ide.language.javascript.tern": "#bf1072b11a",
"c9.ide.language.javascript.infer": "#0561c69d67",
"c9.ide.language.jsonalyzer": "#bf12af3d0a",
"c9.ide.language.codeintel": "#undefined",
"c9.ide.collab": "#00bd850bba",
"c9.ide.language.javascript.eslint": "#edaf80a3fe",
"c9.ide.language.javascript.tern": "#8423d558f6",
"c9.ide.language.javascript.infer": "#325ac6880e",
"c9.ide.language.jsonalyzer": "#7791dec360",
"c9.ide.language.codeintel": "#046d39603b",
"c9.ide.collab": "#11a0d3c5ce",
"c9.ide.local": "#10eb45842a",
"c9.ide.find": "#e33fbaed2f",
"c9.ide.find.infiles": "#f0149b05ff",
"c9.ide.find.infiles": "#c0a13737ef",
"c9.ide.find.replace": "#8cbce45290",
"c9.ide.run.debug": "#f51895faec",
"c9.ide.run.debug": "#6b34b5a2eb",
"c9.automate": "#47e2c429c9",
"c9.ide.ace.emmet": "#6dc4585e02",
"c9.ide.ace.gotoline": "#a8ff07c8f4",
"c9.ide.ace.keymaps": "#e8d5eedc37",
"c9.ide.ace.keymaps": "#334a65192f",
"c9.ide.ace.repl": "#4b88a85b7b",
"c9.ide.ace.split": "#0ae0151c78",
"c9.ide.ace.statusbar": "#3aab0b67e0",
"c9.ide.ace.stripws": "#cf0f42ac59",
"c9.ide.ace.stripws": "#8885016b9e",
"c9.ide.behaviors": "#db32109ebc",
"c9.ide.closeconfirmation": "#cee4674141",
"c9.ide.configuration": "#528234d97d",
@ -92,9 +91,9 @@
"c9.ide.imgeditor": "#612e75ef4f",
"c9.ide.immediate": "#19758abe08",
"c9.ide.installer": "#0fde9f0067",
"c9.ide.language.python": "#675ddb4c8f",
"c9.ide.language.go": "#8f6d0beae7",
"c9.ide.mount": "#86c8985f34",
"c9.ide.language.python": "#330b80e3b2",
"c9.ide.language.go": "#6ce1c7a7ef",
"c9.ide.mount": "#4c39359b87",
"c9.ide.navigate": "#1fbb7cd53b",
"c9.ide.newresource": "#981a408a7b",
"c9.ide.openfiles": "#2ae85a9e33",
@ -106,10 +105,10 @@
"c9.ide.recentfiles": "#7c099abf40",
"c9.ide.remote": "#301d2ab519",
"c9.ide.processlist": "#2b12cd1bdd",
"c9.ide.run": "#f5e40ce86f",
"c9.ide.run": "#4f0257bc0b",
"c9.ide.run.build": "#0598fff697",
"c9.ide.run.debug.xdebug": "#9956689819",
"c9.ide.save": "#496328f2eb",
"c9.ide.save": "#417e4b53c4",
"c9.ide.scm": "#ca3c94b84f",
"c9.ide.terminal.monitor": "#1a4092ede2",
"c9.ide.test": "#a282ec1619",

Wyświetl plik

@ -1,6 +1,7 @@
"use strict";
var errors = require("http-error");
var EventEmitter = require("events").EventEmitter;
plugin.consumes = [
"connect",
@ -72,10 +73,12 @@ var NICE_USER_ERROR_MSG = "Something went wrong. Please retry in a few minutes a
function plugin(options, imports, register) {
var connect = imports.connect;
var showStackTrace = false;
var frontdoor = require("frontdoor");
var statics = imports["connect.static"];
var emitter = new EventEmitter();
function isDev(mode) {
return /^(onlinedev|devel)$/.test(mode);
@ -99,7 +102,6 @@ function plugin(options, imports, register) {
return code;
}
connect.useError(function(err, req, res, next) {
if (typeof err == "string")
err = new errors.InternalServerError(err);
@ -112,6 +114,13 @@ function plugin(options, imports, register) {
var accept = req.headers.accept || '';
if (statusCode == 500) {
emitter.emit("internalServerError", {
err: err,
req: req
});
}
if (/json/.test(accept)) {
var error = {
code: statusCode,
@ -159,6 +168,8 @@ function plugin(options, imports, register) {
});
register(null, {
"connect.error": {}
"connect.error": {
on: emitter.on.bind(emitter)
}
});
}

Wyświetl plik

@ -4,7 +4,13 @@ var domain = require("domain");
var url = require("url");
var _ = require("lodash");
plugin.consumes = ["raygun", "connect", "http", "connect.remote-address", "metrics"];
plugin.consumes = [
"raygun",
"connect",
"http",
"connect.remote-address",
"connect.error"
];
plugin.provides = ["raygun.connect"];
module.exports = plugin;
@ -14,8 +20,12 @@ function plugin(options, imports, register) {
var errorClient = raygun.errorClient;
var warningClient = raygun.warningClient;
var connect = imports.connect;
var connectError = imports["connect.error"];
var server = imports.http.getServer();
var metrics = imports.metrics;
connectError.on("internalServerError", function(msg) {
sendRequestError(msg.err, msg.req);
});
errorClient.user = warningClient.user = function(req) {
return (req && req.user) ? req.user.name : "";

Wyświetl plik

@ -7,7 +7,9 @@
<body class="error503 light">
<div id="wrapper">
<h1>Service Unavailable</h1>
<h2><em><%=statusCode%> - <%=scope%></em> <%=error%></h2>
<% if (showStackTrace) { %>
<h2><em><%=statusCode%> - <%=scope%></em> <%=error%></h2>
<% } %>
<p style="margin-bottom:20px;width:600px">
The service reports it's unavailable at this time. This has been logged
and the appropriate people have been notified. Please check the

Wyświetl plik

@ -0,0 +1,20 @@
<?php
class Foo {
const c = 'CONSTANT';
public function __construct() {
$self->x = 1;
$self->y = 2;
}
public static function members() {
return array('x', 'y');
}
}
$foo = new Foo;
$foo
?>

Wyświetl plik

@ -121,8 +121,8 @@
margin-left: -100px;
width: 200px;
text-align: center;
top: 57%;
margin-top: 0;
top: 30%;
margin-top: 255px;
}
#loadingide .cool-message {
@ -130,14 +130,14 @@
font-family: Arial;
font-size: 30px;
color: #717171;
white-space: nowrap;
position: absolute;
top: 30%;
left: 50%;
width: 1000px;
text-align: center;
margin-left: -500px;
margin-top: 350px;
min-width: 100%;
padding: 0 30px;
box-sizing: border-box;
line-height: 1.3em;
}
#loadingide.dark .cool-message {
color: #757575;

Wyświetl plik

@ -18,6 +18,12 @@
document.body.className = "loading " + loadingIde.className;
var messages = [
"Share your code by sharing your workspace URL.",
"Test your code in different browsers with the Sauce Labs plugin.",
"Each workspace is its own Ubuntu virtual machine.",
"Run 'dpkg -l' in the terminal to see all packages installed.",
"Remember to run your code on port 8080, 8081, or 8082.",
"Use the Collaborate panel when collaborating for optimal teamwork.",
"It's better up here.",
"Happy coding!",
"Everything as you left it.",
@ -28,6 +34,33 @@
"Makes your laptop cooler"
];
var mac_keybindings = [
"Press Ctrl-Option-Right to select the next instance of a word.",
"Press Cmd-. to show all keyboard commands.",
"To rename a variable, highlight it then press Option-Cmd-R.",
"Press Option-W to close your current IDE tab.",
"Press Cmd-D to delete the current line of code",
"Press Option-Tab to go to the next IDE tab.",
"Press Option-Shift-T to reopen a tab you closed.",
"Press Option-T to open a new terminal at any time.",
"Press Cmd-E to search for a file by name."
];
var win_keybindings = [
"Press Ctrl-Alt-Right to select the next instance of a word.",
"Press Ctrl-. to show all keyboard commands.",
"To rename a variable, highlight it then press Ctrl-Alt-R.",
"Press Alt-W to close your current IDE tab.",
"Press Ctrl-D to delete the current line of code",
"Press Alt-Shift-T to reopen a tab you closed.",
"Press Alt-T to open a new terminal at any time.",
"Press Ctrl-E to search for a file by name."
];
var isMac = (navigator.platform == "MacIntel" || navigator.platform == "Macintosh" || navigator.platform == "MacPPC");
var platform_keybindings = isMac ? mac_keybindings : win_keybindings;
messages = messages.concat(platform_keybindings);
var idx = Math.floor(Math.random() * messages.length);
if (idx == messages.length) idx = messages.length - 1;
var msg = messages[idx];

Wyświetl plik

@ -21706,7 +21706,7 @@ apf.window = function(){
var amlNode = apf.window.activeElement, //apf.findHost(e.srcElement || e.target),
htmlNode = (e.explicitOriginalTarget || e.srcElement || e.target),
isTextInput = (ta[htmlNode.tagName]
|| htmlNode.contentEditable || htmlNode.contentEditable == "true") //@todo apf3.0 need to loop here?
|| htmlNode.contentEditable == "true" || htmlNode.contentEditable == "plaintext-only")
&& !htmlNode.disabled
|| amlNode && amlNode.$isTextInput
&& amlNode.$isTextInput(e) && amlNode.disabled < 1;

Wyświetl plik

@ -254,11 +254,9 @@ function main(options, imports, register) {
"plugins/c9.ide.language/worker",
"plugins/c9.ide.language.generic/local_completer",
"plugins/c9.ide.language.generic/snippet_completer",
"plugins/c9.ide.language.generic/mode_completer",
"plugins/c9.ide.language.generic/open_files_local_completer",
"plugins/c9.ide.language.generic/simple/make",
"plugins/c9.ide.language.generic/simple/shell",
"plugins/c9.ide.language.generic/simple/php",
"plugins/c9.ide.language.javascript/parse",
"plugins/c9.ide.language.javascript/scope_analyzer",
"plugins/c9.ide.language.javascript/debugger",
@ -273,6 +271,10 @@ function main(options, imports, register) {
"plugins/c9.ide.language.python/worker/python_completer",
"plugins/c9.ide.language.python/worker/python_jsonalyzer",
"plugins/c9.ide.language.go/worker/go_completer",
"plugins/c9.ide.language.codeintel/worker/php_completer",
"plugins/c9.ide.language.codeintel/worker/css_less_completer",
"plugins/c9.ide.language.codeintel/worker/ruby_completer",
"plugins/c9.ide.language.codeintel/worker/codeintel_worker",
"plugins/c9.ide.language.html/html_completer",
"plugins/c9.ide.language.css/css_handler",
"plugins/c9.ide.language.javascript.tern/worker/tern_worker",

Wyświetl plik

@ -148,6 +148,10 @@ require([
obj.watch = function(){};
return obj;
})(),
"fs.cache": (function(){
var obj = new EventEmitter();
return obj;
})(),
tooltip: {
add: function(){}
},
@ -332,6 +336,13 @@ require([
return plugin;
},
Dialog: function(developer, deps, options) {
var plugin = new imports.Plugin(developer, deps);
plugin.freezePublicAPI.baseclass();
plugin.freezePublicAPI({});
return plugin;
},
tree: (function(){
var tree = new EventEmitter();
tree.createFolder = function(){};
@ -415,6 +426,10 @@ require([
show: function(msg) { console.warn(msg); },
hide: function(msg) { },
},
"dialog.info": {
show: function(msg) { console.log(msg); },
hide: function(msg) { },
},
"installer": { createSession : function(){}, reinstall: function(){}, isInstalled: function(){ return true; } },
"run.gui": { getElement : function(){} },
"debugger": {debug: function() {}, stop: function(){}},
@ -429,6 +444,15 @@ require([
log: function() {},
increment: function() {}
},
MountTab: function(developer, deps, options) {
var plugin = new imports.Plugin(developer, deps);
plugin.freezePublicAPI.baseclass();
plugin.freezePublicAPI({
});
return plugin;
},
mount: {},
error_handler: {
log: function() {},
reportError: function(){}

Wyświetl plik

@ -37,6 +37,30 @@ SOURCE=`pwd`
LOCAL=$SOURCE/local
APPDIR=$SOURCE/build/webkitbuilds/app.nw
if [ "$os" == "linux" ]; then
if [ ! -d $SOURCE/build/webkitbuilds/cache/linux/0.12.3 ]; then
mkdir -p $SOURCE/build/webkitbuilds/cache/linux/0.12.3/
pushd $SOURCE/build/webkitbuilds/cache/linux/0.12.3
wget http://dl.nwjs.io/v0.12.3/nwjs-v0.12.3-linux-x64.tar.gz
tar -zxf nwjs-v0.12.3-linux-x64.tar.gz
popd
fi
DEST="$SOURCE/build/Cloud9-dev-linux"
rm -rf "$DEST"
mkdir -p $DEST
cp -R $SOURCE/build/webkitbuilds/cache/linux/0.12.3/nwjs-v0.12.3-linux-x64/* $DEST
cp $SOURCE/build/linux/c9.png $DEST/icon.png
node --eval "
var path = require('path')
var p = require('./local/package.json');
p.main = path.relative('$DEST', '$SOURCE/local/projectManager.html');
delete p.dependencies;
p.window.icon = 'icon.png';
console.log(JSON.stringify(p, null, 2));
" > $DEST/package.json
fi
if [ "$os" == "darwin" ]; then
if [ ! -d $SOURCE/build/webkitbuilds/cache/mac/0.9.3 ]; then