refactor: more reliable installer
3 files changed, +166 -108
+1-1.zshrc
| @@ -11,5 +11,5 @@ autoload -Uz compinit && compinit | ||
| 11 | 11 | source "$ZDOTDIR/update_functions.sh" |
| 12 | 12 | |
| 13 | 13 | # Post compinit setups. Good for overriding plugins. |
| 14 | -touch "$ZDOTDIR/env.sh" && source "$ZDOTDIR"/env.sh | |
| 14 | +[ -f "$ZDOTDIR/env.sh" ] && source "$ZDOTDIR/env.sh" | |
| 15 | 15 | source "$ZDOTDIR"/config.sh |
+164-106install.sh
| @@ -1,118 +1,176 @@ | ||
| 1 | 1 | #!/bin/bash |
| 2 | 2 | |
| 3 | -STORAGE="${XDG_DATA_HOME:-$HOME/.local/share}/dotzsh" | |
| 4 | -mkdir -p "$STORAGE" | |
| 5 | - | |
| 6 | -# Select installer | |
| 7 | -if command -v pacman &>/dev/null; then | |
| 8 | - INSTALL='sudo pacman -S --noconfirm' | |
| 9 | -elif command -v apt &>/dev/null; then | |
| 10 | - INSTALL='sudo apt install -y' | |
| 11 | -elif command -v dnf &>/dev/null; then | |
| 12 | - INSTALL='sudo dnf install -y' | |
| 13 | -elif command -v brew &>/dev/null; then | |
| 14 | - INSTALL='brew install' | |
| 15 | -fi | |
| 16 | -echo "Using $INSTALL for installations" | |
| 17 | - | |
| 18 | -# Pass in command to invoke and installation name | |
| 19 | -install() { | |
| 20 | - if ! command -v "$1" &>/dev/null; then | |
| 21 | - echo -e "\e[33mInstalling $1 using '$INSTALL $2'\e[0m" | |
| 22 | - $INSTALL $2 | |
| 23 | - else | |
| 24 | - echo -e "\e[32m$1 is already installed. Skipping.\e[0m" | |
| 25 | - fi | |
| 3 | +BLA_clock=(๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐) | |
| 4 | + | |
| 5 | +animate() { | |
| 6 | + eval "$1" &>/tmp/last_output & | |
| 7 | + local pid=$! | |
| 8 | + local spin='-\|/' | |
| 9 | + local i=0 | |
| 10 | + while kill -0 $pid 2>/dev/null; do | |
| 11 | + for frame in "${BLA_clock[@]}"; do | |
| 12 | + printf "\r%s" "${frame}" | |
| 13 | + sleep 0.2 | |
| 14 | + done | |
| 15 | + done | |
| 16 | + printf "\r" | |
| 17 | + wait $pid | |
| 18 | + return $? | |
| 26 | 19 | } |
| 27 | 20 | |
| 28 | -# Pass in command to invoke and installation command | |
| 29 | -custominstall() { | |
| 30 | - if ! command -v "$1" &>/dev/null; then | |
| 31 | - echo -e "\e[33mInstalling $1 using $2\e[0m" | |
| 32 | - eval "$2" | |
| 33 | - else | |
| 34 | - echo -e "\e[32m$1 is already installed. Skipping.\e[0m" | |
| 35 | - fi | |
| 21 | +# Colored echos | |
| 22 | +echop() { | |
| 23 | + echo -e "\e[35m$1\e[0m" | |
| 24 | +} | |
| 25 | +echor() { | |
| 26 | + echo -e "\e[31m$1\e[0m" | |
| 27 | +} | |
| 28 | +echog() { | |
| 29 | + echo -e "\e[32m$1\e[0m" | |
| 30 | +} | |
| 31 | +echot() { | |
| 32 | + echo -e "\e[36m$1\e[0m" | |
| 33 | +} | |
| 34 | +echob() { | |
| 35 | + echo -e "\e[34$1\e[0m" | |
| 36 | 36 | } |
| 37 | 37 | |
| 38 | -# Install useful tools | |
| 39 | -install curl curl | |
| 40 | -install git git | |
| 41 | -install nvim neovim | |
| 42 | -install tmux tmux | |
| 43 | -install hostname inetutils | |
| 44 | -if command -v pacman &>/dev/null; then | |
| 45 | - install gh github-cli | |
| 46 | -else | |
| 47 | - install gh gh | |
| 48 | -fi | |
| 49 | -install crontab cronie | |
| 50 | -if command -v systemctl &>/dev/null; then | |
| 51 | - sudo systemctl enable --now cronie | |
| 52 | -fi | |
| 53 | -if command -v pacman &>/dev/null; then | |
| 54 | - install docker docker | |
| 55 | -else | |
| 56 | - custominstall docker 'curl -fsSL https://get.docker.com | sh' | |
| 57 | -fi | |
| 58 | -custominstall fnm 'curl -fsSL https://fnm.vercel.app/install | bash' | |
| 59 | -custominstall cargo "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh" && . "$HOME/.cargo/env" | |
| 60 | -custominstall lsd 'cargo install lsd' | |
| 61 | -custominstall lazygit 'go install github.com/jesseduffield/lazygit@latest' | |
| 62 | -if [ ! -d "$HOME/.fzf" ]; then | |
| 63 | - git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf | |
| 64 | - ~/.fzf/install | |
| 65 | -fi | |
| 38 | +# Select sudo or not | |
| 39 | +[ "$(whoami)" == "root" ] && prefix="" || prefix="sudo" | |
| 66 | 40 | |
| 67 | -# Initialize git setup | |
| 68 | -if [[ -z $(git config --global user.name) ]]; then | |
| 69 | - read -rp "Git username: " username </dev/tty | |
| 70 | - git config --global user.name "$username" | |
| 71 | -fi | |
| 72 | -if [[ -z $(git config --global user.email) ]]; then | |
| 73 | - read -rp "Git email: " email </dev/tty | |
| 74 | - git config --global user.email "$email" | |
| 75 | -fi | |
| 41 | +login_sudo() { | |
| 42 | + [ "$prefix" != "sudo" ] || sudo -v | |
| 43 | +} | |
| 76 | 44 | |
| 77 | -# Install dotzsh | |
| 78 | -read -rp "Are you sure you want to replace your current config? (y/n): " yn </dev/tty | |
| 79 | -if [[ "$yn" == "y" ]]; then | |
| 80 | - oldenv="$(cat "$HOME/.zshenv" 2>/dev/null)" | |
| 81 | - echo 'export ZDOTDIR=$HOME/.config/zsh' >"$HOME/.zshenv" | |
| 82 | - if cp -r "$HOME/.config/zsh" "$STORAGE/backup" &>/dev/null; then | |
| 83 | - echo "Stored $HOME/.config/zsh into $STORAGE/backup" | |
| 84 | - fi | |
| 85 | - rm -rf "$HOME/.config/zsh" &>/dev/null | |
| 86 | - if ! git clone https://github.com/huncholane/dotzsh "$HOME/.config/zsh" 2>/dev/null; then | |
| 87 | - echo "Clone failed" | |
| 88 | - if cp -r "$STORAGE/backup" "$HOME/.config/zsh" &>/dev/null; then | |
| 89 | - echo "Reverted $HOME/.config/zsh to original" | |
| 90 | - fi | |
| 91 | - else | |
| 92 | - echo "$oldenv" >"$HOME/.config/zsh/env.sh" | |
| 93 | - git clone --depth=1 https://github.com/mattmc3/antidote.git "$HOME/.config/zsh/.antidote" | |
| 94 | - fi | |
| 95 | -fi | |
| 45 | +echo "Ensuring base tools are installed." | |
| 96 | 46 | |
| 97 | -# Register update check cron job (every 6 hours) | |
| 98 | -CRON_CMD="0 */6 * * * $HOME/.config/zsh/updates.sh # dotzsh-update-check" | |
| 99 | -if ! crontab -l 2>/dev/null | grep -q "dotzsh/monitor_updates.sh"; then | |
| 100 | - ( | |
| 101 | - crontab -l 2>/dev/null | |
| 102 | - echo "$CRON_CMD" | |
| 103 | - ) | crontab - | |
| 104 | - echo "Registered update check cron job" | |
| 105 | -fi | |
| 47 | +# Install basic tools on debian | |
| 48 | +if [ -f /etc/debian_version ]; then | |
| 49 | + # Set the installer prefix | |
| 50 | + installer="$prefix apt-get" | |
| 51 | + install_cmd="$installer install -y" | |
| 52 | + | |
| 53 | + # Update system | |
| 54 | + echop "Detected Debian. Updating and upgrading now!" | |
| 55 | + animate "$installer update -y && $installer upgrade -y" | |
| 56 | + echog "โ System up to date!" | |
| 57 | + | |
| 58 | + # Install build essential | |
| 59 | + dpkg -s build-essential &>/dev/null || | |
| 60 | + { echo "Installing build-essential" && animate "$install_cmd build-essential" && printf "\e[1A\e[2K"; } || | |
| 61 | + { cat /tmp/last_output && echor "Failed to install build-essential" && exit 1; } | |
| 62 | + echog "โ build-essential installed" | |
| 63 | + | |
| 64 | +# Install basic tools for arch | |
| 65 | +elif [ -f /etc/arch-release ]; then | |
| 66 | + # Set pacman prefix | |
| 67 | + installer="$prefix pacman" | |
| 68 | + install_cmd="$installer -S --noconfirm" | |
| 69 | + | |
| 70 | + # Update system | |
| 71 | + echob "Arch Detected. You are elite. Updating and upgrading now!" | |
| 72 | + animate "$installer -Syu" | |
| 73 | + echog "โ System up to date!" | |
| 74 | + | |
| 75 | + # Install base-devel | |
| 76 | + pacman -Q base-devel &>/dev/null || | |
| 77 | + { echo "Installing base-devel" && animate "$installer base-devel" && printf "\e[1A\e[2K"; } || | |
| 78 | + { cat /tmp/last_output && echor "Failed to install base-devel"; } | |
| 79 | + echog "โ base-devel installed" | |
| 106 | 80 | |
| 107 | -# Arch specific installations | |
| 108 | -if [ -f /etc/arch-release ]; then | |
| 109 | - echo "Arch detected" | |
| 110 | 81 | # Install paru |
| 111 | - if ! command -v paru &>/dev/null; then | |
| 112 | - echo "Installing paru" | |
| 113 | - sudo pacman -S --needed base-devel | |
| 114 | - git clone https://aur.archlinux.org/paru.git /tmp/paru | |
| 115 | - (cd /tmp/paru && makepkg -si) | |
| 116 | - rm -rf /tmp/paru | |
| 117 | - fi | |
| 82 | + command -v paru &>/dev/null || | |
| 83 | + { echo "Installing paru" && animate "git clone https://aur.archlinux.org/paru.git /tmp/paru && | |
| 84 | + cd /tmp/paru && makepkg -si" && printf "\e[1A\e[2K"; } || | |
| 85 | + { cat /tmp/last_output && echor "Failed to install paru"; } | |
| 86 | + echog "โ paru installed" | |
| 118 | 87 | fi |
| 88 | + | |
| 89 | +# Install zsh | |
| 90 | +command -v zsh &>/dev/null || | |
| 91 | + { echo "Installing zsh" && animate "$install_cmd zsh" && printf "\e[1A\e[2K"; } || | |
| 92 | + { cat /tmp/last_output && echor "Failed to install zsh" && exit 1; } | |
| 93 | +echog "โ zsh installed" | |
| 94 | + | |
| 95 | +# Install curl (crazy but this happens sometimes) | |
| 96 | +command -v curl &>/dev/null || | |
| 97 | + { echo "Installing curl" && animate "$install_cmd curl" && printf "\e[1A\e[2K"; } || | |
| 98 | + { cat /tmp/last_output && echor "Failed to install curl"; } | |
| 99 | +echog "โ curl installed" | |
| 100 | + | |
| 101 | +# Install unzip | |
| 102 | +command -v unzip &>/dev/null || | |
| 103 | + { echo "Installing unzip" && animate "$install_cmd unzip" && printf "\e[1A\e[2K"; } || | |
| 104 | + { cat /tmp/last_output && echor "Failed to install unzip"; } | |
| 105 | +echog "โ unzip installed" | |
| 106 | + | |
| 107 | +# Install git | |
| 108 | +command -v git &>/dev/null || | |
| 109 | + { echo "Installing git" && animate "$install_cmd git" && printf "\e[1A\e[2K"; } || | |
| 110 | + { cat /tmp/last_output && echor "Failed to install git"; } | |
| 111 | +echog "โ git installed" | |
| 112 | + | |
| 113 | +# Install cargo | |
| 114 | +[ -f ~/.cargo/env ] || | |
| 115 | + { echo "Installing cargo" && animate "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y" && printf "\e[1A\e[2K"; } || | |
| 116 | + { cat /tmp/last_output && echor "Failed to install cargo" && exit 1; } | |
| 117 | +echog "โ cargo installed" | |
| 118 | +. ~/.cargo/env | |
| 119 | + | |
| 120 | +# Install lsd with cargo | |
| 121 | +command -v lsd &>/dev/null || | |
| 122 | + { echo "Installing lsd" && animate "cargo install lsd" && printf "\e[1A\e[2K"; } || | |
| 123 | + { cat /tmp/last_output && echor "Failed to install lsd" && exit 1; } | |
| 124 | +echog "โ lsd installed" | |
| 125 | + | |
| 126 | +# Install golang | |
| 127 | +export PATH=$PATH:/usr/local/go/bin:/usr/local/go/bin | |
| 128 | +latest_go_version="$(curl -fsSL "https://go.dev/VERSION?m=text" | head -1)" | |
| 129 | +filename="$latest_go_version.$([[ "$(uname -m)" == "Linux" ]] && { printf "linux"; } || printf "darwin").$(uname -m).tar.gz" | |
| 130 | +[[ "$(go version 2>/dev/null | awk '{print $3}')" == "$latest_go_version" ]] || | |
| 131 | + { login_sudo && echo "Installing golang" && animate "curl -fsSL https://go.dev/dl/go1.26.1.linux-amd64.tar.gz | $prefix tar xvzf - -C /usr/local" && printf "\e[1A\e[2K"; } || | |
| 132 | + { cat /tmp/last_output && echor "Failed to install go" && exit 1; } | |
| 133 | +echog "โ golang installed" | |
| 134 | + | |
| 135 | +# Install lazygit with go | |
| 136 | +command -v lazygit &>/dev/null || | |
| 137 | + { echo "Installing lazygit" && animate "go install github.com/jesseduffield/lazygit@latest" && printf "\e[1A\e[2K"; } || | |
| 138 | + { cat /tmp/last_output && echor "Failed to install lazygit" && exit 1; } | |
| 139 | +echog "โ lazygit installed" | |
| 140 | + | |
| 141 | +# Install yazi | |
| 142 | +filename="yazi-$(uname -m)-$( | |
| 143 | + { [[ "$(uname -s)" == "Linux" ]] && printf "unknown-linux-%s" "$(ldd --version 2>&1 | grep -qi musl && echo musl || echo gnu)"; } || printf "apple-darwin" | |
| 144 | +).zip" | |
| 145 | +[ -d /usr/local/yazi ] || | |
| 146 | + { login_sudo && echo "installing yazi" && animate "rm -rf /tmp/yazi* && $prefix rm -rf /usr/local/yazi && | |
| 147 | + curl -fsSL https://github.com/sxyazi/yazi/releases/download/v26.1.22/yazi-x86_64-unknown-linux-gnu.zip -o /tmp/yazi.zip && | |
| 148 | + unzip /tmp/yazi.zip -d /tmp && $prefix mv /tmp/yazi-x86_64-unknown-linux-gnu/ /usr/local/yazi/ && $prefix mv /usr/local/yazi/ya* /usr/local/bin" && | |
| 149 | + printf "\e[1A\e[2K"; } || | |
| 150 | + { cat /tmp/last_output && echor "Failed to install yazi" && exit 1; } | |
| 151 | +echog "โ yazi installed" | |
| 152 | + | |
| 153 | +# Create backups | |
| 154 | +[ -d ~/.config ] || mkdir -p ~/.config | |
| 155 | +[ -f ~/.zshrc ] && mv ~/.zshrc ~/.zshrc.bak && echot "Backup ~/.zshrc -> ~/.zshrc.bak" | |
| 156 | +[ -f ~/.zshenv ] && mv ~/.zshenv ~/.zshenv.bak && echot "Backup ~/.zshenv -> ~/.zshenv.bak" | |
| 157 | +[ -d ~/.config/zsh ] && rm -rf ~/.config/zsh.bak | |
| 158 | + | |
| 159 | +# Clone config repo | |
| 160 | +echo 'export ZDOTDIR=$HOME/.config/zsh' >~/.zshenv | |
| 161 | +{ echo "Cloning dotzsh" && animate "git clone https://github.com/huncholane/dotzsh ~/.config/zsh" && printf "\e[1A\e[2K"; } || | |
| 162 | + { cat /tmp/last_output && echor "Failed to clone dotzsh to ~/.config/zsh" && exit 1; } | |
| 163 | +export ZDOTDIR=$HOME/.config/zsh | |
| 164 | +echog "โ dotzsh installed" | |
| 165 | + | |
| 166 | +# Install antidote | |
| 167 | +[ -d ~/.config/zsh/.antidote ] || | |
| 168 | + { echo "Installing antidote" && animate "git clone --depth=1 https://github.com/mattmc3/antidote.git ${ZDOTDIR:-~}/.antidote" && printf "\e[1A\e[2K"; } || | |
| 169 | + { cat /tmp/last_output && echor "Failed to install antidote" && exit 1; } | |
| 170 | + | |
| 171 | +echot -e "\nRun 'exec zsh' to see the magic" | |
| 172 | + | |
| 173 | +# [ -f /etc/arch-release ] && pacman -Q base-devel &>/dev/null || sudo pacman -S base-devel || echo -e "\e[31mFailed to install base-devel" && exit 1 | |
| 174 | +# [ -f /etc/debian_version ] && (apt update dpkg -s build-essential &>/dev/null || echo "missing build-essential") | |
| 175 | + | |
| 176 | +# command -v zsh || sudo apt install zsh || sudo dnf install zsh || sudo pacman -S zsh |
+1-1precomp.sh
| @@ -13,7 +13,7 @@ add_completions _rustup 'rustup completions zsh' | ||
| 13 | 13 | add_completions _uv 'uv generate-shell-completion zsh' |
| 14 | 14 | |
| 15 | 15 | # Custom PATH additions |
| 16 | -export PATH="$PATH:$HOME/.local/bin:$HOME/go/bin" | |
| 16 | +export PATH="$PATH:$HOME/.local/bin:$HOME/go/bin:$HOME/.local/share/solana/install/active_release/bin:$HOME/.avm/bin:/usr/local/go/bin" | |
| 17 | 17 | |
| 18 | 18 | # Setup fzf env |
| 19 | 19 | [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh |