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.
 
 
 
 
 
 

311 lines
7.2 KiB

#!/bin/bash
# This symlinks all the dotfiles (and .atom/) to ~/
# It also symlinks ~/bin for easy updating
# This is safe to run multiple times and will prompt you about anything unclear
#
# Utils
#
answer_is_yes() {
[[ "$REPLY" =~ ^[Yy]$ ]] \
&& return 0 \
|| return 1
}
ask() {
print_question "$1"
read
}
ask_for_confirmation() {
print_question "$1 (y/n) "
read -n 1
printf "\n"
}
ask_for_sudo() {
# Ask for the administrator password upfront
sudo -v
# Update existing `sudo` time stamp until this script has finished
# https://gist.github.com/cowboy/3118588
while true; do
sudo -n true
sleep 60
kill -0 "$$" || exit
done &> /dev/null &
}
cmd_exists() {
[ -x "$(command -v "$1")" ] \
&& printf 0 \
|| printf 1
}
execute() {
$1 &> /dev/null
print_result $? "${2:-$1}"
}
get_answer() {
printf "$REPLY"
}
get_os() {
declare -r OS_NAME="$(uname -s)"
local os=""
if [ "$OS_NAME" == "Darwin" ]; then
os="osx"
elif [ "$OS_NAME" == "Linux" ] && [ -e "/etc/lsb-release" ]; then
os="ubuntu"
fi
printf "%s" "$os"
}
is_git_repository() {
[ "$(git rev-parse &>/dev/null; printf $?)" -eq 0 ] \
&& return 0 \
|| return 1
}
mkd() {
if [ -n "$1" ]; then
if [ -e "$1" ]; then
if [ ! -d "$1" ]; then
print_error "$1 - a file with the same name already exists!"
else
print_success "$1"
fi
else
execute "mkdir -p $1" "$1"
fi
fi
}
print_error() {
# Print output in red
printf "\e[0;31m [✖] $1 $2\e[0m\n"
}
print_info() {
# Print output in purple
printf "\n\e[0;35m $1\e[0m\n\n"
}
print_question() {
# Print output in yellow
printf "\e[0;33m [?] $1\e[0m"
}
print_result() {
[ $1 -eq 0 ] \
&& print_success "$2" \
|| print_error "$2"
[ "$3" == "true" ] && [ $1 -ne 0 ] \
&& exit
}
print_success() {
# Print output in green
printf "\e[0;32m [✔] $1\e[0m\n"
}
dir=~/dotfiles # dotfiles directory
dir_backup=~/dotfiles_old # old dotfiles backup directory
# Get current dir (so run this script from anywhere)
export DOTFILES_DIR
DOTFILES_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Create dotfiles_old in homedir
echo -n "Creating $dir_backup for backup of any existing dotfiles in ~..."
mkdir -p $dir_backup
echo "done"
# Change to the dotfiles directory
echo -n "Changing to the $dir directory..."
cd $dir
echo "done"
#
# Actual symlink stuff
#
# Atom editor settings
echo -n "Copying Atom settings.."
mv -f ~/.atom ~/dotfiles_old/
ln -s $HOME/dotfiles/atom ~/.atom
echo "done"
declare -a FILES_TO_SYMLINK=(
'shell/shell_aliases'
'shell/shell_exports'
'shell/shell_functions'
'shell/bash_profile'
'shell/bash_prompt'
'shell/bashrc'
'shell/zshrc'
'shell/ackrc'
'shell/curlrc'
'shell/gemrc'
'shell/inputrc'
'shell/screenrc'
'git/gitattributes'
'git/gitconfig'
'git/gitignore'
)
# FILES_TO_SYMLINK="$FILES_TO_SYMLINK .vim bin" # add in vim and the binaries
# Move any existing dotfiles in homedir to dotfiles_old directory, then create symlinks from the homedir to any files in the ~/dotfiles directory specified in $files
for i in ${FILES_TO_SYMLINK[@]}; do
echo "Moving any existing dotfiles from ~ to $dir_backup"
mv ~/.${i##*/} ~/dotfiles_old/
done
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
main() {
local i=''
local sourceFile=''
local targetFile=''
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for i in ${FILES_TO_SYMLINK[@]}; do
sourceFile="$(pwd)/$i"
targetFile="$HOME/.$(printf "%s" "$i" | sed "s/.*\/\(.*\)/\1/g")"
if [ ! -e "$targetFile" ]; then
execute "ln -fs $sourceFile $targetFile" "$targetFile$sourceFile"
elif [ "$(readlink "$targetFile")" == "$sourceFile" ]; then
print_success "$targetFile$sourceFile"
else
ask_for_confirmation "'$targetFile' already exists, do you want to overwrite it?"
if answer_is_yes; then
rm -rf "$targetFile"
execute "ln -fs $sourceFile $targetFile" "$targetFile$sourceFile"
else
print_error "$targetFile$sourceFile"
fi
fi
done
# Copy batcharge
ln -fs $HOME/dotfiles/bin $HOME
chmod +rwx $HOME/bin/batcharge.py
# Symlink online-check.sh
ln -fs $HOME/dotfiles/lib/online-check.sh $HOME/online-check.sh
# Write out current crontab
crontab -l > mycron
# Echo new cron into cron file
echo "* * * * * ~/online-check.sh" >> mycron
# Install new cron file
crontab mycron
rm mycron
}
install_zsh () {
# Test to see if zshell is installed. If it is:
if [ -f /bin/zsh -o -f /usr/bin/zsh ]; then
# Install Oh My Zsh if it isn't already present
if [[ ! -d $dir/oh-my-zsh/ ]]; then
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
fi
# Set the default shell to zsh if it isn't currently set to zsh
if [[ ! $(echo $SHELL) == $(which zsh) ]]; then
chsh -s $(which zsh)
fi
else
# If zsh isn't installed, get the platform of the current machine
platform=$(uname);
# If the platform is Linux, try an apt-get to install zsh and then recurse
if [[ $platform == 'Linux' ]]; then
if [[ -f /etc/redhat-release ]]; then
sudo yum install zsh
install_zsh
fi
if [[ -f /etc/debian_version ]]; then
sudo apt-get install zsh
install_zsh
fi
# If the platform is OS X, tell the user to install zsh :)
elif [[ $platform == 'Darwin' ]]; then
echo "We'll install zsh, then re-run this script!"
brew install zsh
exit
fi
fi
}
# Package managers & packages
# . "$DOTFILES_DIR/install/brew.sh"
# . "$DOTFILES_DIR/install/npm.sh"
# if [ "$(uname)" == "Darwin" ]; then
# . "$DOTFILES_DIR/install/brew-cask.sh"
# fi
main
# install_zsh
###############################################################################
# Atom #
###############################################################################
# Copy over Atom configs
#cp -r atom/packages.list $HOME/.atom
# Install community packages
#apm list --installed --bare - get a list of installed packages
#apm install --packages-file $HOME/.atom/packages.list
###############################################################################
# Zsh #
###############################################################################
# Install Zsh settings
ln -s ~/dotfiles/zsh/themes/nick.zsh-theme $HOME/.oh-my-zsh/themes
###############################################################################
# Terminal & iTerm 2 #
###############################################################################
# Only use UTF-8 in Terminal.app
defaults write com.apple.terminal StringEncodings -array 4
# Install the Solarized Dark theme for iTerm
open "${HOME}/dotfiles/iterm/themes/Solarized Dark.itermcolors"
# Don’t display the annoying prompt when quitting iTerm
defaults write com.googlecode.iterm2 PromptOnQuit -bool false
# Reload zsh settings
source ~/.zshrc