#!/bin/sh set -e DOTFILES="$(dirname "$(realpath "$0")")" TARGET="$HOME" [ -r "$DOTFILES/config.local" ] && . "$DOTFILES/config.local" GIT_USER="${GIT_USER:-Fernando Schauenburg}" GIT_EMAIL="${GIT_EMAIL:-fernando@schauenburg.me}" main() { IS_DRY_RUN=yes while getopts 'fht:' opt; do case "$opt" in f) unset IS_DRY_RUN;; t) TARGET="$OPTARG";; h) usage; exit 0;; *) usage; exit 1;; esac done greeting make_dirs stow_home link_config git_user_config nvim_plugins } greeting() { dry_run && { warn "Performing dry run (use -f to actually make changes)." warn } info "Deploying dotfiles:" info " Source: $cyan$DOTFILES$rst" info " Target: $cyan$TARGET$rst" info " Git user: $yellow$GIT_USER <$GIT_EMAIL>$rst" if [ -t 0 -a -t 1 ]; then info info "Press ENTER to continue (CTRL-C to cancel)..." read k fi } make_dirs() { heading 'create auxiliary directories' while read item; do dir="$TARGET/$item" if [ ! -d "$dir" ]; then echo "${yellow}MKDIR:$rst $dir" dry_run || mkdir -p "$dir" fi done <$rst $dotfiles_config" dry_run || ln -s "$dotfiles_config" "$link" fi } stow_home() { heading 'stow home directory' stow -v${IS_DRY_RUN:+n} --no-folding -d "$DOTFILES" -t "$TARGET" home 2>&1 \ | sed -E -e "s/^([^:]+:)/$yellow\1$rst/" -e "s/=>/$blue=>$rst/" } git_user_config() { heading 'git user configuration' config_file="$TARGET/.local/etc/git/config.user" temp_git="$(mktemp)" cat >"$temp_git" </dev/null 2>&1; then echo "${yellow}OVERWRITE:$rst $config_file with $temp_git:" echo "$cyan" cat "$temp_git" echo "$rst" dry_run || cp -f "$temp_git" "$config_file" fi } nvim_plugins() { heading 'nvim plugins' if command -v nvim >/dev/null 2>&1; then dry_run || { warn "installing neovim plugins..." nvim --headless -c 'autocmd User PackerComplete quitall' -c 'PackerSync' } else error "neovim is not installed; skipping plugin installation..." fi } ############################################################################### # Helper Functions ############################################################################### if [ -t 1 ]; then rst=$(tput sgr0) red=$(tput setaf 1) green=$(tput setaf 2) yellow=$(tput setaf 3) blue=$(tput setaf 4) magenta=$(tput setaf 5) cyan=$(tput setaf 6) else rst='' red='' green='' yellow='' blue='' magenta='' cyan='' fi dry_run() { [ -n "$IS_DRY_RUN" ]; } usage() { echo "Usage: $(basename $0) [-h] [-f] [-t ]" echo "" echo " -h print this help and exit" echo " -f modify filesystem rather than dry run" echo " -t set directory (default: \$HOME)" } heading() { printf '%s\n' "${blue}===== $1 ==========${rst}"; } info() { printf '%s ' "$@"; printf '\n'; } warn() { printf '%s ' "${yellow}$@${rst}"; printf '\n'; } error() { printf '%s ' "${red}$@${rst}"; printf '\n'; } main "$@"