Dotfiles
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.
 
 
 
 
 
 

170 lines
4.5 KiB

#!/bin/zsh
# .files/installer
# (c) 2014 MORI Taeyeon
# Paths & Utils
DOT="$(realpath "$(dirname "$0")")"
cd "$DOT"
setopt EXTENDED_GLOB
source "$DOT/lib/libzsh-utils.zsh"
# Parse commandline
OVERWRITE=false
ASK=true
function print_usage() {
echo "Usage: $1 [--help] [--overwrite] [--dont-ask]"
echo
echo "Install Tae's dotfiles"
echo
echo "Parameters:"
echo " -h, --help Display this help message"
echo " --overwrite Just overwrite existing dotfiles"
echo " --dont-ask Don't ask questions. Use default values"
}
for arg in "$@"; do
[[ -z "$STATE" ]] && {
case "$arg" in
-h|--help) print_usage "$0"; exit 0;;
--overwrite) OVERWRITE=true;;
--dont-ask) ASK=false;;
*) print_usage "$0"; exit 1;;
esac
} || {
case "$STATE" in
# handle options with parameters
esac
STATE=
}
done
[[ -n "$STATE" ]] && err "Option $STATE is missing it's parameter!" && exit 1
# Helper functions
function generate() {
[[ -e "$1" ]] && ! $OVERWRITE && ! grep -q "Generated by .files/install" "$1" && \
err "Custom version of $1 detected. Please delete it before running .files/install" && exit 1
echo "${2-#} Generated by .files/install" >"$1"
echo "${2-#} `date "+%m/%d/%Y %H:%M:%S"`" >>"$1"
echo >>"$1"
cat >>"$1"
}
function relink() {
[[ ! -e "$1" ]] && err "No such file or directory: '$1'" && return 1
[[ -L "$2" ]] && rm -f "$2"
[[ -e "$2" ]] && ! $OVERWRITE && err "File already exists and isn't a symbolic link: '$2'" && return 1
color 31 ln -s "$(relpath "$1" "$(dirname "$2")")" "$2"
}
# Update git modules
msg "Updating git submodules..."
git submodule update --init --recursive
# Ask questions about user
$ASK && msg "Asking questions..." || err "Not asking any questions:"
[[ -e "$DOT/etc/user-info" ]] && source "$DOT/etc/user-info"
[[ -z "$REALNAME" ]] && REALNAME=`grep "^$USER:[^:]*:$UID:" /etc/passwd | cut -d: -f5 | cut -d, -f1`
if $ASK; then
ask " Real name" REALNAME
ask " E-Mail address" EMAIL
else
color 36 echo " default REALNAME=\"$REALNAME\""
color 36 echo " default EMAIL=\"$EMAIL\""
fi
color 32 echo " Writing etc/user-info"
generate "$DOT/etc/user-info" <<EOF
REALNAME="$REALNAME"
EMAIL="$EMAIL"
EOF
# Setup dotfiles
msg "Linking dotfiles..."
for file in "$DOT/dotfiles"/*; do
NAM="${file:t}"
color 32 echo " Adding .$NAM"
relink "$file" "$HOME/.$NAM"
done
# Setup .config
: ${XDG_CONFIG_HOME:=~/.config}
msg "Linking .config files... ($XDG_CONFIG_HOME)"
(
cd "$DOT/config"
for dir in $(find . -type d); do
if [ ! -d "$XDG_CONFIG_HOME/$dir" ]; then
color 32 echo " Creating ${dir:2}"
mkdir "$XDG_CONFIG_HOME/$dir"
fi
done
for file in $(find . -type f -o -type l); do
file="${file:2}"
color 32 echo " Adding $file"
if [[ -L "$file" ]]; then
cp "$file" "$XDG_CONFIG_HOME/$file"
else
relink "$DOT/config/$file" "$XDG_CONFIG_HOME/$file"
fi
done
)
# Setup git
msg "Setting up Git configuration..."
GIT="$DOT/git"
[[ -e "$HOME/.gitconfig" ]] && ! grep -q ".files/install" "$HOME/.gitconfig" && err "Custom ~/.gitconfig already exists! Please remove it before running .files/install" && exit 1
color 32 echo " Writing .gitconfig"
generate "$HOME/.gitconfig" <<EOF
[include]
path = $(relpath "$GIT" "$HOME")/config
path = $(relpath "$GIT" "$HOME")/user-info
EOF
[ "`uname -s`" = "Darwin" ] && \
cat >>"$HOME/.gitconfig" <<EOF
path = $(relpath "$GIT" "$HOME")/osx
EOF
color 32 echo " Writing git/user-info"
generate "$GIT/user-info" <<EOF
[user]
name = $REALNAME
email = $EMAIL
EOF
# Setup ZSH/Prezto
msg "Setting up ZSH configuration..."
ZSH="$DOT/zsh"
color 32 echo " Writing .zshenv"
generate "$HOME/.zshenv" <<EOF
export DOTFILES="\$HOME/$(relpath "$DOT" "$HOME")"
ZDOTDIR="\$DOTFILES/zsh"
source "\$ZDOTDIR/zshenv"
EOF
for file in zshrc zpreztorc zlogin zlogout zprofile; do
color 32 echo " Adding .$file"
relink "$ZSH/$file" "$ZSH/.$file"
done
relink "$ZSH/prezto" "$ZSH/.zprezto"
# Check login shell
if getent passwd $(id -un) | grep -q 'zsh$'; then
msg "Login shell is already set to zsh, you're good to go!"
else
msg "Setting login shell to '$(which zsh)'..."
chsh -s "$(which zsh)"
fi
warn "You may need to relog for all changes to take effect."
warn "If you're currently running zsh, you definitely need to at least restart the shell to apply changes."