linuxbox/update/arch/development.sh

283 lines
8.4 KiB
Bash

#!/bin/bash
# Arch Linux Development Environment Module
# Handles programming languages, tools, and development setup
arch_install_development_languages() {
log SECTION "Installing development languages and runtimes"
local section_start=$(date +%s)
if confirm "Install development languages (Node.js, Go, PHP, Ruby, Julia, Java)?"; then
local dev_packages=(
nodejs npm go php luarocks composer jdk-openjdk julia ruby
)
install_packages "${dev_packages[@]}"
# Configure npm prefix
npm config set prefix "${HOME}/.npm"
log SUCCESS "Development languages installed $(show_timer $section_start)"
fi
}
arch_install_neovim() {
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT" && ! role_enabled "TERMINAL"; then
return 0
fi
log SECTION "Installing Neovim"
local section_start=$(date +%s)
if confirm "Install Neovim (git version)?"; then
# Install git version of neovim from AUR
install_aur_packages neovim-git-bin
# Install Node.js integration
if command_exists npm; then
sudo npm install -g neovim
fi
# Setup Neovim configuration
mkdir -p ~/.config/nvim
ln -sf ~/linuxbox/config/nvim/init.lua ~/.config/nvim/init.lua
# Sync plugins if lazy directory exists
if [ -d ~/.local/share/nvim/lazy ]; then
nvim --headless "+Lazy! sync" +qa || true
fi
log SUCCESS "Neovim installed $(show_timer $section_start)"
fi
}
arch_install_rust_tools() {
log SECTION "Installing Rust development tools"
local section_start=$(date +%s)
if confirm "Install Rust tools (cargo packages)?"; then
# Essential Rust tools
local rust_tools=(
"tree-sitter-cli"
"ripgrep"
"eza"
"zoxide --locked"
"starship --locked"
)
for tool in "${rust_tools[@]}"; do
log INFO "Installing $tool..."
cargo install $tool
done
# Setup starship configuration
mkdir -p ~/.config
ln -sf ~/linuxbox/config/starship.toml ~/.config/starship.toml
log SUCCESS "Rust tools installed $(show_timer $section_start)"
fi
}
arch_install_embedded_tools() {
if ! role_enabled "CODE" && ! role_enabled "LAB"; then
return 0
fi
log SECTION "Installing embedded development tools"
local section_start=$(date +%s)
if confirm "Install embedded development tools (RP2040, etc.)?"; then
# Add embedded target for Rust
rustup target add thumbv6m-none-eabi
# Install embedded-specific cargo tools
local embedded_tools=(
"elf2uf2-rs --locked"
"probe-run"
"flip-link"
)
for tool in "${embedded_tools[@]}"; do
log INFO "Installing $tool..."
cargo install $tool
done
# Link pico-load script
mkdir -p ~/.local/bin
ln -sf ~/linuxbox/pico-load.sh ~/.local/bin/pico-load
log SUCCESS "Embedded tools installed $(show_timer $section_start)"
fi
}
arch_install_lsp_servers() {
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
return 0
fi
log SECTION "Installing LSP servers"
local section_start=$(date +%s)
if confirm "Install Language Server Protocol servers?"; then
# LSP servers from official repos
local lsp_packages=(
prettier stylua python-black shfmt lua-language-server
bash-language-server ccls vscode-html-languageserver
vscode-json-languageserver marksman pyright yaml-language-server
vscode-css-languageserver clang
)
install_packages "${lsp_packages[@]}"
# LSP servers from AUR
install_aur_packages dockerfile-language-server
# Rust components
rustup component add rust-analyzer clippy rustfmt
# Lua configuration
ln -sf ~/linuxbox/luacheckrc ~/.luacheckrc
log SUCCESS "LSP servers installed $(show_timer $section_start)"
fi
}
arch_install_virtualhere() {
if ! role_enabled "CODE" && ! role_enabled "LAB"; then
return 0
fi
log SECTION "Installing VirtualHere USB client"
local section_start=$(date +%s)
if confirm "Install VirtualHere USB over IP client?"; then
cd ~
# Download VirtualHere client files
local vh_files=(
"virtualhereclient.service"
"vhclientx86_64"
"vhuit64"
)
local vh_base_url="https://www.virtualhere.com/sites/default/files/usbclient"
for file in "${vh_files[@]}"; do
if [ "$file" == "virtualhereclient.service" ]; then
wget "${vh_base_url}/scripts/$file"
else
wget "${vh_base_url}/$file"
fi
done
# Make executables and install
chmod +x ./vhclientx86_64 ./vhuit64
sudo mv ./vhclientx86_64 /usr/sbin
sudo mv ./vhuit64 /usr/sbin
# Setup sudo permissions
echo "$USER ALL=(ALL:ALL) NOPASSWD: /usr/sbin/vhclientx86_64" | \
sudo tee /etc/sudoers.d/$USER+vhclientx86_64
echo "$USER ALL=(ALL:ALL) NOPASSWD: /usr/sbin/vhuit64" | \
sudo tee /etc/sudoers.d/$USER+vhuit64
# Install and enable service
sudo mv virtualhereclient.service /etc/systemd/system/virtualhereclient.service
sudo systemctl daemon-reload
sudo systemctl enable virtualhereclient.service
sudo systemctl start virtualhereclient.service
log SUCCESS "VirtualHere client installed $(show_timer $section_start)"
fi
}
arch_setup_git() {
log SECTION "Setting up Git configuration"
local section_start=$(date +%s)
# Install git-lfs if not present
if ! command_exists git-lfs; then
install_packages git-lfs
fi
# Link git configuration
ln -sf ~/linuxbox/gitconfig ~/.gitconfig
log SUCCESS "Git configuration setup $(show_timer $section_start)"
}
arch_install_lazygit() {
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
return 0
fi
log SECTION "Installing Lazygit"
local section_start=$(date +%s)
if confirm "Install Lazygit Git TUI?"; then
install_packages lazygit
# Setup lazygit configuration
mkdir -p ~/.config/lazygit
ln -sf ~/linuxbox/config/lazygit/config.yml ~/.config/lazygit/config.yml
log SUCCESS "Lazygit installed $(show_timer $section_start)"
fi
}
arch_install_containers() {
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
return 0
fi
log SECTION "Installing container tools"
local section_start=$(date +%s)
if confirm "Install container tools (Docker, Podman)?"; then
# Install from official repositories or AUR
local container_packages=()
if confirm "Install Docker?"; then
container_packages+=(docker docker-compose)
fi
if confirm "Install Podman?"; then
container_packages+=(podman podman-compose)
fi
if [ ${#container_packages[@]} -gt 0 ]; then
install_packages "${container_packages[@]}"
# Add user to docker group if docker was installed
if [[ " ${container_packages[@]} " =~ " docker " ]]; then
sudo usermod -aG docker $USER
log INFO "Added $USER to docker group - logout/login required"
fi
fi
log SUCCESS "Container tools installed $(show_timer $section_start)"
fi
}
# Main function to run all development setup
arch_setup_development() {
if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then
log INFO "Development roles not enabled - skipping development setup"
return 0
fi
arch_setup_git
arch_install_development_languages
arch_install_neovim
arch_install_rust_tools
arch_install_embedded_tools
arch_install_lsp_servers
arch_install_virtualhere
arch_install_lazygit
arch_install_containers
}
# Source guard
if [ -z "$ARCH_DEVELOPMENT_LOADED" ]; then
ARCH_DEVELOPMENT_LOADED=true
fi