Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
181 changes: 111 additions & 70 deletions scripts/install_composer.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,82 +5,123 @@ set -euo pipefail

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

ACTION="${1:-install}"
INSTALL_DIR="${COMPOSER_INSTALL_DIR:-/usr/local/bin}"
COMPOSER_URL="https://getcomposer.org/download/latest-stable/composer.phar"

# Check for PHP dependency
if ! command -v php >/dev/null 2>&1; then
echo "[composer] Error: PHP is required but not installed." >&2
echo "[composer] Install PHP first using one of:" >&2
echo " - sudo apt-get install php php-cli (Debian/Ubuntu)" >&2
echo " - brew install php (macOS)" >&2
echo " - ./install_tool.sh php (via this toolset)" >&2

# Try to install PHP automatically if we can
if [ -f "$DIR/installers/package_manager.sh" ]; then
echo "[composer] Attempting to install PHP automatically..." >&2
if "$DIR/installers/package_manager.sh" php; then
echo "[composer] PHP installed successfully, continuing with Composer..." >&2
install_composer() {
# Check for PHP dependency
if ! command -v php >/dev/null 2>&1; then
echo "[composer] Error: PHP is required but not installed." >&2
echo "[composer] Install PHP first using one of:" >&2
echo " - sudo apt-get install php php-cli (Debian/Ubuntu)" >&2
echo " - brew install php (macOS)" >&2
echo " - ./install_tool.sh php (via this toolset)" >&2

# Try to install PHP automatically if we can
if [ -f "$DIR/installers/package_manager.sh" ]; then
echo "[composer] Attempting to install PHP automatically..." >&2
if "$DIR/installers/package_manager.sh" php; then
echo "[composer] PHP installed successfully, continuing with Composer..." >&2
else
echo "[composer] Failed to install PHP automatically. Please install manually." >&2
exit 1
fi
else
echo "[composer] Failed to install PHP automatically. Please install manually." >&2
exit 1
fi
fi

echo "[composer] Downloading latest stable composer.phar..."

# Download to temp file
TMP_FILE="$(mktemp)"
trap "rm -f '$TMP_FILE'" EXIT

if ! curl -fsSL "$COMPOSER_URL" -o "$TMP_FILE"; then
echo "[composer] Error: Failed to download from $COMPOSER_URL" >&2
exit 1
fi

# Verify it's a valid phar by checking version
echo "[composer] Verifying downloaded phar..."
if ! php "$TMP_FILE" --version >/dev/null 2>&1; then
echo "[composer] Error: Downloaded file is not a valid composer.phar" >&2
exit 1
fi

# Get version
COMPOSER_VERSION="$(php "$TMP_FILE" --version 2>/dev/null | head -1 || echo 'unknown')"
echo "[composer] Downloaded: $COMPOSER_VERSION"

# Get current version
CURRENT_VERSION="$(command -v composer >/dev/null 2>&1 && composer --version 2>/dev/null | head -1 || echo '<none>')"
echo "[composer] Current: $CURRENT_VERSION"

# Install composer.phar
echo "[composer] Installing to $INSTALL_DIR/composer..."

if [ -w "$INSTALL_DIR" ]; then
# User has write access
cp "$TMP_FILE" "$INSTALL_DIR/composer"
chmod 755 "$INSTALL_DIR/composer"
elif command -v sudo >/dev/null 2>&1; then
# Need sudo
echo "[composer] Requires sudo to install to $INSTALL_DIR"
sudo cp "$TMP_FILE" "$INSTALL_DIR/composer"
sudo chmod 755 "$INSTALL_DIR/composer"
else
echo "[composer] Error: Cannot write to $INSTALL_DIR and sudo not available" >&2
echo "[composer] Try: COMPOSER_INSTALL_DIR=~/.local/bin $0" >&2
exit 1
fi
fi

echo "[composer] Downloading latest stable composer.phar..."

# Download to temp file
TMP_FILE="$(mktemp)"
trap "rm -f '$TMP_FILE'" EXIT

if ! curl -fsSL "$COMPOSER_URL" -o "$TMP_FILE"; then
echo "[composer] Error: Failed to download from $COMPOSER_URL" >&2
exit 1
fi

# Verify it's a valid phar by checking version
echo "[composer] Verifying downloaded phar..."
if ! php "$TMP_FILE" --version >/dev/null 2>&1; then
echo "[composer] Error: Downloaded file is not a valid composer.phar" >&2
exit 1
fi

# Get version
COMPOSER_VERSION="$(php "$TMP_FILE" --version 2>/dev/null | head -1 || echo 'unknown')"
echo "[composer] Downloaded: $COMPOSER_VERSION"

# Get current version
CURRENT_VERSION="$(command -v composer >/dev/null 2>&1 && composer --version 2>/dev/null | head -1 || echo '<none>')"
echo "[composer] Current: $CURRENT_VERSION"

# Install composer.phar
echo "[composer] Installing to $INSTALL_DIR/composer..."

if [ -w "$INSTALL_DIR" ]; then
# User has write access
cp "$TMP_FILE" "$INSTALL_DIR/composer"
chmod 755 "$INSTALL_DIR/composer"
elif command -v sudo >/dev/null 2>&1; then
# Need sudo
echo "[composer] Requires sudo to install to $INSTALL_DIR"
sudo cp "$TMP_FILE" "$INSTALL_DIR/composer"
sudo chmod 755 "$INSTALL_DIR/composer"
else
echo "[composer] Error: Cannot write to $INSTALL_DIR and sudo not available" >&2
echo "[composer] Try: COMPOSER_INSTALL_DIR=~/.local/bin $0" >&2
exit 1
fi

# Verify installation
NEW_VERSION="$(composer --version 2>/dev/null | head -1 || echo '<failed>')"
echo "[composer] Installed: $NEW_VERSION"

if [ "$NEW_VERSION" = "<failed>" ]; then
echo "[composer] Error: Installation verification failed" >&2
exit 1
fi

echo "[composer] ✓ Installation successful"

# Verify installation
NEW_VERSION="$(composer --version 2>/dev/null | head -1 || echo '<failed>')"
echo "[composer] Installed: $NEW_VERSION"

if [ "$NEW_VERSION" = "<failed>" ]; then
echo "[composer] Error: Installation verification failed" >&2
exit 1
fi

echo "[composer] Installation successful"
}

uninstall_composer() {
local composer_bin
composer_bin="$(command -v composer 2>/dev/null || echo "")"

if [ -z "$composer_bin" ]; then
echo "[composer] Not installed, nothing to remove" >&2
return 0
fi

echo "[composer] Removing composer binary: $composer_bin" >&2
local bin_dir
bin_dir="$(dirname "$composer_bin")"
if [ -w "$bin_dir" ]; then
rm -f "$composer_bin"
elif command -v sudo >/dev/null 2>&1; then
sudo rm -f "$composer_bin"
else
echo "[composer] Error: Cannot remove $composer_bin (no write access and sudo not available)" >&2
return 1
fi

# Remove composer cache/config directories
for dir in "$HOME/.composer" "$HOME/.config/composer"; do
if [ -d "$dir" ]; then
echo "[composer] Removing $dir" >&2
rm -rf "$dir"
fi
done

echo "[composer] Uninstall complete" >&2
}

case "$ACTION" in
install|update) install_composer ;;
uninstall) uninstall_composer ;;
*) echo "Usage: $0 {install|update|uninstall}" ; exit 2 ;;
esac
71 changes: 44 additions & 27 deletions scripts/install_docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,52 @@ set -euo pipefail
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
. "$DIR/lib/common.sh"

ACTION="${1:-install}"

before() { command -v docker >/dev/null 2>&1 && docker --version || true; }
after() { command -v docker >/dev/null 2>&1 && docker --version || true; }

# Reconcile to official script/apt on Debian/Ubuntu systems
if have apt-get; then
echo "[docker] current: $(before)"
# Remove legacy docker.io if present
apt_purge_if_present docker.io docker-doc docker-compose podman-docker containerd runc || true

if is_wsl; then
echo "[docker] WSL detected - installing Docker Engine (skipping 20s wait)..."
echo "[docker] Note: Docker Desktop for Windows is also available."
echo "[docker] See: https://docs.docker.com/desktop/wsl/"
# Download script and remove the sleep to skip 20-second wait
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sed -i 's/sleep 20/sleep 0/' /tmp/get-docker.sh
sudo sh /tmp/get-docker.sh
rm -f /tmp/get-docker.sh
# Start service manually (no systemd in WSL)
sudo service docker start || echo "[docker] Run 'sudo service docker start' to start Docker"
else
curl -fsSL https://get.docker.com | sh
install_docker() {
# Reconcile to official script/apt on Debian/Ubuntu systems
if have apt-get; then
echo "[docker] current: $(before)"
# Remove legacy docker.io if present
apt_purge_if_present docker.io docker-doc docker-compose podman-docker containerd runc || true

if is_wsl; then
echo "[docker] WSL detected - installing Docker Engine (skipping 20s wait)..."
echo "[docker] Note: Docker Desktop for Windows is also available."
echo "[docker] See: https://docs.docker.com/desktop/wsl/"
# Download script and remove the sleep to skip 20-second wait
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sed -i 's/sleep 20/sleep 0/' /tmp/get-docker.sh
sudo sh /tmp/get-docker.sh
rm -f /tmp/get-docker.sh
# Start service manually (no systemd in WSL)
sudo service docker start || echo "[docker] Run 'sudo service docker start' to start Docker"
else
curl -fsSL https://get.docker.com | sh
fi

sudo usermod -aG docker "$USER" || true
echo "[docker] updated: $(after)"
return 0
fi

sudo usermod -aG docker "$USER" || true
echo "[docker] updated: $(after)"
exit 0
fi

echo "Please install Docker following https://docs.docker.com/engine/install/"


echo "Please install Docker following https://docs.docker.com/engine/install/"
}

uninstall_docker() {
echo "[docker] Docker uninstall is a system-level operation." >&2
echo "[docker] To remove Docker Engine, run:" >&2
echo "[docker] sudo apt-get remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" >&2
echo "[docker] sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" >&2
echo "[docker] sudo rm -rf /var/lib/docker /var/lib/containerd" >&2
echo "[docker] See: https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine" >&2
}

case "$ACTION" in
install|update) install_docker ;;
uninstall) uninstall_docker ;;
*) echo "Usage: $0 {install|update|uninstall}" ; exit 2 ;;
esac
Loading
Loading