diff --git a/.env b/.env index c28fb80f..f8add1f0 100644 --- a/.env +++ b/.env @@ -1,3 +1,2 @@ CONTAINER_USER=ubuntu CONTAINER_HOME=/home/${CONTAINER_USER} -HOST_NVIM_DIR=${HOME}/.config/nvim diff --git a/.script/build-rmcs b/.script/build-rmcs index ef5d85ff..68f90d73 100755 --- a/.script/build-rmcs +++ b/.script/build-rmcs @@ -1,7 +1,16 @@ -#! /bin/bash +#!/bin/bash source /opt/ros/jazzy/setup.bash -cd ${RMCS_PATH}/rmcs_ws +cd "${RMCS_PATH}"/rmcs_ws || exit -colcon build --symlink-install --merge-install $@ +[[ -x /opt/cmake/bin/cmake ]] && + export PATH="/opt/cmake/bin:$PATH" + +command -v clang &>/dev/null && + export CC=clang + +command -v clang++ &>/dev/null && + export CXX=clang++ + +colcon build --symlink-install --merge-install "$@" --cmake-args -G Ninja diff --git a/.script/host/rmcs b/.script/host/rmcs new file mode 100755 index 00000000..0b65f932 --- /dev/null +++ b/.script/host/rmcs @@ -0,0 +1,96 @@ +#!/bin/bash + +set -euo pipefail + +readonly DEVELOPER_NAME="ubuntu" +readonly NVIM_PATH="/opt/nvim-linux-x86_64/bin/nvim" +readonly NVIM_PORT=6666 +readonly NVIM_HOST="localhost" + +function show_help() { + local project_dir="$1" + local service="$2" + echo "Usage: $(basename "$0") [path] [zsh|n|nvim|neovide|vim|ide]" + echo " Project dir: $project_dir" + echo " Service: $service" +} + +function rmcs_zsh() { + local service="$1" + echo "Starting and entering container..." + docker compose up -d + docker compose exec "$service" zsh +} + +function rmcs_nvim() { + local service="$1" + local timeout=10 + local success=0 + local port=$NVIM_PORT + + echo "Starting container..." + docker compose up -d + + echo "Checking available port and starting nvim headless server..." + while nc -z "$NVIM_HOST" "$port" 2>/dev/null; do + echo "Port $port is occupied, trying next..." + port=$((port + 1)) + done + + echo "Starting nvim server on port $port..." + docker compose exec -u "$DEVELOPER_NAME" -d "$service" \ + "$NVIM_PATH" --headless --listen "$NVIM_HOST:$port" + + for i in $(seq 1 $timeout); do + if nc -z "$NVIM_HOST" "$port" 2>/dev/null; then + echo "nvim server started on port $port" + success=1 + break + fi + echo "Waiting for nvim server to start... ($i/$timeout)" + sleep 1 + done + + if [ $success -eq 1 ]; then + echo "Starting neovide..." + nohup neovide --server="$NVIM_HOST:$port" >/dev/null 2>&1 & + else + echo "nvim server failed to start within $timeout seconds, neovide not launched" + exit 1 + fi +} + +function main() { + local project_dir command + + if [ -d "${1:-}" ]; then + project_dir="$(cd "$1" && pwd)" + command="${2:-}" + else + project_dir="$(pwd)" + command="${1:-}" + fi + + cd "$project_dir" || exit 1 + + if [ ! -f "docker-compose.yml" ]; then + echo "Error: docker-compose.yml not found in current directory" + exit 1 + fi + + local service="rmcs-develop" + + case "$command" in + zsh) + rmcs_zsh "$service" + ;; + n | nvim | neovide | vim | ide) + rmcs_nvim "$service" + ;; + *) + show_help "$project_dir" "$service" + ;; + esac +} + +main "$@" diff --git a/docker-compose.yml b/docker-compose.yml index 43ec6c74..4043fa6f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: - /dev:/dev:bind - /tmp/.X11-unix:/tmp/.X11-unix:bind - /run/user/1000/wayland-0:/run/user/1000/wayland-0:bind - - ${HOST_NVIM_DIR}:${CONTAINER_HOME}/.config/nvim/:bind + - ~/.config/:${CONTAINER_HOME}/.config/:bind - .:/workspaces/RMCS:bind environment: - DISPLAY=${DISPLAY}