forked from OpenSource/setup
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
4.3 KiB
Bash
198 lines
4.3 KiB
Bash
#!/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)" != '/usr/local/bin/zsh' ] ; then
|
|
update_shell
|
|
fi
|
|
;;
|
|
*)
|
|
update_shell
|
|
;;
|
|
esac
|
|
|
|
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 "homebrew/services"
|
|
tap "heroku/brew"
|
|
|
|
# Unix
|
|
brew "universal-ctags/universal-ctags/universal-ctags", args: ["HEAD"]
|
|
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"
|
|
|
|
# Programming language prerequisites and package managers
|
|
brew "libyaml" # should come after openssl
|
|
brew "coreutils"
|
|
brew "yarn"
|
|
cask "gpg-suite-no-mail"
|
|
|
|
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)/asdf.sh" 1
|
|
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=SC1090
|
|
. "$(brew --prefix asdf)/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]" | tail -1)"
|
|
|
|
if ! asdf list "$language" | grep -Fq "$version"; then
|
|
asdf install "$language" "$version"
|
|
asdf global "$language" "$version"
|
|
fi
|
|
}
|
|
|
|
fancy_echo "Installing Rubies ..."
|
|
asdf install ruby 2.7.5
|
|
asdf install ruby 3.0.3
|
|
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=SC1090
|
|
. "$HOME/.laptop.local"
|
|
fi
|
|
|
|
fancy_echo "Go install Docker"
|
|
open https://docs.docker.com/desktop/mac/install/
|