diff --git a/tf/scripts/dev-tools.sh b/tf/scripts/dev-tools.sh index 89ea77b..6da5c6f 100755 --- a/tf/scripts/dev-tools.sh +++ b/tf/scripts/dev-tools.sh @@ -2,13 +2,38 @@ set -euo pipefail if command -v apt-get >/dev/null 2>&1; then + wait_for_apt() { + if command -v fuser >/dev/null 2>&1; then + while \ + fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || + fuser /var/lib/apt/lists/lock >/dev/null 2>&1 || + fuser /var/lib/dpkg/lock >/dev/null 2>&1; do + echo "Waiting for apt locks to clear..." + sleep 2 + done + else + # Fallback when fuser is unavailable + sleep 2 + fi + } + + apt_exec() { + if command -v sudo >/dev/null 2>&1; then + sudo "$@" + else + "$@" + fi + } + export DEBIAN_FRONTEND=noninteractive - sudo apt-get update -qq - sudo apt-get install -y \ + wait_for_apt + apt_exec apt-get update -qq + wait_for_apt + apt_exec apt-get install -y \ make tree jq curl wget unzip git ripgrep fd-find htop >/dev/null # fd binary name differs on Debian if [[ ! -e /usr/local/bin/fd && -e /usr/bin/fdfind ]]; then - sudo ln -sf /usr/bin/fdfind /usr/local/bin/fd + apt_exec ln -sf /usr/bin/fdfind /usr/local/bin/fd fi fi diff --git a/tf/workspace.tf b/tf/workspace.tf index 8294e79..e52a9b3 100644 --- a/tf/workspace.tf +++ b/tf/workspace.tf @@ -182,4 +182,44 @@ module "claude_code" { workdir = "/workspaces" group = "AI Tools" order = 30 + pre_install_script = <<-EOT + #!/bin/bash + set -euo pipefail + + if curl --help 2>&1 | grep -q -- "--retry-all-errors"; then + exit 0 + fi + + if ! command -v apt-get >/dev/null 2>&1; then + exit 0 + fi + + wait_for_apt() { + if command -v fuser >/dev/null 2>&1; then + while \ + fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || + fuser /var/lib/apt/lists/lock >/dev/null 2>&1 || + fuser /var/lib/dpkg/lock >/dev/null 2>&1; do + echo "Waiting for apt locks to clear..." >&2 + sleep 2 + done + else + sleep 2 + fi + } + + apt_exec() { + if command -v sudo >/dev/null 2>&1; then + sudo "$@" + else + "$@" + fi + } + + export DEBIAN_FRONTEND=noninteractive + wait_for_apt + apt_exec apt-get update -qq + wait_for_apt + apt_exec apt-get install -y curl >/dev/null + EOT }