diff --git a/Formula/buf.rb b/Formula/buf.rb index 121f56f..dee7917 100644 --- a/Formula/buf.rb +++ b/Formula/buf.rb @@ -1,17 +1,45 @@ class Buf < Formula desc "The best way of working with Protocol Buffers." homepage "https://buf.build" - head "https://github.com/bufbuild/buf.git", branch: "main" - url "https://github.com/bufbuild/buf/archive/v1.70.0.tar.gz" - sha256 "7da0f12d42d00a4a4fabf89af37e2e02ad5958bc7e977a713e4bc01b2a232899" version "1.70.0" - depends_on "go" => :build + # sha256 of the prebuilt release archive for each Homebrew-supported platform, + # keyed by "#{OS.kernel_name}-#{Hardware::CPU.arch}". Each archive unpacks to + # the same layout as a source build (bin/, etc/, share/, LICENSE), so the two + # install paths below are equivalent. + SHA256S = { + "Darwin-arm64" => "9cec23658df093d50f3318580e17f1e309d45b817927f22e9de30f78f3d4d45b", + "Darwin-x86_64" => "ebeed1af15bcb145c35c5e51eadc8fe0bdba9311e08fd6abca8c23294929d20b", + "Linux-arm64" => "ff3c79a6bb44c41a8053ec0d863234cee82378ea4c29ed5292c852dbf829fec0", + "Linux-x86_64" => "18498bdadbdce80792ce08c2c59e0c49f157aa3f5d9b0f9c6e3db795be208b9d", + }.freeze + + if (sha = SHA256S["#{OS.kernel_name}-#{Hardware::CPU.arch}"]) + # Homebrew reports 64-bit ARM as "arm64"; the Linux asset is named "aarch64". + asset_arch = Hardware::CPU.arch.to_s + asset_arch = "aarch64" if OS.linux? && Hardware::CPU.arm? + url "https://github.com/bufbuild/buf/releases/download/v#{version}/buf-#{OS.kernel_name}-#{asset_arch}.tar.gz" + sha256 sha + else + # No prebuilt binary for this platform: fall back to building from source. + url "https://github.com/bufbuild/buf/archive/v#{version}.tar.gz" + sha256 "7da0f12d42d00a4a4fabf89af37e2e02ad5958bc7e977a713e4bc01b2a232899" + depends_on "go" => :build + end + + head do + url "https://github.com/bufbuild/buf.git", branch: "main" + depends_on "go" => :build + end def install - ENV["GOPATH"] = HOMEBREW_CACHE/"go_cache" - system "sh", "make/buf/scripts/brew.sh", ".build/brew" - prefix.install Dir[".build/brew/*"] + if build.head? || !SHA256S.key?("#{OS.kernel_name}-#{Hardware::CPU.arch}") + ENV["GOPATH"] = HOMEBREW_CACHE/"go_cache" + system "sh", "make/buf/scripts/brew.sh", ".build/brew" + prefix.install Dir[".build/brew/*"] + else + prefix.install Dir["*"] + end end test do diff --git a/update.bash b/update.bash index ad0256c..857ecd5 100644 --- a/update.bash +++ b/update.bash @@ -24,8 +24,28 @@ if [ -z "${1}" ]; then fi VERSION="${1}" -URL="https://github.com/bufbuild/buf/archive/v${VERSION}.tar.gz" -SHA256=$(curl -sSL "${URL}" | sha256 | cut -f 1 -d ' ') +RELEASE="https://github.com/bufbuild/buf/releases/download/v${VERSION}" + +# Source archive checksum, used by the build-from-source fallback. +SOURCE_URL="https://github.com/bufbuild/buf/archive/v${VERSION}.tar.gz" +SOURCE_SHA256=$(curl -sSL "${SOURCE_URL}" | sha256 | cut -f 1 -d ' ') + +# Prebuilt archive checksums, sourced in one fetch from the release sha256.txt. +SHA256_TXT=$(curl -sSL "${RELEASE}/sha256.txt") +binary_sha256() { + echo "${SHA256_TXT}" | awk -v f="${1}" '$2 == f { print $1 }' +} +DARWIN_ARM64_SHA256=$(binary_sha256 "buf-Darwin-arm64.tar.gz") +DARWIN_X86_64_SHA256=$(binary_sha256 "buf-Darwin-x86_64.tar.gz") +LINUX_ARM64_SHA256=$(binary_sha256 "buf-Linux-aarch64.tar.gz") +LINUX_X86_64_SHA256=$(binary_sha256 "buf-Linux-x86_64.tar.gz") + +for name in SOURCE_SHA256 DARWIN_ARM64_SHA256 DARWIN_X86_64_SHA256 LINUX_ARM64_SHA256 LINUX_X86_64_SHA256; do + if [ -z "${!name}" ]; then + echo "error: could not determine ${name} for v${VERSION}" >&2 + exit 1 + fi +done rm -rf Formula mkdir -p Formula @@ -33,17 +53,45 @@ cat <Formula/buf.rb class Buf < Formula desc "The best way of working with Protocol Buffers." homepage "https://buf.build" - head "https://github.com/bufbuild/buf.git", branch: "main" - url "${URL}" - sha256 "${SHA256}" version "${VERSION}" - depends_on "go" => :build + # sha256 of the prebuilt release archive for each Homebrew-supported platform, + # keyed by "#{OS.kernel_name}-#{Hardware::CPU.arch}". Each archive unpacks to + # the same layout as a source build (bin/, etc/, share/, LICENSE), so the two + # install paths below are equivalent. + SHA256S = { + "Darwin-arm64" => "${DARWIN_ARM64_SHA256}", + "Darwin-x86_64" => "${DARWIN_X86_64_SHA256}", + "Linux-arm64" => "${LINUX_ARM64_SHA256}", + "Linux-x86_64" => "${LINUX_X86_64_SHA256}", + }.freeze + + if (sha = SHA256S["#{OS.kernel_name}-#{Hardware::CPU.arch}"]) + # Homebrew reports 64-bit ARM as "arm64"; the Linux asset is named "aarch64". + asset_arch = Hardware::CPU.arch.to_s + asset_arch = "aarch64" if OS.linux? && Hardware::CPU.arm? + url "https://github.com/bufbuild/buf/releases/download/v#{version}/buf-#{OS.kernel_name}-#{asset_arch}.tar.gz" + sha256 sha + else + # No prebuilt binary for this platform: fall back to building from source. + url "https://github.com/bufbuild/buf/archive/v#{version}.tar.gz" + sha256 "${SOURCE_SHA256}" + depends_on "go" => :build + end + + head do + url "https://github.com/bufbuild/buf.git", branch: "main" + depends_on "go" => :build + end def install - ENV["GOPATH"] = HOMEBREW_CACHE/"go_cache" - system "sh", "make/buf/scripts/brew.sh", ".build/brew" - prefix.install Dir[".build/brew/*"] + if build.head? || !SHA256S.key?("#{OS.kernel_name}-#{Hardware::CPU.arch}") + ENV["GOPATH"] = HOMEBREW_CACHE/"go_cache" + system "sh", "make/buf/scripts/brew.sh", ".build/brew" + prefix.install Dir[".build/brew/*"] + else + prefix.install Dir["*"] + end end test do