blob: 693ba6c9fa386b258409d5d6a7912fdfb76126fc (
plain) (
tree)
|
|
#!/usr/bin/env bash
#
# Author: Tom Ryder (@tejr) <tom@sanctum.geek.nz>
#
# This script installs @tejr's dotfiles in $HOME with symlinks into the
# expected $HOME/.dotfiles path.
#
# By default, it checks out all Git submodules, and links in configuration for
# Bash, cURL, Git, Vim, and some terminfo(5) definitions. You can supply
# additional flags to link in other configuration files:
#
# -d -- mysql(1), psql(1)
# -g -- GnuPG
# -m -- Mutt
# -n -- Ncmpcpp
# -r -- Newsbeuter
# -t -- tmux
# -x -- X11
#
# You should be prompted about replacing any file or directory that already
# exists. I have tried to make the function that does this relatively safe, but
# there are almost certainly edge cases where it might break things, especially
# on systems other than GNU/Linux or BSD.
#
# Run this at your own risk!
#
self=install
# Replace existing file with link if user confirms
lns() {
local file=$1 link=$2
if [[ -e $link ]]; then
read -p "$link already exists; remove? [y/N] " confirm
case $confirm in
y*|Y*)
rm -r -- "$link"
ln -s -- "$file" "$link"
return
;;
*)
return 1
;;
esac
else
ln -s -- "$file" "$link"
fi
return
}
# Bail if we don't have git(1)
if ! hash git 2>/dev/null; then
printf '%s: Could not find git(1)!\n' "$self" >&2
exit 1
fi
# Define dotfiles directory and check it exists
dotfiles=$HOME/.dotfiles
if ! [[ -d $dotfiles ]]; then
printf 'install: Could not find %s!\n' "$dotfiles" >&2
exit 1
fi
# Check out submodules
(cd -- "$dotfiles" && git submodule update --init)
# Link in essential logical binaries
mkdir -p -- "$HOME"/.local/bin
lns "$dotfiles"/ack/ack "$HOME"/.local/bin/ack
# Link in essential configuration files
mkdir -p -- "$HOME"/.config
lns "$dotfiles"/ack/ackrc "$HOME"/.ackrc
lns "$dotfiles"/bash/bash_completion "$HOME"/.config/bash_completion
lns "$dotfiles"/bash/bash_logout "$HOME"/.bash_logout
lns "$dotfiles"/bash/bash_profile "$HOME"/.bash_profile
lns "$dotfiles"/bash/bashrc "$HOME"/.bashrc
lns "$dotfiles"/bash/bashrc.d "$HOME"/.bashrc.d
lns "$dotfiles"/curl/curlrc "$HOME"/.curlrc
lns "$dotfiles"/git/gitconfig "$HOME"/.gitconfig
lns "$dotfiles"/readline/inputrc "$HOME"/.inputrc
lns "$dotfiles"/sh/profile "$HOME"/.profile
lns "$dotfiles"/sh/profile.d "$HOME"/.profile.d
lns "$dotfiles"/vim/vimrc "$HOME"/.vimrc
lns "$dotfiles"/vim "$HOME"/.vim
# Link in shell stuff
while getopts :dgmnrtx opt; do
case $opt in
# mysql(1), psql(1)
d)
lns "$dotfiles"/mysql/my.cnf "$HOME"/.my.cnf
lns "$dotfiles"/psql/psqlrc "$HOME"/.psqlrc
;;
# GnuPG
g)
mkdir -p -- "$HOME"/.gnupg
lns "$dotfiles"/gnupg/gpg.conf "$HOME"/.gnupg/gpg.conf
lns "$dotfiles"/gnupg/gpg-agent.conf "$HOME"/.gnupg/gpg-agent.conf
;;
# Mutt
m)
# Warn about some non-obvious dependencies if necessary
for depends in abook msmtp; do
if ! hash "$depends" 2>/dev/null; then
printf '%s: warning: %s(1) not found\n' \
"$self" "$depends" >&2
fi
done
# Link in files
lns "$dotfiles"/mutt/muttrc "$HOME"/.muttrc
lns "$dotfiles"/mutt "$HOME"/.mutt
# Create empty stubs if applicable
touch "$dotfiles"/mutt/{muttrc.local,signature}
# Create mailboxes and cache directories
mkdir -p "$HOME"/Mail/{inbox,sent} \
"$HOME"/.cache/mutt
;;
# Ncmcpp
n)
lns "$dotfiles"/ncmpcpp "$HOME"/.ncmpcpp
;;
# Newsbeuter
r)
mkdir -p -- "$HOME"/.config "$HOME"/.local/share/newsbeuter
lns "$dotfiles"/newsbeuter "$HOME"/.config/newsbeuter
;;
# Tmux
t)
lns "$dotfiles"/tmux/tmux.conf "$HOME"/.tmux.conf
;;
# X11
x)
lns "$dotfiles"/i3 "$HOME"/.i3
lns "$dotfiles"/urxvt "$HOME"/.urxvt
lns "$dotfiles"/X/Xmodmap "$HOME"/.Xmodmap
lns "$dotfiles"/X/Xresources "$HOME"/.Xresources
lns "$dotfiles"/X/xsession "$HOME"/.xsession
lns "$dotfiles"/X/xsessionrc "$HOME"/.xsessionrc
lns "$dotfiles"/vim/gvimrc "$HOME"/.gvimrc
;;
esac
done
shift $((OPTIND-1))
# Compile terminfo files
if hash tic 2>/dev/null; then
for info in "$dotfiles"/terminfo/*.info; do
tic "$info"
done
fi
|