#!/usr/bin/env bash # # bootstrap installs things. cd "$(dirname "$0")/.." DOTFILES_ROOT=$(pwd -P) set -e echo '' info () { printf "\r [ \033[00;34m..\033[0m ] $1\n" } user () { printf "\r [ \033[0;33m??\033[0m ] $1\n" } success () { printf "\r\033[2K [ \033[00;32mOK\033[0m ] $1\n" } fail () { printf "\r\033[2K [\033[0;31mFAIL\033[0m] $1\n" echo '' exit } setup_gitconfig () { if ! [ -f git/gitconfig.symlink ] then info 'setup gitconfig' git_credential='cache --timeout=3600' if [ "$(uname -s)" == "Darwin" ] then git_credential='osxkeychain' fi user ' - What is your github author name?' read -e git_authorname user ' - What is your github author email?' read -e git_authoremail sed -e "s/AUTHORNAME/$git_authorname/g" -e "s/AUTHOREMAIL/$git_authoremail/g" -e "s/GIT_CREDENTIAL_HELPER/$git_credential/g" git/gitconfig.symlink.example > git/gitconfig.symlink success 'gitconfig' fi } link_directory () { local src=$1 dst=$2 local overwrite= backup= skip= remove= local action= if [ -f "$dst" -o -L "$dst" ] then if [ "$overwrite_all" == "false" ] && [ "$backup_all" == "false" ] && [ "$skip_all" == "false" ] then user "Directory already exists: $dst ($(basename "$src")), what do you want to do?\n\ [s]kip, [r]emove, [b]ackup?" read -n 1 action case "$action" in s ) skip=true;; r ) remove=true;; b ) backup=true;; * ) ;; esac fi skip=${skip:-$skip_all} backup=${backup:-$backup_all} if [ "$remove" == "true" ] then rm -rf "$dst" success "removed $dst" fi if [ "$backup" == "true" ] then mv "$dst" "${dst}.backup" success "moved $dst to ${dst}.backup" fi if [ "$skip" == "true" ] then success "skipped $src" fi fi if [ "$skip" != "true" ] then mkdir -p "$dst" for f in "$src"/* do this_dst="$dst/$(basename "$f")" link "$f" "$this_dst" done fi } link_file () { local src=$1 dst=$2 local overwrite= backup= skip= local action= if [ -f "$dst" -o -d "$dst" -o -L "$dst" ] then if [ "$overwrite_all" == "false" ] && [ "$backup_all" == "false" ] && [ "$skip_all" == "false" ] then local currentSrc="$(readlink $dst)" if [ "$currentSrc" == "$src" ] then skip=true; else user "File already exists: $dst ($(basename "$src")), what do you want to do?\n\ [s]kip, [S]kip all, [o]verwrite, [O]verwrite all, [b]ackup, [B]ackup all?" read -n 1 action case "$action" in o ) overwrite=true;; O ) overwrite_all=true;; b ) backup=true;; B ) backup_all=true;; s ) skip=true;; S ) skip_all=true;; * ) ;; esac fi fi overwrite=${overwrite:-$overwrite_all} backup=${backup:-$backup_all} skip=${skip:-$skip_all} if [ "$overwrite" == "true" ] then rm -rf "$dst" success "removed $dst" fi if [ "$backup" == "true" ] then mv "$dst" "${dst}.backup" success "moved $dst to ${dst}.backup" fi if [ "$skip" == "true" ] then success "skipped $src" fi fi if [ "$skip" != "true" ] # "false" or empty then ln -s "$1" "$2" success "linked $1 to $2" fi } link () { local src=$1 dst=$2 if [ -f "$src" ] then link_file "$src" "$dst" elif [ -d "$src" ] then link_directory "$src" "$dst" fi } install_dotfiles () { info 'installing dotfiles' local overwrite_all=false backup_all=false skip_all=false for src in $(find -H "$DOTFILES_ROOT" -maxdepth 2 -name '*.symlink') do dst="$HOME/.$(basename "${src%.*}")" link "$src" "$dst" done } setup_gitconfig install_dotfiles ln -s "$DOTFILES_ROOT/bin" "$HOME/bin" # If we're on a Mac, let's install and setup homebrew. if [ "$(uname -s)" == "Darwin" ] then info "installing dependencies" if source bin/dot > /tmp/dotfiles-dot 2>&1 then success "dependencies installed" else fail "error installing dependencies" fi fi echo '' echo ' All installed!'