From 72b3348fb1456f9bb87e609fb3807c29cb89a307 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Mon, 19 Dec 2022 17:43:51 +0100 Subject: [PATCH 1/4] feature: generate macOS pkg files --- .github/workflows/build-pkg.yml | 43 +++++++++++++++++++++++++++++++++ .gitignore | 3 +++ package/scripts/postinstall | 43 +++++++++++++++++++++++++++++++++ package/scripts/preinstall | 13 ++++++++++ 4 files changed, 102 insertions(+) create mode 100644 .github/workflows/build-pkg.yml create mode 100755 package/scripts/postinstall create mode 100755 package/scripts/preinstall diff --git a/.github/workflows/build-pkg.yml b/.github/workflows/build-pkg.yml new file mode 100644 index 0000000000..244fa66f8c --- /dev/null +++ b/.github/workflows/build-pkg.yml @@ -0,0 +1,43 @@ +name: Build Homebrew package +on: + push: + paths: + - .github/workflows/build-pkg.yml + - package/scripts + pull_request: + branches: + - master + release: + types: + - published + +jobs: + build: + runs-on: macos-12 + env: + IDENTIFIER: sh.brew.Homebrew + TMP_PATH: /tmp/brew + MIN_OS: '11.0' + steps: + - uses: actions/checkout@v3 + with: + path: brew + fetch-depth: 0 + - name: Version name + id: print-version + run: | + echo "version=$(git -C brew describe --tags --always)" > $GITHUB_OUTPUT + - name: Build package + run: | + pkgbuild --root brew \ + --scripts brew/package/scripts \ + --install-location "$TMP_PATH" \ + --identifier "$IDENTIFIER" \ + --min-os-version "$MIN_OS" \ + --filter .DS_Store \ + --version ${{ steps.print-version.outputs.version }} \ + Homebrew-${{ steps.print-version.outputs.version }}.pkg + - uses: actions/upload-artifact@v3 + with: + name: Homebrew ${{ steps.print-version.outputs.version }} + path: Homebrew-${{ steps.print-version.outputs.version }}.pkg diff --git a/.gitignore b/.gitignore index 7e5b4819fc..bedc02b47f 100644 --- a/.gitignore +++ b/.gitignore @@ -179,6 +179,9 @@ !/docs !/manpages +# Unignore our packaging files +!/package + # Ignore generated documentation site /docs/_site /docs/bin diff --git a/package/scripts/postinstall b/package/scripts/postinstall new file mode 100755 index 0000000000..f65f04646d --- /dev/null +++ b/package/scripts/postinstall @@ -0,0 +1,43 @@ +#!/bin/bash + +# verify the files exist +tmp_brew="$2" +if [[ ! -d "${tmp_brew:?}" ]]; then + echo "no directory at $tmp_brew, exiting" + exit 1 +fi + +# pick the correct target +if [[ "$3" != "/" ]]; then + target=$3 +elif [[ $(uname -m) == "x86_64" ]];then + target="/usr/local" +else + target="/opt/Homebrew" +fi + +loggedInUser=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }') +if [[ -f "$target/bin/brew" ]]; then + if [[ $(sudo -u"$loggedInUser" "$target/bin/brew" developer) =~ "enabled" ]]; then + echo "developer install, exiting" + exit 0 + fi + if [[ $("$tmp_brew/bin/brew" --version | head -n1) != $("$target/bin/brew" --version | head -n1) ]]; then + echo "already an outdated install at $target, updating" + sudo -u"$loggedInUser" "$target/bin/brew" update --auto-update + else + echo "already an up-to-date install at $target, exiting" + fi + exit 0 +fi + +group=$(id -gn "$loggedInUser") + +install -d -o "$loggedInUser" -g "$group" "$target" +cp -RX "$tmp_brew/" "$target" + +# set permissions +chown -R "$loggedInUser:$group" "$target/*" + +# cleanup +rm -rf "${tmp_brew:?}/*" diff --git a/package/scripts/preinstall b/package/scripts/preinstall new file mode 100755 index 0000000000..f519ac5c4f --- /dev/null +++ b/package/scripts/preinstall @@ -0,0 +1,13 @@ +#!/bin/bash + +# Checked for installed CLT +if [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]]; then + exit 0 +fi + +if /usr/bin/xcode-select --install; then + exit 0 +fi + +printf "Failed to install CommandLine Tools" +exit 1 From f6a9980e49df40b58ce5a9fe51e16c6759255a23 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Wed, 21 Dec 2022 13:18:09 +0100 Subject: [PATCH 2/4] fix: cleanup macOS packaging Don't allow specifying target Add `set -e` to shell scripts Don't try and package on every PR Co-authored-by: Mike McQuaid --- .github/workflows/build-pkg.yml | 3 --- package/scripts/postinstall | 5 ++--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-pkg.yml b/.github/workflows/build-pkg.yml index 244fa66f8c..ddbcdbc22d 100644 --- a/.github/workflows/build-pkg.yml +++ b/.github/workflows/build-pkg.yml @@ -4,9 +4,6 @@ on: paths: - .github/workflows/build-pkg.yml - package/scripts - pull_request: - branches: - - master release: types: - published diff --git a/package/scripts/postinstall b/package/scripts/postinstall index f65f04646d..c0cfffc7b0 100755 --- a/package/scripts/postinstall +++ b/package/scripts/postinstall @@ -1,4 +1,5 @@ #!/bin/bash +set -e # verify the files exist tmp_brew="$2" @@ -8,9 +9,7 @@ if [[ ! -d "${tmp_brew:?}" ]]; then fi # pick the correct target -if [[ "$3" != "/" ]]; then - target=$3 -elif [[ $(uname -m) == "x86_64" ]];then +if [[ $(uname -m) == "x86_64" ]];then target="/usr/local" else target="/opt/Homebrew" From d2aed313871ca5eb2447d2b021dfcf47102d8c98 Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Wed, 21 Dec 2022 13:37:24 +0100 Subject: [PATCH 3/4] preinstall: correctly handle headless installs --- package/scripts/preinstall | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/package/scripts/preinstall b/package/scripts/preinstall index f519ac5c4f..03bbcac607 100755 --- a/package/scripts/preinstall +++ b/package/scripts/preinstall @@ -5,9 +5,12 @@ if [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]]; then exit 0 fi -if /usr/bin/xcode-select --install; then - exit 0 +if [[ -z "$COMMAND_LINE_INSTALL" ]]; then + printf "No auto-install of CommandLine Tools in headless install!" + exit 1 fi -printf "Failed to install CommandLine Tools" -exit 1 +if ! /usr/bin/xcode-select --install; then + printf "Failed to install CommandLine Tools!" + exit 1 +fi From f30779c6bfc75cf19bc90964b176ebc0fc5a575e Mon Sep 17 00:00:00 2001 From: Sean Molenaar Date: Fri, 23 Dec 2022 09:10:01 +0100 Subject: [PATCH 4/4] Update package/scripts/postinstall --- Library/Homebrew/style.rb | 1 + package/scripts/postinstall | 50 +++++++++++++++++++++++-------------- package/scripts/preinstall | 32 ++++++++++++++++++------ 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/Library/Homebrew/style.rb b/Library/Homebrew/style.rb index 6beacb720b..544249a26b 100644 --- a/Library/Homebrew/style.rb +++ b/Library/Homebrew/style.rb @@ -263,6 +263,7 @@ module Homebrew HOMEBREW_REPOSITORY/"completions/bash/brew", HOMEBREW_REPOSITORY/"Dockerfile", *HOMEBREW_REPOSITORY.glob(".devcontainer/**/*.sh"), + *HOMEBREW_REPOSITORY.glob("package/scripts/*"), *HOMEBREW_LIBRARY.glob("Homebrew/**/*.sh").reject { |path| path.to_s.include?("/vendor/") }, *HOMEBREW_LIBRARY.glob("Homebrew/shims/**/*").map(&:realpath).uniq .reject(&:directory?) diff --git a/package/scripts/postinstall b/package/scripts/postinstall index c0cfffc7b0..7ea0389bb5 100755 --- a/package/scripts/postinstall +++ b/package/scripts/postinstall @@ -1,42 +1,54 @@ #!/bin/bash +# $1 Full path to the installer - unused +# $2 Location of the temporary brew install we're moving into place +# $3 Target install location - unused +# $4 System root directory - unused set -e # verify the files exist tmp_brew="$2" -if [[ ! -d "${tmp_brew:?}" ]]; then - echo "no directory at $tmp_brew, exiting" - exit 1 +if [[ ! -d "${tmp_brew:?}" ]] +then + echo "no directory at ${tmp_brew}, exiting" + exit 1 fi # pick the correct target -if [[ $(uname -m) == "x86_64" ]];then +if [[ $(uname -m) == "x86_64" ]] +then target="/usr/local" else target="/opt/Homebrew" fi loggedInUser=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }') -if [[ -f "$target/bin/brew" ]]; then - if [[ $(sudo -u"$loggedInUser" "$target/bin/brew" developer) =~ "enabled" ]]; then - echo "developer install, exiting" - exit 0 - fi - if [[ $("$tmp_brew/bin/brew" --version | head -n1) != $("$target/bin/brew" --version | head -n1) ]]; then - echo "already an outdated install at $target, updating" - sudo -u"$loggedInUser" "$target/bin/brew" update --auto-update - else - echo "already an up-to-date install at $target, exiting" - fi +if [[ -f "${target}/bin/brew" ]] +then + if [[ $(sudo -u"${loggedInUser}" git -C "${target}" branch --show-current) != "master" ]] + then + echo "working on brew modifications, exiting" + rm -rf "${tmp_brew:?}/*" exit 0 + fi + if [[ $("${tmp_brew}/bin/brew" --version | head -n1) != $("${target}/bin/brew" --version | head -n1) ]] + then + echo "already an outdated install at ${target}, updating" + sudo -u"${loggedInUser}" "${target}/bin/brew" update --auto-update + else + echo "already an up-to-date install at ${target}, exiting" + fi + + rm -rf "${tmp_brew:?}/*" + exit 0 fi -group=$(id -gn "$loggedInUser") +group=$(id -gn "${loggedInUser}") -install -d -o "$loggedInUser" -g "$group" "$target" -cp -RX "$tmp_brew/" "$target" +install -d -o "${loggedInUser}" -g "${group}" "${target}" +cp -RX "${tmp_brew}/" "${target}" # set permissions -chown -R "$loggedInUser:$group" "$target/*" +chown -R "${loggedInUser}:${group}" "${target}/*" # cleanup rm -rf "${tmp_brew:?}/*" diff --git a/package/scripts/preinstall b/package/scripts/preinstall index 03bbcac607..49afc85251 100755 --- a/package/scripts/preinstall +++ b/package/scripts/preinstall @@ -1,16 +1,32 @@ #!/bin/bash # Checked for installed CLT -if [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]]; then +if [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] +then exit 0 fi -if [[ -z "$COMMAND_LINE_INSTALL" ]]; then - printf "No auto-install of CommandLine Tools in headless install!" - exit 1 -fi +CLT_PLACEHOLDER="/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress" +touch "${CLT_PLACEHOLDER}" -if ! /usr/bin/xcode-select --install; then - printf "Failed to install CommandLine Tools!" - exit 1 +CLT_PACKAGE=$(softwareupdate -l | + grep -B 1 "Command Line Tools" | + awk -F"*" '/^ *\*/ {print $2}' | + sed -e 's/^ *Label: //' -e 's/^ *//' | + sort -V | + tail -n1) +softwareupdate -i "${CLT_PACKAGE}" +rm -f "${CLT_PLACEHOLDER}" +if ! [[ -f "/Library/Developer/CommandLineTools/usr/bin/git" ]] +then + if [[ -z "${COMMAND_LINE_INSTALL}" ]] + then + echo + printf "Requesting user install of Xcode Command Line Tools:" + /usr/bin/xcode-select --install + else + echo + printf "Run 'xcode-select --install' to install the Xcode Command Line Tools before running a headless brew install." + exit 1 + fi fi