#!/bin/sh # Welcome to the thoughtbot laptop script! # Be prepared to turn your laptop (or desktop, no haters here) # into an awesome development machine. # shellcheck disable=SC3043 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:-0}" 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 } # shellcheck disable=SC2154 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"' # Determine Homebrew prefix arch="$(uname -m)" if [ "$arch" = "arm64" ]; then HOMEBREW_PREFIX="/opt/homebrew" else HOMEBREW_PREFIX="/usr/local" fi update_shell() { local shell_path; shell_path="$(command -v zsh)" fancy_echo "Changing your shell to zsh ..." if ! grep "$shell_path" /etc/shells > /dev/null 2>&1 ; then fancy_echo "Adding '$shell_path' to /etc/shells" sudo sh -c "echo $shell_path >> /etc/shells" fi sudo chsh -s "$shell_path" "$USER" } case "$SHELL" in */zsh) if [ "$(command -v zsh)" != "$HOMEBREW_PREFIX/bin/zsh" ] ; then update_shell fi ;; *) update_shell ;; esac # checks architecture if [ "$(uname -m)" = "arm64" ] then # checks if Rosetta is already installed if ! pkgutil --pkg-info=com.apple.pkg.RosettaUpdateAuto > /dev/null 2>&1 then echo "Installing Rosetta" # Installs Rosetta2 softwareupdate --install-rosetta --agree-to-license else echo "Rosetta is installed" fi fi gem_install_or_update() { if gem list "$1" --installed > /dev/null; then gem update "$@" else gem install "$@" fi } if ! command -v brew >/dev/null; then fancy_echo "Installing Homebrew ..." /bin/bash -c \ "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" append_to_zshrc "eval \"\$($HOMEBREW_PREFIX/bin/brew shellenv)\"" export PATH="$HOMEBREW_PREFIX/bin:$PATH" fi if brew list | grep -Fq brew-cask; then fancy_echo "Uninstalling old Homebrew-Cask ..." brew uninstall --force brew-cask fi fancy_echo "Updating Homebrew formulae ..." brew update --force # https://github.com/Homebrew/brew/issues/1151 brew bundle --file=- <<EOF tap "thoughtbot/formulae" tap "heroku/brew" # Unix brew "universal-ctags" brew "git" brew "openssl" brew "rcm" brew "reattach-to-user-namespace" brew "the_silver_searcher" brew "tmux" brew "vim" brew "watchman" brew "zsh" # Heroku brew "heroku/brew/heroku" brew "parity" # GitHub brew "gh" # Image manipulation brew "imagemagick" # PDF Rendering brew "poppler" # Programming language prerequisites and package managers brew "libyaml" # should come after openssl brew "coreutils" brew "yarn" cask "gpg-suite-no-mail" # Databases brew "postgresql@14", restart_service: :changed brew "redis", restart_service: :changed EOF fancy_echo "Update heroku binary ..." brew unlink heroku brew link --force heroku fancy_echo "Configuring asdf version manager ..." if [ ! -d "$HOME/.asdf" ]; then brew install asdf append_to_zshrc "source $(brew --prefix asdf)/libexec/asdf.sh" 1 else brew upgrade asdf fi alias install_asdf_plugin=add_or_update_asdf_plugin add_or_update_asdf_plugin() { local name="$1" local url="$2" if ! asdf plugin list | grep -Fq "$name"; then asdf plugin add "$name" "$url" else asdf plugin update "$name" fi } # shellcheck disable=SC1091 . "$(brew --prefix asdf)/libexec/asdf.sh" add_or_update_asdf_plugin "ruby" "https://github.com/asdf-vm/asdf-ruby.git" add_or_update_asdf_plugin "nodejs" "https://github.com/asdf-vm/asdf-nodejs.git" install_asdf_language() { local language="$1" local version version="$(asdf list all "$language" | grep -v "[a-z]" | tr -s '\n' | tail -1)" if ! asdf list "$language" | grep -Fq "$version"; then asdf install "$language" "$version" asdf set --home "$language" "$version" fi } fancy_echo "Installing latest Ruby ..." install_asdf_language "ruby" gem update --system number_of_cores=$(sysctl -n hw.ncpu) bundle config --global jobs $((number_of_cores - 1)) fancy_echo "Installing latest Node ..." install_asdf_language "nodejs" if [ -f "$HOME/.laptop.local" ]; then fancy_echo "Running your customizations from ~/.laptop.local ..." # shellcheck disable=SC1091 . "$HOME/.laptop.local" fi