You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
8.1 KiB
213 lines
8.1 KiB
#!/usr/bin/env bash
|
|
|
|
declare -r XDG_DATA_HOME="${XDG_DATA_HOME:-"$HOME/.local/share"}"
|
|
declare -r XDG_CACHE_HOME="${XDG_CACHE_HOME:-"$HOME/.cache"}"
|
|
declare -r XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"$HOME/.config"}"
|
|
|
|
DOOM_REPO_URL="https://github.com/doom-neovim/doom-nvim"
|
|
declare -r DOOM_CONFIG_DIR="${DOOM_CONFIG_DIR:-"$XDG_CONFIG_HOME/nvim"}"
|
|
|
|
declare BASEDIR
|
|
BASEDIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
|
|
BASEDIR="$(dirname -- "$(dirname -- "$BASEDIR")")"
|
|
readonly BASEDIR
|
|
|
|
RED=$(tput setaf 1)
|
|
YELLOW=$(tput setaf 3)
|
|
GREEN=$(tput setaf 2)
|
|
NC=$(tput sgr0) # No Color
|
|
|
|
function help() {
|
|
echo "Usage: install.sh [<options>]"
|
|
echo "Automatically installs doom-nvim to your machine."
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -h, --help Print this message"
|
|
echo " -y, --yes Skip all prompts"
|
|
}
|
|
|
|
declare -a system_dependencies=("nvim" "git" "node" "npm" "fd;optional" "rg;optional" "wget;optional" "unzip;optional")
|
|
declare -a npm_dependencies=("tree-sitter")
|
|
|
|
function banner() {
|
|
echo " "
|
|
echo "================= =============== =============== ======== ========"
|
|
echo "\\\\ . . . . . . .\\\\ //. . . . . . .\\\\ //. . . . . . .\\\\ \\\\. . .\\\\// . . //"
|
|
echo "||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\\/ . . .||"
|
|
echo "|| . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||"
|
|
echo "||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||"
|
|
echo "|| . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\\ . . . . ||"
|
|
echo "||. . || ||-' || || \`-|| || . .|| ||. . || ||-' || || \`|\\_ . .|. .||"
|
|
echo "|| . _|| || || || || ||_ . || || . _|| || || || |\\ \`-_/| . ||"
|
|
echo "||_-' || .|/ || || \\|. || \`-_|| ||_-' || .|/ || || | \\ / |-_.||"
|
|
echo "|| ||_-' || || \`-_|| || || ||_-' || || | \\ / | \`||"
|
|
echo "|| \`' || || \`' || || \`' || || | \\ / | ||"
|
|
echo "|| .===' \`===. .==='.\`===. .===' /==. | \\/ | ||"
|
|
echo "|| .==' \\_|-_ \`===. .===' _|_ \`===. .===' _-|/ \`== \\/ | ||"
|
|
echo "|| .==' _-' \`-_ \`=' _-' \`-_ \`=' _-' \`-_ /| \\/ | ||"
|
|
echo "|| .==' _-' \`-__\\._-' \`-_./__-' \`' |. /| | ||"
|
|
echo "||.==' _-' \`' | /==.||"
|
|
echo "==' _-' N E O V I M \\/ \`=="
|
|
echo "\\ _-' \`-_ /"
|
|
echo " \`'' \`\`' "
|
|
}
|
|
|
|
function executable_exists () {
|
|
if ! command -v "$1" &>/dev/null; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
function check_dependency_group () {
|
|
local dependency_group_name=$1
|
|
local install_message=$2
|
|
shift
|
|
shift
|
|
echo "Checking $dependency_group_name dependencies..."
|
|
local missing_dependencies=0
|
|
for i in "$@"; do
|
|
# The recommended changes break the string splitting
|
|
# shellcheck disable=2206
|
|
local split_result=(${i//;/ })
|
|
local executable="${split_result[0]}"
|
|
local optional=${split_result[1]}
|
|
|
|
executable_exists "${executable}"
|
|
local dependency_status=$?
|
|
|
|
if [ $dependency_status -eq 1 ]; then
|
|
echo "$GREEN [*]$NC Found \"$executable\"."
|
|
else
|
|
missing_dependencies=1
|
|
if [ "$optional" = "optional" ]; then
|
|
echo "$YELLOW [ ]$NC Could not find optional dependency \"$executable\"."
|
|
else
|
|
echo "$RED [ ]$NC Could not find dependency \"$executable\"."
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ $missing_dependencies -eq 1 ]; then
|
|
echo "Missing dependencies detected. Optional dependencies can be ignored but may be necessary for some modules."
|
|
echo "$install_message"
|
|
fi
|
|
echo " "
|
|
}
|
|
|
|
function check_doom_installed() {
|
|
doom_backed_up=0
|
|
|
|
if [ -d "${DOOM_CONFIG_DIR}/lua/doom" ]; then
|
|
echo "${YELLOW}Warning:$NC Doom nvim is already installed on your system."
|
|
echo " "
|
|
echo "Do you want to continue installing doom-nvim? (y/n)"
|
|
echo "Note: the old config will be backed up to ${XDG_CONFIG_HOME}/doom-nvim-old"
|
|
echo ""
|
|
read -p "" -n 1 -r
|
|
echo " " # (optional) move to a new line
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
doom_backed_up=1
|
|
# If doom-nvim-old directory doesn't exist, move 'nvim/' to 'doom-nvim-old/'
|
|
if [ ! -d "${XDG_CONFIG_HOME}/doom-nvim-old" ]; then
|
|
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/doom-nvim-old"
|
|
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/doom-nvim-old\`"
|
|
else
|
|
# If it already exists try placing it in 'doom-nvim-old-1/' then 'doom-nvim-old-2' (up until 10)
|
|
local i=1
|
|
local has_found_directory=0
|
|
while [[ $has_found_directory -eq 0 && $i -lt 10 ]]; do
|
|
i=$((i+1))
|
|
if [ ! -d "${XDG_CONFIG_HOME}/doom-nvim-old-${i}" ]; then
|
|
has_found_directory=1
|
|
fi
|
|
done
|
|
|
|
if [[ $has_found_directory -eq 1 ]]; then
|
|
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/doom-nvim-old-${i}"
|
|
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/doom-nvim-old-${i}\`"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
echo " "
|
|
}
|
|
|
|
function backup_existing_config() {
|
|
if [ -d "$DOOM_CONFIG_DIR" ]; then
|
|
echo "${YELLOW}Warning:$NC There is already a config at $DOOM_CONFIG_DIR."
|
|
echo " "
|
|
echo "Do you want to continue installing doom-nvim? (y/n)"
|
|
echo "Note: The old config will be backed up to ${XDG_CONFIG_HOME}/nvim-old"
|
|
echo " "
|
|
read -p "" -n 1 -r
|
|
echo " " # (optional) move to a new line
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
# If nvim-old directory doesn`t exist, move `nvim/` to `nvim-old/'
|
|
if [ ! -d "${XDG_CONFIG_HOME}/nvim-old" ]; then
|
|
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/nvim-old"
|
|
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/nvim-old\`"
|
|
else
|
|
# If it already exists try placing it in `nvim-old-1/` then `nvim-old-2/` (up until 10)
|
|
local i=1
|
|
local has_found_directory=0
|
|
while [[ $has_found_directory -eq 0 && $i -lt 10 ]]; do
|
|
i=$((i+1))
|
|
if [ ! -d "${XDG_CONFIG_HOME}/nvim-old-${i}" ]; then
|
|
has_found_directory=1
|
|
fi
|
|
done
|
|
|
|
if [[ $has_found_directory -eq 1 ]]; then
|
|
mv "${XDG_CONFIG_HOME}/nvim" "${XDG_CONFIG_HOME}/nvim-old-${i}"
|
|
echo "Moved old config from \`${XDG_CONFIG_HOME}/nvim\` to \`${XDG_CONFIG_HOME}/nvim-old-${i}\`"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
echo " "
|
|
}
|
|
|
|
function install_doom_nvim() {
|
|
echo "Cloning..."
|
|
git clone "$DOOM_REPO_URL" "${DOOM_CONFIG_DIR}" --depth=10
|
|
cd "${DOOM_CONFIG_DIR}" || exit
|
|
# Setup user with their own custom branch
|
|
git checkout -b my-config
|
|
|
|
# Checkout the latest version if there are no uncommitted changes
|
|
# NOTE: There shouldn't ever be uncommitted changes on a freshly cloned repo
|
|
# but I still don't want to risk the possibility of destroying someone's code.
|
|
local is_dirty=0
|
|
git diff-index --quiet HEAD -- || is_dirty=1;
|
|
|
|
echo " "
|
|
if [ $is_dirty -eq 0 ]; then
|
|
local tag
|
|
tag="$(git tag -l --sort -version:refname | head -n 1)"
|
|
git reset --hard "$tag"
|
|
echo "${GREEN}Installed doom-nvim ${tag}!"
|
|
else
|
|
echo "${GREEN}Installed doom-nvim!"
|
|
echo "${YELLOW}Warn: Could not checkout latest tag due to uncommitted changes. \`:DoomUpdate\` command may not work."
|
|
fi
|
|
}
|
|
|
|
function main() {
|
|
banner
|
|
|
|
check_dependency_group "system" "Install missing dependencies using your operating system's package manager (brew/pacman/apt-get/dnf/...)." "${system_dependencies[@]}"
|
|
check_dependency_group "npm" "Install missing dependencies using npm/yarn/pnpm." "${npm_dependencies[@]}"
|
|
|
|
check_doom_installed
|
|
|
|
if [ $doom_backed_up -eq 0 ]; then
|
|
backup_existing_config
|
|
fi
|
|
|
|
install_doom_nvim
|
|
|
|
echo "Run \`nvim\` in your terminal to start doom-nvim."
|
|
}
|
|
|
|
main "$@"
|
|
|