Skip to content

Instantly share code, notes, and snippets.

@deckarep
Created August 30, 2016 17:09
Show Gist options
  • Save deckarep/1d47848621a83ef1776fad32e1a5b461 to your computer and use it in GitHub Desktop.
Save deckarep/1d47848621a83ef1776fad32e1a5b461 to your computer and use it in GitHub Desktop.
#!/bin/sh
# Welcome to the thoughtbot laptop script!
# Be prepared to turn your laptop (or desktop, no haters here)
# into an awesome development machine.
fancy_echo() {
local fmt="$1"; shift
# shellcheck disable=SC2059
printf "\n$fmt\n" "$@"
}
append_to_zshrc() {
local text="$1" zshrc
local skip_new_line="$2"
if [ -w "$HOME/.zshrc.local" ]; then
zshrc="$HOME/.zshrc.local"
else
zshrc="$HOME/.zshrc"
fi
if ! grep -Fqs "$text" "$zshrc"; then
if [ "$skip_new_line" -eq 1 ]; then
printf "%s\n" "$text" >> "$zshrc"
else
printf "\n%s\n" "$text" >> "$zshrc"
fi
fi
}
trap 'ret=$?; test $ret -ne 0 && printf "failed\n\n" >&2; exit $ret' EXIT
set -e
if [ ! -d "$HOME/.bin/" ]; then
mkdir "$HOME/.bin"
fi
if [ ! -f "$HOME/.zshrc" ]; then
touch "$HOME/.zshrc"
fi
# shellcheck disable=SC2016
append_to_zshrc 'export PATH="$HOME/.bin:$PATH"'
case "$SHELL" in
*/zsh) : ;;
*)
fancy_echo "Changing your shell to zsh ..."
chsh -s "$(which zsh)"
;;
esac
brew_install_or_upgrade() {
if brew_is_installed "$1"; then
if brew_is_upgradable "$1"; then
fancy_echo "Upgrading %s ..." "$1"
brew upgrade "$@"
else
fancy_echo "Already using the latest version of %s. Skipping ..." "$1"
fi
else
fancy_echo "Installing %s ..." "$1"
brew install "$@"
fi
}
brew_is_installed() {
local name="$(brew_expand_alias "$1")"
brew list -1 | grep -Fqx "$name"
}
brew_is_upgradable() {
local name="$(brew_expand_alias "$1")"
! brew outdated --quiet "$name" >/dev/null
}
brew_tap() {
brew tap "$1" 2> /dev/null
}
brew_expand_alias() {
brew info "$1" 2>/dev/null | head -1 | awk '{gsub(/:/, ""); print $1}'
}
brew_launchctl_restart() {
local name="$(brew_expand_alias "$1")"
local domain="homebrew.mxcl.$name"
local plist="$domain.plist"
fancy_echo "Restarting %s ..." "$1"
mkdir -p "$HOME/Library/LaunchAgents"
ln -sfv "/usr/local/opt/$name/$plist" "$HOME/Library/LaunchAgents"
if launchctl list | grep -Fq "$domain"; then
launchctl unload "$HOME/Library/LaunchAgents/$plist" >/dev/null
fi
launchctl load "$HOME/Library/LaunchAgents/$plist" >/dev/null
}
gem_install_or_update() {
if gem list "$1" --installed > /dev/null; then
fancy_echo "Updating %s ..." "$1"
gem update "$@"
else
fancy_echo "Installing %s ..." "$1"
gem install "$@"
rbenv rehash
fi
}
if ! command -v brew >/dev/null; then
fancy_echo "Installing Homebrew ..."
curl -fsS \
'https://raw.githubusercontent.com/Homebrew/install/master/install' | ruby
append_to_zshrc '# recommended by brew doctor'
# shellcheck disable=SC2016
append_to_zshrc 'export PATH="/usr/local/bin:$PATH"' 1
export PATH="/usr/local/bin:$PATH"
else
fancy_echo "Homebrew already installed. Skipping ..."
fi
fancy_echo "Updating Homebrew formulas ..."
brew update
brew_install_or_upgrade 'git'
brew_install_or_upgrade 'postgres'
brew_launchctl_restart 'postgresql'
brew_install_or_upgrade 'redis'
brew_launchctl_restart 'redis'
brew_install_or_upgrade 'couchdb'
brew_launchctl_restart 'couchdb'
brew_install_or_upgrade 'the_silver_searcher'
brew_install_or_upgrade 'vim'
brew_install_or_upgrade 'ctags'
brew_install_or_upgrade 'tmux'
brew_install_or_upgrade 'reattach-to-user-namespace'
brew_install_or_upgrade 'imagemagick'
brew_install_or_upgrade 'qt'
brew_install_or_upgrade 'gh'
brew_install_or_upgrade 'node'
brew_install_or_upgrade 'zmq'
brew_launchctl_restart 'zmq'
brew_install_or_upgrade 'rabbitmq'
brew_launchctl_restart 'rabbitmq'
brew_install_or_upgrade 'rbenv'
brew_install_or_upgrade 'ruby-build'
# shellcheck disable=SC2016
append_to_zshrc 'eval "$(rbenv init - zsh --no-rehash)"' 1
brew_install_or_upgrade 'openssl'
brew unlink openssl && brew link openssl --force
brew_install_or_upgrade 'libyaml'
ruby_version="$(curl -sSL http://ruby.thoughtbot.com/latest)"
eval "$(rbenv init - zsh)"
if ! rbenv versions | grep -Fq "$ruby_version"; then
rbenv install -s "$ruby_version"
fi
rbenv global "$ruby_version"
rbenv shell "$ruby_version"
gem update --system
gem_install_or_update 'bundler'
fancy_echo "Configuring Bundler ..."
number_of_cores=$(sysctl -n hw.ncpu)
bundle config --global jobs $((number_of_cores - 1))
brew_install_or_upgrade 'heroku-toolbelt'
if ! command -v rcup >/dev/null; then
brew_tap 'thoughtbot/formulae'
brew_install_or_upgrade 'rcm'
fi
if [ -f "$HOME/.laptop.local" ]; then
. "$HOME/.laptop.local"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment