You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
579 lines
21 KiB
579 lines
21 KiB
#!/bin/sh
|
|
# Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
|
|
|
### This script is an internal implementation.
|
|
### The entry point is a shell script at './bin/remote-dev-server.sh'.
|
|
|
|
# https://sipb.mit.edu/doc/safe-shell
|
|
# https://belief-driven-design.com/9-tips-safer-shell-scripts-5b8d6afd618
|
|
set -e -u -f
|
|
|
|
usage()
|
|
{
|
|
script_name="${REMOTE_DEV_LAUNCHER_NAME_FOR_USAGE:-$(basename "$0")}"
|
|
echo "Usage: ./$script_name [starter command] [path to project]"
|
|
echo "Examples:"
|
|
echo " ./$script_name run /path/to/project [arguments...]"
|
|
echo " ./$script_name status /path/to/project"
|
|
echo " ./$script_name warm-up /path/to/project [arguments...]"
|
|
echo " ./$script_name installPlugins /path/to/project PLUGIN_ID [PLUGIN_ID] ..."
|
|
echo " ./$script_name registerBackendLocationForGateway"
|
|
|
|
echo "Environment variables:"
|
|
echo " REMOTE_DEV_SERVER_TRACE set to any value to get more debug output from the startup script"
|
|
echo " REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS set to '0' to skip using bundled X11 and other linux libraries from plugins/remote-dev-server/selfcontained. Use everything from the system."
|
|
echo " by default bundled libraries are used"
|
|
echo " REMOTE_DEV_LAUNCHER_NAME_FOR_USAGE set to any value to use as the script name in this output"
|
|
echo " REMOTE_DEV_TRUST_PROJECTS set to any value to skip project trust warning (will execute build scripts automatically)"
|
|
echo " REMOTE_DEV_NEW_UI_ENABLED set to '1' to start with forced enabled new UI"
|
|
echo " REMOTE_DEV_NON_INTERACTIVE set to any value to skip all interactive shell prompts (set automatically if running without TTY)"
|
|
echo " REMOTE_DEV_JDK_DETECTION set to '0' to disable JDK auto-detection and use it as project SDK if it is not pre-configured"
|
|
echo " REMOTE_DEV_LEGACY_PER_PROJECT_CONFIGS set to '1' to keep the per-project config/system directories as in 2023.2 and earlier"
|
|
}
|
|
|
|
check_help_option()
|
|
{
|
|
# 0 means true, 1 means false for boolean functions
|
|
if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "-help" ] || [ "$1" = "help" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
register_backend() {
|
|
case "$IDE_HOME"/ in
|
|
"$DEFAULT_DIST"/*)
|
|
echo "$IDE_HOME is located in default path. No need to register it."
|
|
exit 1
|
|
;;
|
|
*) # do nothing
|
|
;;
|
|
esac
|
|
|
|
link_name=$(echo -n "$IDE_HOME" | sed 's/[^a-zA-Z0-9.]/_/g')
|
|
mkdir -p "$USER_PROVIDED_DIST"
|
|
|
|
if [ -L "$USER_PROVIDED_DIST/$link_name" ]; then
|
|
echo "$IDE_HOME is already registered ($USER_PROVIDED_DIST/$link_name exists)"
|
|
exit 1
|
|
fi
|
|
|
|
ln -sv "$IDE_HOME" "$USER_PROVIDED_DIST/$link_name"
|
|
}
|
|
|
|
clean_up_temp()
|
|
{
|
|
if [ -n "${TEMP_REMOTE_DEV_PROPERTIES_PATH:-}" ]; then
|
|
rm -f "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
fi
|
|
|
|
if [ -n "${TEMP_REMOTE_DEV_VM_OPTIONS:-}" ]; then
|
|
rm -f "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
fi
|
|
|
|
if [ -n "${TEMP_JBR:-}" ]; then
|
|
rm -rf "$TEMP_JBR"
|
|
fi
|
|
|
|
if [ -n "${TEMP_FONTS_CONFIGURATION_SOURCE_PATH:-}" ]; then
|
|
rm -rf "$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
fi
|
|
|
|
if [ -n "${XVFB_PID:-}" ]; then
|
|
kill -9 "$XVFB_PID" >/dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
trap clean_up_temp EXIT INT HUP
|
|
|
|
if [ -n "${REMOTE_DEV_SERVER_TRACE:-}" ]; then
|
|
set -x
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Check required tools.
|
|
# ---------------------------------------------------------------------
|
|
|
|
IS_DARWIN=0
|
|
case "$(uname)" in
|
|
Darwin* )
|
|
IS_DARWIN=1
|
|
;;
|
|
esac
|
|
|
|
IS_WSL2=0
|
|
if grep -q WSL2 /proc/sys/kernel/osrelease; then
|
|
IS_WSL2=1
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Check if running inside Docker container
|
|
# ---------------------------------------------------------------------
|
|
|
|
IS_RUNNING_IN_DOCKER=0
|
|
is_running_in_docker()
|
|
{
|
|
# Check cgroup content
|
|
CGROUP_PATH="/proc/1/cgroup"
|
|
if [ -f "$CGROUP_PATH" ]; then
|
|
|
|
if grep -q "docker" "$CGROUP_PATH"; then
|
|
IS_RUNNING_IN_DOCKER=1
|
|
return
|
|
fi
|
|
|
|
if grep -q "lxc" "$CGROUP_PATH"; then
|
|
IS_RUNNING_IN_DOCKER=1
|
|
return
|
|
fi
|
|
fi
|
|
|
|
# Check .dockerenv file
|
|
DOCKER_ENV_PATH="/.dockerenv"
|
|
if [ -f "$DOCKER_ENV_PATH" ]; then
|
|
IS_RUNNING_IN_DOCKER=1
|
|
return
|
|
fi
|
|
|
|
# Check .dockerinit file
|
|
DOCKER_INIT_PATH="/.dockerinit"
|
|
if [ -f "DOCKER_INIT_PATH" ]; then
|
|
IS_RUNNING_IN_DOCKER=1
|
|
fi
|
|
}
|
|
|
|
is_running_in_docker
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Setup initial variables and validate environment state
|
|
# ---------------------------------------------------------------------
|
|
|
|
REMOTE_DEV_SERVER_BIN_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
REMOTE_DEV_SERVER_DIR="$(dirname "$REMOTE_DEV_SERVER_BIN_DIR")"
|
|
PLUGINS_DIR="$(dirname "$REMOTE_DEV_SERVER_DIR")"
|
|
IDE_HOME="$(dirname "$PLUGINS_DIR")"
|
|
IDE_BIN_DIR="$IDE_HOME/bin"
|
|
|
|
DEFAULT_DIST="$HOME/.cache/JetBrains/RemoteDev/dist"
|
|
USER_PROVIDED_DIST="$HOME/.cache/JetBrains/RemoteDev/userProvidedDist"
|
|
|
|
IDE_SCRIPT_NAME="${1:-}"
|
|
IDE_PRODUCT_CODE="${2:-}"
|
|
IDE_PRODUCT_UC="${3:-}"
|
|
IDE_PRODUCT_VM_OPTIONS="${4:-}"
|
|
IDE_DEFAULT_XMX="${5:-}"
|
|
|
|
if [ -z "$IDE_SCRIPT_NAME" ] || [ -z "$IDE_PRODUCT_CODE" ] || [ -z "$IDE_PRODUCT_UC" ] || [ -z "$IDE_PRODUCT_VM_OPTIONS" ] || [ -z "$IDE_DEFAULT_XMX" ]; then
|
|
echo "IDE script name parameter or a product code is missing. This could happen when you call this internal script directly." 1>&2
|
|
echo "Please use wrapper script: ./bin/remote-dev-server.sh" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
shift
|
|
shift
|
|
shift
|
|
shift
|
|
shift
|
|
|
|
STARTER_COMMAND="${1:-}"
|
|
|
|
if [ -z "$STARTER_COMMAND" ]; then
|
|
echo "Starter command is not specified." 1>&2
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
if check_help_option "$STARTER_COMMAND"; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$STARTER_COMMAND" = "registerBackendLocationForGateway" ]; then
|
|
register_backend
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$STARTER_COMMAND" = "run" ]; then
|
|
STARTER_COMMAND="remoteDevHost"
|
|
fi
|
|
|
|
if [ "$STARTER_COMMAND" = "warm-up" ]; then
|
|
STARTER_COMMAND="warmup"
|
|
fi
|
|
|
|
if [ "$STARTER_COMMAND" = "status" ]; then
|
|
STARTER_COMMAND="remoteDevStatus"
|
|
fi
|
|
|
|
if [ "$STARTER_COMMAND" = "invalidate-caches" ]; then
|
|
STARTER_COMMAND="invalidateCaches"
|
|
fi
|
|
|
|
if [ "$STARTER_COMMAND" = "stop" ]; then
|
|
STARTER_COMMAND="exit"
|
|
fi
|
|
|
|
if [ ! -d "$REMOTE_DEV_SERVER_DIR" ]; then
|
|
echo "ERROR! Remote development is not enabled." 1>&2
|
|
echo "Please make sure you use a correct distribution with enabled Remote Development and related libraries are included: '/plugins/remove-development/selfcontained'" 1>&2
|
|
echo "(directory $REMOTE_DEV_SERVER_DIR is missing)"
|
|
exit 1
|
|
fi
|
|
|
|
# Handle old names of these vars
|
|
REMOTE_DEV_NON_INTERACTIVE="${REMOTE_DEV_NON_INTERACTIVE:-${CWM_NON_INTERACTIVE:-}}"
|
|
REMOTE_DEV_TRUST_PROJECTS="${REMOTE_DEV_TRUST_PROJECTS:-${CWM_TRUST_PROJECTS:-}}"
|
|
|
|
# Check if we're running in an interactive terminal session
|
|
if ! tty -s; then
|
|
REMOTE_DEV_NON_INTERACTIVE=1
|
|
fi
|
|
|
|
export REMOTE_DEV_NON_INTERACTIVE
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Run help command after setting up libraries and fonts
|
|
# ---------------------------------------------------------------------
|
|
|
|
shift
|
|
|
|
PROJECT_PATH="${1:-}"
|
|
|
|
if check_help_option "$PROJECT_PATH"; then
|
|
"$IDE_BIN_DIR/$IDE_SCRIPT_NAME" "remoteDevShowHelp" "$STARTER_COMMAND"
|
|
exit 0
|
|
fi
|
|
|
|
PER_PROJECT_CONFIGS=0
|
|
if [ "${REMOTE_DEV_LEGACY_PER_PROJECT_CONFIGS:-}" = "1" ]; then
|
|
PER_PROJECT_CONFIGS=1
|
|
echo "Using legacy per-project config directories"
|
|
else
|
|
echo "Using new app-level config directories"
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Run PROJECT_PATH checks after commands that could run without project path
|
|
# ---------------------------------------------------------------------
|
|
|
|
if [ $PER_PROJECT_CONFIGS -eq 1 ] || [ "$STARTER_COMMAND" = "warmup" ]; then
|
|
if [ -z "$PROJECT_PATH" ]; then
|
|
echo "Project path is not specified" 1>&2
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -e "$PROJECT_PATH" ]; then
|
|
echo "Path does not exist: $PROJECT_PATH" 1>&2
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
shift
|
|
|
|
if [ -d "$PROJECT_PATH" ]; then
|
|
PROJECT_PATH="$(cd "$PROJECT_PATH" && pwd)"
|
|
else
|
|
PROJECT_PATH="$(cd "$(dirname "$PROJECT_PATH")" && pwd)/$(basename "$PROJECT_PATH")"
|
|
fi
|
|
fi
|
|
|
|
if [ $PER_PROJECT_CONFIGS -eq 1 ]; then
|
|
# -----------------------------------------
|
|
# Set default config and system directories
|
|
# -----------------------------------------
|
|
# /path/to/project -> _path_to_project
|
|
PER_PROJECT_CONFIG_DIR_NAME="$(printf '%s' "$PROJECT_PATH" | sed 's|/|_|g')"
|
|
|
|
if [ -z "${IJ_HOST_CONFIG_DIR:-}" ]; then
|
|
IJ_HOST_CONFIG_BASE_DIR="${IJ_HOST_CONFIG_BASE_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/JetBrains}"
|
|
if [ "${REMOTE_DEV_SYNC_CONFIG:-}" = "true" ]; then
|
|
IJ_HOST_CONFIG_DIR_PREFIX="projects/"
|
|
else
|
|
IJ_HOST_CONFIG_DIR_PREFIX=""
|
|
fi
|
|
IJ_HOST_CONFIG_DIR="$IJ_HOST_CONFIG_BASE_DIR/RemoteDev-$IDE_PRODUCT_CODE/$IJ_HOST_CONFIG_DIR_PREFIX$PER_PROJECT_CONFIG_DIR_NAME"
|
|
fi
|
|
echo "IDE config directory: $IJ_HOST_CONFIG_DIR"
|
|
|
|
if [ -z "${IJ_HOST_SYSTEM_DIR:-}" ]; then
|
|
IJ_HOST_SYSTEM_BASE_DIR="${IJ_HOST_SYSTEM_BASE_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/JetBrains}"
|
|
IJ_HOST_SYSTEM_DIR="$IJ_HOST_SYSTEM_BASE_DIR/RemoteDev-$IDE_PRODUCT_CODE/$PER_PROJECT_CONFIG_DIR_NAME"
|
|
fi
|
|
echo "IDE system directory: $IJ_HOST_SYSTEM_DIR"
|
|
|
|
# set new UI to true if there's no config
|
|
if [ ! -d "$IJ_HOST_CONFIG_DIR" ]; then
|
|
echo "Config folder does not exist, considering this the first launch. Will launch with New UI as default"
|
|
REMOTE_DEV_NEW_UI_ENABLED=1
|
|
fi
|
|
|
|
# Create per-project config/system directories (this also prevents config import)
|
|
mkdir -p "$IJ_HOST_CONFIG_DIR" || (echo "Failed to create $IJ_HOST_CONFIG_DIR" 1>&2; exit 1)
|
|
mkdir -p "$IJ_HOST_SYSTEM_DIR" || (echo "Failed to create $IJ_HOST_SYSTEM_DIR" 1>&2; exit 1)
|
|
|
|
TEMP_SYSTEM_LIKE_DIR="$IJ_HOST_SYSTEM_DIR"
|
|
else
|
|
TEMP_SYSTEM_LIKE_DIR="${TMPDIR:-/tmp}"
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Configure fonts and fontconfig
|
|
# ---------------------------------------------------------------------
|
|
if [ $IS_DARWIN -ne 1 ]; then
|
|
FONTS_CONFIGURATION_BASE_PATH="$REMOTE_DEV_SERVER_DIR/selfcontained/fontconfig"
|
|
if [ ! -d "$FONTS_CONFIGURATION_BASE_PATH" ]; then
|
|
echo "ERROR! Unable to locate font configuration source directory in self-contained distribution: '$FONTS_CONFIGURATION_BASE_PATH'." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
TEMP_FONTS_CONFIGURATION_SOURCE_PATH="$TEMP_SYSTEM_LIKE_DIR/pid.$$.temp.fontconfig"
|
|
rm -rf "$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
mkdir -p "$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
sed -e "s|PATH_FONTS|$FONTS_CONFIGURATION_BASE_PATH/fonts|" -e "s|PATH_JBR|$IDE_HOME/jbr/lib/fonts|" "$FONTS_CONFIGURATION_BASE_PATH/fonts.conf" > "$TEMP_FONTS_CONFIGURATION_SOURCE_PATH/fonts.conf"
|
|
|
|
export INTELLIJ_ORIGINAL_ENV_FONTCONFIG_PATH="${FONTCONFIG_PATH:-}"
|
|
if [ -z "${FONTCONFIG_PATH:-}" ]; then
|
|
export FONTCONFIG_PATH="$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
else
|
|
export FONTCONFIG_PATH="$FONTCONFIG_PATH:$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
fi
|
|
|
|
export INTELLIJ_ORIGINAL_ENV_XDG_DATA_DIRS="${XDG_DATA_DIRS:-}"
|
|
# fontconfig checks default fonts in "$XDG_DATA_HOME/fonts" path.
|
|
# Set this variable to use self-contained default fonts in case no others exist.
|
|
# Note: XDG_DATA_HOME specify a single path entry that could be re-used in IDEs.
|
|
# Use XDG_DATA_DIRS variable to combine with existing paths.
|
|
if [ -z "${XDG_DATA_DIRS:-}" ]; then
|
|
export XDG_DATA_DIRS="$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
else
|
|
export XDG_DATA_DIRS="$XDG_DATA_DIRS:$TEMP_FONTS_CONFIGURATION_SOURCE_PATH"
|
|
fi
|
|
fi
|
|
|
|
# -------------------------------------------------------------------------------------
|
|
# Patch JBR to make self-contained JVM (requires nothing from host system except glibc)
|
|
# -------------------------------------------------------------------------------------
|
|
|
|
if [ -n "${REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS:-}" ]; then
|
|
# already set by environment
|
|
echo "\$REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=$REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS"
|
|
elif [ $IS_DARWIN -eq 1 ]; then
|
|
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=0
|
|
elif /lib64/ld-linux-x86-64.so.2 2>&1 | grep -q "gcompat ELF interpreter stub"; then
|
|
# Not usable under Alpine and other musl-based linux distributions (x86-64)
|
|
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=0
|
|
elif /lib/ld-linux-aarch64.so.1 2>&1 | grep -q "gcompat ELF interpreter stub"; then
|
|
# Not usable under Alpine and other musl-based linux distributions (aarch64)
|
|
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=0
|
|
elif /lib/ld-musl-x86_64.so.1 2>&1 | grep -q "musl libc"; then
|
|
# Not usable under Alpine and other musl-based linux distributions (x86-64)
|
|
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=0
|
|
elif /lib/ld-musl-aarch64.so.1 2>&1 | grep -q "musl libc"; then
|
|
# Not usable under Alpine and other musl-based linux distributions (aarch64)
|
|
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=0
|
|
else
|
|
REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS=1
|
|
fi
|
|
|
|
if [ $REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS -eq 1 ]; then
|
|
SELFCONTAINED_LIBS="$REMOTE_DEV_SERVER_DIR/selfcontained/lib"
|
|
if [ ! -d "$SELFCONTAINED_LIBS" ]; then
|
|
echo "ERROR! Unable to locate libraries for self-contained idea distribution. Directory not found: '$SELFCONTAINED_LIBS'." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
TEMP_JBR="$TEMP_SYSTEM_LIKE_DIR/pid.$$.temp.jbr"
|
|
rm -rf "$TEMP_JBR"
|
|
cp -r --symbolic-link "$IDE_HOME/jbr" "$TEMP_JBR"
|
|
find "$TEMP_JBR" -type d -exec chmod 755 {} \;
|
|
|
|
export "${IDE_PRODUCT_UC}_JDK=$TEMP_JBR"
|
|
|
|
patch_bin_file() {
|
|
file="$1"
|
|
extra_arg=""
|
|
if [ "$(basename "$file")" = "java" ]; then
|
|
extra_arg="\"-Djava.home=$TEMP_JBR\""
|
|
fi
|
|
mv "$file" "$file.bin"
|
|
|
|
case $(uname -m) in
|
|
x86_64)
|
|
LD_LINUX=/lib64/ld-linux-x86-64.so.2
|
|
;;
|
|
aarch64)
|
|
LD_LINUX=/lib/ld-linux-aarch64.so.1
|
|
;;
|
|
*)
|
|
echo "Unsupported architecture $(uname -m)" 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
cat >"$file" <<EOT
|
|
#!/bin/sh
|
|
exec $LD_LINUX --library-path "$SELFCONTAINED_LIBS" "${file}.bin" $extra_arg "\$@"
|
|
EOT
|
|
chmod 755 "$file"
|
|
}
|
|
|
|
# Hardcoded list copied from [org.jetbrains.intellij.build.impl.BundledRuntimeImpl.executableFilesPatterns]
|
|
find -L "$TEMP_JBR/bin" -type f -executable | while IFS= read -r line; do patch_bin_file "$line"; done
|
|
patch_bin_file "$TEMP_JBR/lib/jexec"
|
|
patch_bin_file "$TEMP_JBR/lib/jspawnhelper"
|
|
fi
|
|
|
|
# ---------------------------------
|
|
# Set Remote Development properties
|
|
# ---------------------------------
|
|
|
|
TEMP_REMOTE_DEV_PROPERTIES_PATH="$TEMP_SYSTEM_LIKE_DIR/pid.$$.temp.remote-dev.properties"
|
|
|
|
# shellcheck disable=SC2016
|
|
#TODO: use IDE-specific properties file
|
|
cat "$IDE_BIN_DIR/idea.properties" > "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
if [ $PER_PROJECT_CONFIGS -eq 1 ]; then
|
|
#TODO: use IDE-specific folder
|
|
# shellcheck disable=SC2129
|
|
# stylistic issue
|
|
printf '\nidea.config.path=%s' "$IJ_HOST_CONFIG_DIR" >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nidea.plugins.path=%s' "$IJ_HOST_CONFIG_DIR/plugins" >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nidea.system.path=%s' "$IJ_HOST_SYSTEM_DIR" >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nidea.log.path=%s' "$IJ_HOST_SYSTEM_DIR/log" >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
fi
|
|
|
|
#TODO: remove once all of this is disabled for remote dev
|
|
# shellcheck disable=SC2129
|
|
# stylistic issue
|
|
printf '\njb.privacy.policy.text="<!--999.999-->"' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\njb.consents.confirmation.enabled=false' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nidea.initially.ask.config=never' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nide.show.tips.on.startup.default.value=false' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nshared.indexes.download=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nshared.indexes.download.auto.consent=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
# Prevent CWM plugin from being disabled, as it's required for Remote Dev
|
|
printf '\nidea.required.plugins.id=com.jetbrains.codeWithMe' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
# Automatic updates are not supported by Remote Development
|
|
# It should be done manually by selecting correct IDE version in JetBrains Gateway
|
|
# For pre-configured environment (e.g. cloud) the version is fixed anyway
|
|
printf '\nide.no.platform.update=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
#TODO: disable once IDEA doesn't require JBA login for remote dev
|
|
printf '\neap.login.enabled=false' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
#TODO: CWM-5782 figure out why posix_spawn / jspawnhelper does not work in tests
|
|
printf '\njdk.lang.Process.launchMechanism=vfork' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
printf '\nide.ui.font.force.use.inter.font=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
# IJPL-841
|
|
printf '\nidea.io.coarse.ts=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
# --------------------------------
|
|
# Set Remote Development vmoptions
|
|
# --------------------------------
|
|
|
|
TEMP_REMOTE_DEV_VM_OPTIONS="$TEMP_SYSTEM_LIKE_DIR/pid.$$.temp.vmoptions"
|
|
if [ $IS_DARWIN -eq 1 ]; then
|
|
cp "$IDE_BIN_DIR/${IDE_PRODUCT_VM_OPTIONS}.vmoptions" "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
else
|
|
cp "$IDE_BIN_DIR/${IDE_PRODUCT_VM_OPTIONS}64.vmoptions" "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
fi
|
|
|
|
# [+ <IDE_HOME>.vmoptions (Toolbox style)
|
|
if [ -r "${IDE_HOME}.vmoptions" ]; then
|
|
cat "${IDE_HOME}.vmoptions" >>"$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
else
|
|
# Replace default (usually too small) Xmx with 2g
|
|
# Replace only default Xmx since users may modify vmoptions file to e.g. make -Xmx even bigger
|
|
sed "s/$IDE_DEFAULT_XMX/-Xmx2048m/g" "$TEMP_REMOTE_DEV_VM_OPTIONS" > "${TEMP_REMOTE_DEV_VM_OPTIONS}.tmp" && mv "${TEMP_REMOTE_DEV_VM_OPTIONS}.tmp" "${TEMP_REMOTE_DEV_VM_OPTIONS}"
|
|
fi
|
|
|
|
if [ $REMOTE_DEV_SERVER_USE_SELF_CONTAINED_LIBS -eq 1 ]; then
|
|
# Since TEMP_JBR is built on symlinks, java tries to resolve it and calculates java.home incorrectly
|
|
# Make sure java.home points to our patched JBR
|
|
printf "\n-Djava.home=%s" "$TEMP_JBR" >> "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
fi
|
|
|
|
if [ $IS_WSL2 -eq 1 ] && [ "${REMOTE_DEV_SERVER_ALLOW_IPV6_ON_WSL2:-}" != "true" ]; then
|
|
printf "\n-Djava.net.preferIPv4Stack=true" >> "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
fi
|
|
|
|
# GTW-7947 java failing to get username/home
|
|
printf "\n-Duser.home=%s" "$HOME" >> "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
|
|
if REMOTE_DEV_USERNAME=$(id -un); then
|
|
printf "\n-Duser.name=%s" "$REMOTE_DEV_USERNAME" >> "$TEMP_REMOTE_DEV_VM_OPTIONS"
|
|
else
|
|
echo "Failed to retrieve username" >&2
|
|
fi
|
|
|
|
export "${IDE_PRODUCT_UC}_VM_OPTIONS=${TEMP_REMOTE_DEV_VM_OPTIONS}"
|
|
|
|
# Set to auto-configure JDK and project SDK by default if not pre-defined
|
|
if [ -n "${REMOTE_DEV_JDK_DETECTION:-}" ]; then
|
|
if [ "${REMOTE_DEV_JDK_DETECTION:-}" = "true" ] || [ "${REMOTE_DEV_JDK_DETECTION:-}" = "1" ]; then
|
|
echo "Enable JDK auto-detection and project SDK setup"
|
|
printf '\njdk.configure.existing=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
else
|
|
if [ "${REMOTE_DEV_JDK_DETECTION:-}" = "false" ] || [ "${REMOTE_DEV_JDK_DETECTION:-}" = "0" ]; then
|
|
echo "Disable JDK auto-detection and project SDK setup"
|
|
printf '\njdk.configure.existing=false' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
else
|
|
echo "Unsupported value for REMOTE_DEV_JDK_DETECTION variable: ${REMOTE_DEV_JDK_DETECTION:-}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
else
|
|
echo "Enable JDK auto-detection and project SDK setup by default. Set REMOTE_DEV_JDK_DETECTION=false to disable."
|
|
printf '\njdk.configure.existing=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
fi
|
|
|
|
# GTW-88. Disable missing SDK notifications if launch in Docker.
|
|
echo "Is running inside Docker container: ${IS_RUNNING_IN_DOCKER}"
|
|
if [ "${IS_RUNNING_IN_DOCKER}" -eq 1 ]; then
|
|
echo "Disable Project SDK editor notifications"
|
|
printf '\nunknown.sdk.show.editor.actions=false' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
echo "Set 'remotedev.run.in.docker' registry key to 'true' to enable Remote Development project SDK notification"
|
|
printf '\nremotedev.run.in.docker=true' >> "$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
fi
|
|
|
|
export "${IDE_PRODUCT_UC}_PROPERTIES=$TEMP_REMOTE_DEV_PROPERTIES_PATH"
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Run the IDE.
|
|
# ---------------------------------------------------------------------
|
|
|
|
if [ $IS_DARWIN -eq 1 ]; then
|
|
LAUNCHER="$IDE_BIN_DIR/../MacOS/$IDE_SCRIPT_NAME"
|
|
else
|
|
LAUNCHER="$IDE_BIN_DIR/$IDE_SCRIPT_NAME"
|
|
fi
|
|
|
|
# Do not use exec here because trap is used in this script for cleanup, and exec-ing will override that
|
|
if [ $PER_PROJECT_CONFIGS -eq 1 ]; then
|
|
case "$STARTER_COMMAND" in
|
|
warmup)
|
|
"$LAUNCHER" warmup "--project-dir=$PROJECT_PATH" "$@"
|
|
;;
|
|
installPlugins)
|
|
"$LAUNCHER" installPlugins "$@"
|
|
;;
|
|
*)
|
|
"$LAUNCHER" "$STARTER_COMMAND" "$PROJECT_PATH" "$@"
|
|
;;
|
|
esac
|
|
else
|
|
# for compatibility with old launcher arguments
|
|
if [ "$STARTER_COMMAND" = "warmup" ]; then
|
|
"$LAUNCHER" warmup "--project-dir=$PROJECT_PATH" "$@"
|
|
else
|
|
"$LAUNCHER" "$STARTER_COMMAND" "$@"
|
|
fi
|
|
fi
|