Enhance the settings handling in the VSCode-web module to properly merge user-defined settings with any existing settings file using jq when available. This ensures that settings from both the Terraform module and Coder's git authentication system are preserved. Related to coder/coder#19007 Co-authored-by: matifali <10648092+matifali@users.noreply.github.com>
146 lines
5.0 KiB
Bash
146 lines
5.0 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
BOLD='\033[0;1m'
|
|
EXTENSIONS=("${EXTENSIONS}")
|
|
VSCODE_WEB="${INSTALL_PREFIX}/bin/code-server"
|
|
|
|
# Set extension directory
|
|
EXTENSION_ARG=""
|
|
if [ -n "${EXTENSIONS_DIR}" ]; then
|
|
EXTENSION_ARG="--extensions-dir=${EXTENSIONS_DIR}"
|
|
fi
|
|
|
|
# Set extension directory
|
|
SERVER_BASE_PATH_ARG=""
|
|
if [ -n "${SERVER_BASE_PATH}" ]; then
|
|
SERVER_BASE_PATH_ARG="--server-base-path=${SERVER_BASE_PATH}"
|
|
fi
|
|
|
|
# Set disable workspace trust
|
|
DISABLE_TRUST_ARG=""
|
|
if [ "${DISABLE_TRUST}" = true ]; then
|
|
DISABLE_TRUST_ARG="--disable-workspace-trust"
|
|
fi
|
|
|
|
run_vscode_web() {
|
|
echo "👷 Running $VSCODE_WEB serve-local $EXTENSION_ARG $SERVER_BASE_PATH_ARG $DISABLE_TRUST_ARG --port ${PORT} --host 127.0.0.1 --accept-server-license-terms --without-connection-token --telemetry-level ${TELEMETRY_LEVEL} in the background..."
|
|
echo "Check logs at ${LOG_PATH}!"
|
|
"$VSCODE_WEB" serve-local "$EXTENSION_ARG" "$SERVER_BASE_PATH_ARG" "$DISABLE_TRUST_ARG" --port "${PORT}" --host 127.0.0.1 --accept-server-license-terms --without-connection-token --telemetry-level "${TELEMETRY_LEVEL}" > "${LOG_PATH}" 2>&1 &
|
|
}
|
|
|
|
# Merge settings with any existing settings file
|
|
echo "⚙️ Configuring VS Code settings..."
|
|
mkdir -p ~/.vscode-server/data/Machine
|
|
|
|
SETTINGS_FILE="~/.vscode-server/data/Machine/settings.json"
|
|
if [ -f ~/.vscode-server/data/Machine/settings.json ]; then
|
|
# Merge with existing settings using jq if available
|
|
if command -v jq > /dev/null 2>&1; then
|
|
echo "📝 Merging with existing settings..."
|
|
# Create a temporary file with the new settings
|
|
echo "${SETTINGS}" > /tmp/new_settings.json
|
|
# Merge existing settings with new settings (new settings take precedence)
|
|
jq -s '.[0] * .[1]' ~/.vscode-server/data/Machine/settings.json /tmp/new_settings.json > /tmp/merged_settings.json
|
|
mv /tmp/merged_settings.json ~/.vscode-server/data/Machine/settings.json
|
|
rm -f /tmp/new_settings.json
|
|
else
|
|
echo "⚠️ jq not available, overwriting existing settings..."
|
|
echo "${SETTINGS}" > ~/.vscode-server/data/Machine/settings.json
|
|
fi
|
|
else
|
|
echo "📝 Creating new settings file..."
|
|
echo "${SETTINGS}" > ~/.vscode-server/data/Machine/settings.json
|
|
fi
|
|
|
|
# Check if vscode-server is already installed for offline or cached mode
|
|
if [ -f "$VSCODE_WEB" ]; then
|
|
if [ "${OFFLINE}" = true ] || [ "${USE_CACHED}" = true ]; then
|
|
echo "🥳 Found a copy of VS Code Web"
|
|
run_vscode_web
|
|
exit 0
|
|
fi
|
|
fi
|
|
# Offline mode always expects a copy of vscode-server to be present
|
|
if [ "${OFFLINE}" = true ]; then
|
|
echo "Failed to find a copy of VS Code Web"
|
|
exit 1
|
|
fi
|
|
|
|
# Create install prefix
|
|
mkdir -p ${INSTALL_PREFIX}
|
|
|
|
printf "$${BOLD}Installing Microsoft Visual Studio Code Server!\n"
|
|
|
|
# Download and extract vscode-server
|
|
ARCH=$(uname -m)
|
|
case "$ARCH" in
|
|
x86_64) ARCH="x64" ;;
|
|
aarch64) ARCH="arm64" ;;
|
|
*)
|
|
echo "Unsupported architecture"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Detect the platform
|
|
if [ -n "${PLATFORM}" ]; then
|
|
DETECTED_PLATFORM="${PLATFORM}"
|
|
elif [ -f /etc/alpine-release ] || grep -qi 'ID=alpine' /etc/os-release 2>/dev/null || command -v apk > /dev/null 2>&1; then
|
|
DETECTED_PLATFORM="alpine"
|
|
elif [ "$(uname -s)" = "Darwin" ]; then
|
|
DETECTED_PLATFORM="darwin"
|
|
else
|
|
DETECTED_PLATFORM="linux"
|
|
fi
|
|
|
|
# Check if a specific VS Code Web commit ID was provided
|
|
if [ -n "${COMMIT_ID}" ]; then
|
|
HASH="${COMMIT_ID}"
|
|
else
|
|
HASH=$(curl -fsSL https://update.code.visualstudio.com/api/commits/stable/server-$DETECTED_PLATFORM-$ARCH-web | cut -d '"' -f 2)
|
|
fi
|
|
printf "$${BOLD}VS Code Web commit id version $HASH.\n"
|
|
|
|
output=$(curl -fsSL "https://vscode.download.prss.microsoft.com/dbazure/download/stable/$HASH/vscode-server-$DETECTED_PLATFORM-$ARCH-web.tar.gz" | tar -xz -C "${INSTALL_PREFIX}" --strip-components 1)
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to install Microsoft Visual Studio Code Server: $output"
|
|
exit 1
|
|
fi
|
|
printf "$${BOLD}VS Code Web has been installed.\n"
|
|
|
|
# Install each extension...
|
|
IFS=',' read -r -a EXTENSIONLIST <<< "$${EXTENSIONS}"
|
|
for extension in "$${EXTENSIONLIST[@]}"; do
|
|
if [ -z "$extension" ]; then
|
|
continue
|
|
fi
|
|
printf "🧩 Installing extension $${CODE}$extension$${RESET}...\n"
|
|
output=$($VSCODE_WEB "$EXTENSION_ARG" --install-extension "$extension" --force)
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to install extension: $extension: $output"
|
|
fi
|
|
done
|
|
|
|
if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then
|
|
if ! command -v jq > /dev/null; then
|
|
echo "jq is required to install extensions from a workspace file."
|
|
else
|
|
WORKSPACE_DIR="$HOME"
|
|
if [ -n "${FOLDER}" ]; then
|
|
WORKSPACE_DIR="${FOLDER}"
|
|
fi
|
|
|
|
if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then
|
|
printf "🧩 Installing extensions from %s/.vscode/extensions.json...\n" "$WORKSPACE_DIR"
|
|
# Use sed to remove single-line comments before parsing with jq
|
|
extensions=$(sed 's|//.*||g' "$WORKSPACE_DIR"/.vscode/extensions.json | jq -r '.recommendations[]')
|
|
for extension in $extensions; do
|
|
$VSCODE_WEB "$EXTENSION_ARG" --install-extension "$extension" --force
|
|
done
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
run_vscode_web
|