#!/bin/bash # $1 Full path to the installer (unused) # $2 Location of the Homebrew installation we may need to move into place # $3 Target install location (unused) # $4 System root directory (unused) set -euo pipefail # disable analytics while installing export HOMEBREW_NO_ANALYTICS_THIS_RUN=1 export HOMEBREW_NO_ANALYTICS_MESSAGE_OUTPUT=1 # verify the installation exists # default to /opt/homebrew to make development/testing easier homebrew_directory="${2:-/opt/homebrew}" if [[ ! -d "${homebrew_directory:?}" ]] then echo "No directory at ${homebrew_directory}!" >&2 exit 1 fi # add Git to path export PATH="/Library/Developer/CommandLineTools/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:${PATH}" # avoid writing to user's global config file by overriding HOME # https://git-scm.com/docs/git-config#SCOPES unset XDG_CONFIG_HOME export HOME="${homebrew_directory}" git_no_hooks() { git -c core.hooksPath=/dev/null "$@" } # reset Git repository cd "${homebrew_directory}" rm -rf "${homebrew_directory}/.git/hooks" git config --global --add safe.directory "${homebrew_directory}" latest_tag="$(git_no_hooks -C "${homebrew_directory}" tag --list --sort="-version:refname" | head -n1)" git_no_hooks -C "${homebrew_directory}" checkout --force -B stable git_no_hooks -C "${homebrew_directory}" reset --hard "${latest_tag}" git_no_hooks -C "${homebrew_directory}" clean -f -d rm -f "${homebrew_directory}/.gitconfig" # move to /usr/local if on x86_64 if [[ $(uname -m) == "x86_64" ]] then if [[ -f "/usr/local/bin/brew" && -d "/usr/local/Homebrew" ]] then cp -pRL "${homebrew_directory}/.git" "/usr/local/Homebrew/" mv "${homebrew_directory}/cache_api" "/usr/local/Homebrew/" export HOME="/usr/local/Homebrew" rm -rf "/usr/local/Homebrew/.git/hooks" git config --global --add safe.directory "/usr/local/Homebrew" git_no_hooks -C "/usr/local/Homebrew" checkout --force -B stable git_no_hooks -C "/usr/local/Homebrew" reset --hard git_no_hooks -C "/usr/local/Homebrew" clean -f -d rm -f "/usr/local/Homebrew/.gitconfig" else mkdir -vp /usr/local/bin mv "${homebrew_directory}" "/usr/local/Homebrew/" # create symlink to /usr/local/bin/brew ln -svf "../Homebrew/bin/brew" "/usr/local/bin/brew" fi rm -rf "${homebrew_directory}" homebrew_directory="/usr/local/Homebrew" cd /usr/local fi # create missing directories mkdir -vp Caskroom Cellar Frameworks etc include lib opt sbin share var/homebrew/linked # optionally define an install user at /var/tmp/.homebrew_pkg_user.plist homebrew_pkg_user_plist="/var/tmp/.homebrew_pkg_user.plist" if [[ -f "${homebrew_pkg_user_plist}" ]] && [[ -n $(defaults read "${homebrew_pkg_user_plist}" HOMEBREW_PKG_USER) ]] then homebrew_pkg_user=$(defaults read /var/tmp/.homebrew_pkg_user HOMEBREW_PKG_USER) # otherwise, get valid logged in user else homebrew_pkg_user=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }') fi # set permissions chmod ug=rwx Caskroom Cellar Frameworks bin etc include lib opt sbin share var var/homebrew var/homebrew/linked if [[ "${homebrew_directory}" == "/usr/local/Homebrew" ]] then chown -h "${homebrew_pkg_user}:admin" bin bin/brew etc include lib opt sbin share var chown -h -R "${homebrew_pkg_user}:admin" Caskroom Cellar Frameworks Homebrew var/homebrew chown -h -R "${homebrew_pkg_user}" etc include share var else chown -R "${homebrew_pkg_user}:admin" . fi # move API cache to ~/Library/Caches/Homebrew user_home_dir=$(dscl . read /Users/"${homebrew_pkg_user}" NFSHomeDirectory | awk '{ print $2 }') user_cache_dir="${user_home_dir}/Library/Caches/Homebrew" user_api_cache_dir="${user_cache_dir}/api" mkdir -vp "${user_api_cache_dir}" mv -v "${homebrew_directory}/cache_api/"* "${user_api_cache_dir}" chown -R "${homebrew_pkg_user}:staff" "${user_cache_dir}" rm -vrf "${homebrew_directory}/cache_api" # create paths.d file for /opt/homebrew installs # (/usr/local/bin is already in the PATH) if [[ -d "/etc/paths.d" && "${homebrew_directory}" == "/opt/homebrew" ]] then mkdir -vp /etc/paths.d echo "/opt/homebrew/bin" >/etc/paths.d/homebrew chown root:wheel /etc/paths.d/homebrew fi