Skip to content

Instantly share code, notes, and snippets.

@maxackerman
Last active July 23, 2023 15:21
Show Gist options
  • Save maxackerman/930146246c6a023f4ac0e7c09cf05a68 to your computer and use it in GitHub Desktop.
Save maxackerman/930146246c6a023f4ac0e7c09cf05a68 to your computer and use it in GitHub Desktop.
bash srcipt to setup a new mac with homebrew and dev environment
#!/bin/sh
# run "sh setup.sh"
# BACKUP BEFORE WIPE:
# SSH keys
# Fonts
# Keychain passwords
# files outside dropbox: downloads, documents, photos, photobooth
# bash/zsh profile
# transmit favs
# reference:
# https://github.com/thoughtbot/laptop
# https://github.com/tylucaskelley/setup
# http://sourabhbajaj.com/mac-setup/
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
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
fancy_echo "Begin Homebrew bundle install..."
brew bundle --file=- <<EOF
tap "homebrew/cask-drivers"
# brew
brew "composer"
brew "git"
brew "ffmpeg"
brew "yt-dlp"
brew "imagemagick"
brew "php"
brew "rsync"
brew "asdf"
# osx apps
cask "adobe-creative-cloud"
cask "alfred"
cask "dropbox"
cask "firefox"
cask "figma"
cask "google-chrome"
cask "hazel"
cask "notion"
cask "rectangle"
cask "rightfont"
cask "slack"
cask "sublime-text"
cask "sublime-merge"
cask "transmit"
cask "visual-studio-code"
cask "vlc"
cask "zoom"
# drivers
cask "wacom-tablet"
EOF
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
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]" | tail -1)"
if ! asdf list "$language" | grep -Fq "$version"; then
asdf install "$language" "$version"
asdf global "$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"
fancy_echo "brew cleanup..."
brew cleanup
# youtube-dl config
mkdir ~/.config/yt-dlp && touch ~/.config/yt-dlp/config
echo '-f bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' >> ~/.config/yt-dlp/config
fancy_echo "Begin OSX Settings..."
# OSX Settings
# reference: https://github.com/keith/dotfiles/blob/master/osx/defaults.sh
# Disable "shake to find mouse"
defaults write NSGlobalDomain CGDisableCursorLocationMagnification -bool true
# set key repeat speed
defaults write -g InitialKeyRepeat -int 15
defaults write -g KeyRepeat -int 2
# Automatically hide and show the Dock
defaults write com.apple.dock autohide -bool true
# Dock setup
defaults delete com.apple.dock persistent-apps; killall Dock
# Change the auto-hiding Dock delay adn speed
defaults write com.apple.dock autohide-delay -float 0.0
defaults write com.apple.dock autohide-time-modifier -float 0.5
# Disable the Launchpad gesture (pinch with thumb and three fingers)
defaults write com.apple.dock showLaunchpadGestureEnabled -int 0
# set DNS servers
networksetup -setdnsservers Wi-Fi 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
echo "Setup process complete!"
# MANUAL SETUP
# install Laravel Valet
# adobe-creative-cloud install apps
# xcode cli tools run: "xcode-select --install"
# git config
# setup Dropbox
# Sublime: link settings in dropbox with symlink (https://packagecontrol.io/docs/syncing#dropbox-osx)
# Alfred: link settings in dropbox
# RightFont: link dropbox
# arq
# authy
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment