atuin/install.sh

231 lines
6.6 KiB
Bash
Executable File

#! /usr/bin/env bash
if [[ "${BASH_VERSION%%.*}" -eq 3 ]]; then
echo "Atuin has limited support for Bash 3.2. The Atuin config enter_accept cannot be turned off." >&2
echo "To turn off enter_accept, please upgrade your version of bash (possibly via homebrew or ports)" >&2
fi
set -euo pipefail
cat << EOF
_______ _______ __ __ ___ __ _
| _ || || | | || | | | | |
| |_| ||_ _|| | | || | | |_| |
| | | | | |_| || | | |
| | | | | || | | _ |
| _ | | | | || | | | | |
|__| |__| |___| |_______||___| |_| |__|
Magical shell history
Atuin setup
https://github.com/atuinsh/atuin
Please file an issue if you encounter any problems!
===============================================================================
EOF
if ! command -v curl &> /dev/null; then
echo "curl not installed. Please install curl."
exit
elif ! command -v sed &> /dev/null; then
echo "sed not installed. Please install sed."
exit
fi
LATEST_RELEASE=$(curl -L -s -H 'Accept: application/json' https://github.com/atuinsh/atuin/releases/latest)
# Allow sed; sometimes it's more readable than ${variable//search/replace}
# shellcheck disable=SC2001
LATEST_VERSION=$(echo "$LATEST_RELEASE" | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
__atuin_install_arch(){
echo "Arch Linux detected!"
if command -v pacman &> /dev/null
then
echo "Installing with pacman"
sudo pacman -S atuin
else
echo "Attempting AUR install"
if command -v paru &> /dev/null; then
echo "Found paru"
paru -S atuin
elif command -v yaourt &> /dev/null; then
echo "Found yaourt"
yaourt -S atuin
elif command -v yay &> /dev/null; then
echo "Found yay"
yay -S atuin
elif command -v pakku &> /dev/null; then
echo "Found pakku"
pakku -S atuin
elif command -v pamac &> /dev/null; then
echo "Found pamac"
pamac install atuin
else
echo "Failed to install atuin! Please try manually: https://aur.archlinux.org/packages/atuin-git/"
fi
fi
}
__atuin_install_deb_based(){
if [ "$(dpkg --print-architecture)" = "amd64" ]; then
echo "Detected distro: $OS"
ARTIFACT_URL="https://github.com/atuinsh/atuin/releases/download/$LATEST_VERSION/atuin_${LATEST_VERSION//v/}_amd64.deb"
TEMP_DEB="$(mktemp)".deb &&
curl -Lo "$TEMP_DEB" "$ARTIFACT_URL"
if command -v sudo &> /dev/null; then
sudo apt install "$TEMP_DEB"
else
su -l -c "apt install '$TEMP_DEB'"
fi
rm -f "$TEMP_DEB"
else
echo "$OS detected, but not amd64"
__atuin_install_unsupported
fi
}
__atuin_install_linux(){
echo "Detected Linux!"
echo "Checking distro..."
if (uname -a | grep -qi "Microsoft"); then
OS="ubuntuwsl"
elif ! command -v lsb_release &> /dev/null; then
echo "lsb_release could not be found. Falling back to /etc/os-release"
OS="$(grep -Po '(?<=^ID=).*$' /etc/os-release | tr '[:upper:]' '[:lower:]')" 2>/dev/null
else
OS=$(lsb_release -i | awk '{ print $3 }' | tr '[:upper:]' '[:lower:]')
fi
case "$OS" in
"arch" | "manjarolinux" | "endeavouros")
__atuin_install_arch;;
"ubuntu" | "ubuntuwsl" | "debian" | "linuxmint" | "parrot" | "kali" | "elementary" | "pop" | "neon" | "tuxedo")
__atuin_install_deb_based;;
*)
# TODO: download a binary or smth
__atuin_install_unsupported;;
esac
}
__atuin_install_mac(){
echo "Detected Mac!"
if command -v brew &> /dev/null
then
echo "Installing with brew"
brew install atuin
else
echo "Could not find brew, installing with Cargo"
__atuin_install_unsupported
fi
}
__atuin_install_termux(){
echo "Termux detected!"
if command -v pkg &> /dev/null; then
echo "Installing with pkg"
pkg install atuin
else
echo "Could not find pkg"
__atuin_install_unsupported
fi
}
__atuin_install_cargo(){
echo "Attempting install with cargo"
if ! command -v cargo &> /dev/null
then
echo "cargo not found! Attempting to install rustup"
if command -v rustup &> /dev/null
then
echo "rustup was found, but cargo wasn't. Something is up with your install"
exit 1
fi
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -q
echo "rustup installed! Attempting cargo install"
fi
# Log cargo and rustc versions for support
cargo --version
rustc --version
cargo install atuin
}
__atuin_install_unsupported(){
echo "Unknown or unsupported OS or architecture"
echo "Please check the README at https://github.com/atuinsh/atuin for manual install instructions"
echo "If you have any problems, please open an issue!"
while true; do
read -r -p "Do you wish to attempt an install with 'cargo'? [Y/N] " yn
case $yn in
[Yy]* ) __atuin_install_cargo; break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no.";;
esac
done
}
# TODO: would be great to support others!
case "$OSTYPE" in
linux-android*) __atuin_install_termux ;;
linux*) __atuin_install_linux ;;
darwin*) __atuin_install_mac ;;
msys*) __atuin_install_unsupported ;;
solaris*) __atuin_install_unsupported ;;
bsd*) __atuin_install_unsupported ;;
*) __atuin_install_unsupported ;;
esac
# TODO: Check which shell is in use
# Use of single quotes around $() is intentional here
# shellcheck disable=SC2016
if ! grep -q "atuin init zsh" "${ZDOTDIR:-$HOME}/.zshrc"; then
printf '\neval "$(atuin init zsh)"\n' >> "${ZDOTDIR:-$HOME}/.zshrc"
fi
# Use of single quotes around $() is intentional here
# shellcheck disable=SC2016
if ! grep -q "atuin init bash" ~/.bashrc; then
curl https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh -o ~/.bash-preexec.sh
printf '\n[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh\n' >> ~/.bashrc
echo 'eval "$(atuin init bash)"' >> ~/.bashrc
fi
cat << EOF
_______ __ __ _______ __ _ ___ _ __ __ _______ __ __
| || | | || _ || | | || | | | | | | || || | | |
|_ _|| |_| || |_| || |_| || |_| | | |_| || _ || | | |
| | | || || || _| | || | | || |_| |
| | | || || _ || |_ |_ _|| |_| || |
| | | _ || _ || | | || _ | | | | || |
|___| |__| |__||__| |__||_| |__||___| |_| |___| |_______||_______|
Thanks for installing Atuin! I really hope you like it.
If you have any issues, please open an issue on GitHub or visit our Discord (https://discord.gg/jR3tfchVvW)!
If you love Atuin, please give us a star on GitHub! It really helps ⭐️ https://github.com/atuinsh/atuin
Please run "atuin register" to get setup with sync, or "atuin login" if you already have an account
EOF