kopia lustrzana https://github.com/c9/core
resolve merge conflict
commit
5954626833
|
@ -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
133
b9/b9
|
@ -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 "$@"
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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!"
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
b9_check() {
|
||||
echo "Running B9 tests"
|
||||
_do_check_package
|
||||
}
|
241
b9/lib/deploy.sh
241
b9/lib/deploy.sh
|
@ -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) \
|
||||
"$@"
|
||||
}
|
|
@ -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);
|
||||
});
|
||||
}
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
});
|
|
@ -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);
|
||||
}
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
});
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
});
|
||||
});
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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}
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 4.2 KiB |
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -145,10 +145,10 @@ var C9SearchHighlightRules = function() {
|
|||
});
|
||||
}
|
||||
|
||||
if (replace) {
|
||||
search = replace;
|
||||
options = "";
|
||||
}
|
||||
// if (replace) {
|
||||
// search = replace;
|
||||
// options = "";
|
||||
// }
|
||||
|
||||
if (search) {
|
||||
if (!/regex/.test(options))
|
||||
|
|
|
@ -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;
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -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,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");
|
||||
});
|
||||
});
|
||||
|
|
37
package.json
37
package.json
|
@ -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",
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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 : "";
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
?>
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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(){}
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue