dotfiles/install
2023-03-18 17:58:43 +03:00

218 lines
5.7 KiB
Bash
Executable File

#!/bin/bash
SANDBOX_PATH="/tmp/.dotfiles-install-$(date +%H-%M-%s)"
TARGET_PATH="$HOME"
SUB="$(pwd)/home/user"
_die() {
echo "$0: $1" >&2
exit $2
}
test "$0" = "./install" || _die "Error: Please, run this file from root of dotfiles, like this './install.sh install TARGET" 1
_die_if_installed() {
if [ -e "$1" ]; then
_die "Already installed" 1
fi
}
_link_files_in_sandbox() {
mkdir "$SANDBOX_PATH"
for target in "$@"; do
echo "installing: $target"
if [ ! "$(dirname "$target")" = "." ]; then
mkdir -p "$SANDBOX_PATH/$(dirname "$target")"
fi
ln -sT "$SUB/$target" "$SANDBOX_PATH/$target"
done
}
_compare_sandbox_to_home() {
local comparisons="$(diff -rq "$SANDBOX_PATH" "$TARGET_PATH")"
echo "$comparisons" | grep -vE "^Only in .+"
}
_merge_sandbox_to_home() {
cp -RTnP "$SANDBOX_PATH" "$TARGET_PATH"
}
__install_from_sandbox() {
local comparisons="$(_compare_sandbox_to_home)"
if [ -n "$comparisons" ]; then
echo "$comparisons" >&2
echo "Reverting..." >&2
rm -rf "$SANDBOX_PATH"
_die "Found conflicting files. Exiting" 1
fi
echo "Merging to home..."
_merge_sandbox_to_home
rm -rf "$SANDBOX_PATH"
}
cmd_bash() {
_link_files_in_sandbox ".subbash" ".bashrc" ".profile"
__install_from_sandbox
}
cmd_zsh() {
_link_files_in_sandbox ".subbash" ".subzsh" ".zshrc" ".zprofile" ".zfunc" ".zlogout"
mkdir "$SANDBOX_PATH/.subzsh/plugins"
git clone https://github.com/zsh-users/zsh-autosuggestions "$SANDBOX_PATH/.subzsh/plugins/zsh-autosuggestions"
git clone https://github.com/zsh-users/zsh-syntax-highlighting "$SANDBOX_PATH/.subzsh/plugins/zsh-syntax-highlighting"
git clone https://github.com/hlissner/zsh-autopair "$SANDBOX_PATH/.subzsh/plugins/hlissner/zsh-autopair"
git clone https://github.com/unixorn/fzf-zsh-plugin.git "$SANDBOX_PATH/.subzsh/plugins/unixorn/fzf-zsh-plugin" && \
mkdir -p "$SANDBOX_PATH/.local/bin" && \
ln -s "$SANDBOX_PATH"/.subzsh/plugins/unixorn/fzf-zsh-plugin/bin/* "$SANDBOX_PATH/.local/bin"
__install_from_sandbox
}
cmd_tmux() {
_link_files_in_sandbox ".tmux.conf"
__install_from_sandbox
}
cmd_alacritty() {
_link_files_in_sandbox ".config/alacritty"
__install_from_sandbox
}
cmd_nvim() {
echo "sudo pacman -S npm ctags fzf glow; mkdir ~/.npm-global; npm config set prefix '~/.npm-global'"
_link_files_in_sandbox ".config/nvim" ".local/bin/vim_askpass_helper" ".local/bin/vim_askpass_helper_python"
__install_from_sandbox
nvim +Lazy
}
cmd_ssh() {
cat "$SUB/.ssh/config" >> "$HOME/.ssh/config"
}
cmd_git() {
_link_files_in_sandbox ".gitconfig" ".githooks" ".gitignore"
__install_from_sandbox
}
cmd_ranger() {
echo "sudo pacman -S highlight ttf-joypixels noto-fonts-emoji ueberzug poppler"
_link_files_in_sandbox ".config/ranger"
mkdir -p "$SANDBOX_PATH/.config/ranger/plugins"
git clone https://github.com/alexanderjeurissen/ranger_devicons "$SANDBOX_PATH/.config/ranger/plugins/ranger_devicons"
__install_from_sandbox
ranger --copy-config=all
}
cmd_gpg() {
_die_if_installed "$HOME/.gnupg"
cat "$SUB/.gnupg/gpg.conf" >> "$HOME/.gnupg/gpg.conf"
echo -e "default-cache-ttl 1\nmax-cache-ttl 1" > "$HOME/.gnupg/gpg-agent.conf"; echo RELOADAGENT | gpg-connect-agent
}
cmd_i3() {
echo "sudo pacman -S nitrogen picom compton ttf-font-awesome xdotool xclip maim"
_link_files_in_sandbox ".config/i3" ".config/i3status" ".local/bin/i3status_wrapper"
__install_from_sandbox
}
cmd_bat() {
_link_files_in_sandbox ".config/bat"
__install_from_sandbox
}
cmd_ipython() {
local sub=".ipython"
_die_if_installed "$HOME/$sub"
mkdir -p "$HOME/$sub/profile_default"
ln -s "$SUB/$sub/profile_default/ipython_config.py" "$HOME/$sub/profile_default/ipython_config.py"
}
cmd_font() {
local sub="$HOME/.local/share/fonts"
mkdir -p "$sub"
cd "$sub"
wget 'https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/FiraCode.zip'
unzip FiraCode.zip -d "$sub"
git clone 'https://github.com/powerline/fonts.git' --depth=1
cd fonts
./install.sh
}
cmd_termux() {
echo "apt install termux-api tsu"
}
cmd_arch() {
echo 'echo "ParallelDownloads = 5" >> /etc/pacman.conf'
}
cmd_psql() {
_link_files_in_sandbox ".psqlrc"
__install_from_sandbox
}
cmd_unlink() {
#####################################################
return 0
}
cmd_no_target() {
_die "TARGET not exists" 1
}
cmd_install() {
for target in "$@"; do
case "$target" in
bash) shift; cmd_bash "$@" ;;
zsh) shift; cmd_zsh "$@" ;;
tmux) shift; cmd_tmux "$@" ;;
alacritty) shift; cmd_alacritty "$@" ;;
nvim) shift; cmd_nvim "$@" ;;
ssh) shift; cmd_ssh "$@" ;;
git) shift; cmd_git "$@" ;;
ranger) shift; cmd_ranger "$@" ;;
gpg) shift; cmd_gpg "$@" ;;
i3) shift; cmd_i3 "$@" ;;
bat) shift; cmd_bat "$@" ;;
font) shift; cmd_font "$@" ;;
termux) shift; cmd_termux "$@" ;;
arch) shift; cmd_arch "$@" ;;
psql) shift; cmd_psql "$@" ;;
*) shift; cmd_no_target "$@" ;;
esac
done
}
cmd_help() {
echo "Dotfiles installation script:
Usage: ./install.sh install TARGET...
Usage: ./install.sh unlink TARGET"
}
case "$1" in
install) shift; cmd_install "$@" ;;
unlink) shift; cmd_unlink "$@" ;;
help) shift; cmd_help "$@" ;;
*) shift; cmd_help "$@" ;;
esac
exit 0