#!/usr/bin/env bash set -euo pipefail # CLI: parse flags PROMPT_DELETE=1 while [[ $# -gt 0 ]]; do case "$1" in --no-prompt|-n) PROMPT_DELETE=0 shift ;; --prompt|-p) PROMPT_DELETE=1 shift ;; *) break esac done echo ">>> Bootstrapping new Debian-like machine..." # 1. Update package list and install essentials echo ">>> Installing bash, tmux, and vim..." sudo apt update # Remove minimal vim if installed, then install clipboard-enabled version sudo apt remove -y vim || true sudo apt install -y bash tmux vim-gtk3 git curl # 2. Clone your dotfiles (bare repo style) if [ ! -d "$HOME/.dotfiles" ]; then echo ">>> Cloning dotfiles repo..." git clone --bare https://gitea.james-server.duckdns.org/james/dotfiles $HOME/.dotfiles else echo ">>> Dotfiles repo already exists." fi # 3. Checkout dotfiles dotfiles() { /usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME" "$@" } echo ">>> Checking out dotfiles..." if ! dotfiles checkout; then echo ">>> Conflicts detected! Handling conflicting dotfiles..." mkdir -p "$HOME/.dotfiles-backup" # Gather conflicts (paths with spaces supported) conflicts=$(dotfiles checkout 2>&1 | grep -E "\s+\." | awk '{print $1}') if [ -n "$conflicts" ]; then if [ "$PROMPT_DELETE" = "0" ]; then while IFS= read -r f; do [ -z "$f" ] && continue mv "$f" "$HOME/.dotfiles-backup/$f" done <<< "$conflicts" else while IFS= read -r f; do [ -z "$f" ] && continue if [ -t 1 ]; then read -r -p "Move '$f' to backup? (y/N): " resp case "$resp" in [Yy]* ) mv "$f" "$HOME/.dotfiles-backup/$f" ;; * ) echo "Skipping '$f'." ;; esac else echo "Non-interactive environment detected; skipping '$f'." fi done <<< "$conflicts" fi fi dotfiles checkout fi dotfiles config --local status.showUntrackedFiles no # 4. setup tmux mkdir -p ~/.tmux/plugins if [ ! -d ~/.tmux/plugins/tpm ]; then echo ">>> Installing Tmux Plugin Manager..." git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm fi echo ">>> Done! Bash, tmux, vim, and dotfiles are ready."