if (( ! ${+commands[packagesbuild]} )) { autoload -Uz log_group log_info log_status mkcd if (( ! ${+commands[curl]} )) { log_error 'curl not found. Please install curl.' return 2 } if (( ! ${+project_root} )) { log_error "'project_root' not set. Please set before running ${0}." return 2 } local -a curl_opts=() if (( ${+CI} )) { curl_opts+=(--show-error --silent) } else { curl_opts+=(--progress-bar) } curl_opts+=(--location -O) log_group 'Installing Packages.app...' local version local base_url local hash IFS=';' read -r version base_url hash <<< \ "$(jq -r '.tools.packages | {version, baseUrl, hash} | join(";")' buildspec.json)" mkdir -p ${project_root}/.deps && pushd ${project_root}/.deps curl ${curl_opts} "${base_url}/Packages.dmg" local checksum="$(sha256sum Packages.dmg | cut -d " " -f 1)" if [[ ${hash} != ${checksum} ]] { log_error "Checksum mismatch of Packages.dmg download. Expected : ${hash} Actual : ${checksum}" return 2 } hdiutil attach -readonly -noverify -noautoopen -plist Packages.dmg > .result.plist local -i num_entities=$(( $(plutil -extract system-entities raw -- .result.plist) - 1 )) local keys local mount_point for i ({0..${num_entities}}) { keys=($(plutil -extract system-entities.${i} raw -- .result.plist)) if [[ ${keys} == *mount-point* ]] { mount_point=$(plutil -extract system-entities.${i}.mount-point raw -- .result.plist) break } } rm .result.plist log_status 'Installing Packages.app requires elevated privileges!' sudo installer -pkg ${mount_point}/packages/Packages.pkg -target / && rehash hdiutil detach ${mount_point} &> /dev/null && log_status 'Packages.dmg image unmounted.' popd log_group }