|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +set -euo pipefail |
| 4 | + |
| 5 | +if [[ $# -ne 2 ]] |
| 6 | +then |
| 7 | + echo "Usage: scripts/update-formula.sh <formula> <x.y.z>" >&2 |
| 8 | + exit 64 |
| 9 | +fi |
| 10 | + |
| 11 | +readonly formula="$1" |
| 12 | +readonly version="$2" |
| 13 | +script_directory="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 14 | +readonly script_directory |
| 15 | +tap_directory="$(cd "${script_directory}/.." && pwd)" |
| 16 | +readonly tap_directory |
| 17 | +readonly registry="${tap_directory}/.github/formulae.json" |
| 18 | + |
| 19 | +if [[ ! "${formula}" =~ ^[a-z0-9][a-z0-9._+-]*$ ]] |
| 20 | +then |
| 21 | + echo "Invalid formula name '${formula}'." >&2 |
| 22 | + exit 64 |
| 23 | +fi |
| 24 | +if [[ ! "${version}" =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]] |
| 25 | +then |
| 26 | + echo "Version must be plain semantic version such as 0.1.0." >&2 |
| 27 | + exit 64 |
| 28 | +fi |
| 29 | + |
| 30 | +for command in brew curl gh jq shasum |
| 31 | +do |
| 32 | + if ! command -v "${command}" >/dev/null |
| 33 | + then |
| 34 | + echo "Required command '${command}' was not found." >&2 |
| 35 | + exit 1 |
| 36 | + fi |
| 37 | +done |
| 38 | + |
| 39 | +if ! repository="$(jq -er --arg formula "${formula}" '.[$formula].repository // empty' "${registry}")" |
| 40 | +then |
| 41 | + echo "Formula '${formula}' is not registered in ${registry}." >&2 |
| 42 | + exit 64 |
| 43 | +fi |
| 44 | +readonly repository |
| 45 | +if ! asset="$(jq -er --arg formula "${formula}" '.[$formula].asset // empty' "${registry}")" |
| 46 | +then |
| 47 | + echo "Formula '${formula}' does not define a release asset in ${registry}." >&2 |
| 48 | + exit 1 |
| 49 | +fi |
| 50 | +readonly asset |
| 51 | +readonly formula_path="${tap_directory}/Formula/${formula}.rb" |
| 52 | +readonly formula_reference="capturecontext/tap/${formula}" |
| 53 | + |
| 54 | +if [[ ! "${repository}" =~ ^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$ ]] |
| 55 | +then |
| 56 | + echo "Registry repository '${repository}' is invalid." >&2 |
| 57 | + exit 1 |
| 58 | +fi |
| 59 | +if [[ ! "${asset}" =~ ^[A-Za-z0-9._-]+$ ]] |
| 60 | +then |
| 61 | + echo "Registry asset '${asset}' is invalid." >&2 |
| 62 | + exit 1 |
| 63 | +fi |
| 64 | +if [[ ! -f "${formula_path}" ]] |
| 65 | +then |
| 66 | + echo "Formula '${formula_path}' does not exist." >&2 |
| 67 | + exit 1 |
| 68 | +fi |
| 69 | + |
| 70 | +release_json="$(gh api "repos/${repository}/releases/tags/${version}")" |
| 71 | +readonly release_json |
| 72 | +if ! jq -e \ |
| 73 | + --arg version "${version}" \ |
| 74 | + '.tag_name == $version and .draft == false and .prerelease == false' \ |
| 75 | + <<<"${release_json}" >/dev/null |
| 76 | +then |
| 77 | + echo "Release ${repository}@${version} is missing, draft, or prerelease." >&2 |
| 78 | + exit 1 |
| 79 | +fi |
| 80 | + |
| 81 | +artifact_url="$(jq -er \ |
| 82 | + --arg name "${asset}" \ |
| 83 | + '[.assets[] | select(.name == $name)][0].browser_download_url // empty' \ |
| 84 | + <<<"${release_json}")" |
| 85 | +readonly artifact_url |
| 86 | +checksum_url="$(jq -er \ |
| 87 | + --arg name "${asset}.sha256" \ |
| 88 | + '[.assets[] | select(.name == $name)][0].browser_download_url // empty' \ |
| 89 | + <<<"${release_json}")" |
| 90 | +readonly checksum_url |
| 91 | + |
| 92 | +temporary_directory="$(mktemp -d)" |
| 93 | +readonly temporary_directory |
| 94 | +trap 'rm -rf "$temporary_directory"' EXIT |
| 95 | + |
| 96 | +curl --fail --location --retry 3 --silent --show-error \ |
| 97 | + --output "${temporary_directory}/${asset}" \ |
| 98 | + "${artifact_url}" |
| 99 | +curl --fail --location --retry 3 --silent --show-error \ |
| 100 | + --output "${temporary_directory}/${asset}.sha256" \ |
| 101 | + "${checksum_url}" |
| 102 | +( |
| 103 | + cd "${temporary_directory}" |
| 104 | + shasum -a 256 --check "${asset}.sha256" |
| 105 | +) |
| 106 | + |
| 107 | +sha256="$(shasum -a 256 "${temporary_directory}/${asset}" | awk '{print $1}')" |
| 108 | +readonly sha256 |
| 109 | + |
| 110 | +if grep -Fq "url \"${artifact_url}\"" "${formula_path}" && |
| 111 | + grep -Fq "sha256 \"${sha256}\"" "${formula_path}" |
| 112 | +then |
| 113 | + echo "${formula} is already at ${version}." |
| 114 | +else |
| 115 | + brew bump-formula-pr \ |
| 116 | + --write-only \ |
| 117 | + --no-audit \ |
| 118 | + --url="${artifact_url}" \ |
| 119 | + --sha256="${sha256}" \ |
| 120 | + "${formula_reference}" |
| 121 | +fi |
| 122 | + |
| 123 | +brew style "${formula_reference}" |
| 124 | +brew audit --formula "${formula_reference}" |
| 125 | +HOMEBREW_NO_AUTO_UPDATE=1 brew install "${formula_reference}" |
| 126 | +brew test "${formula_reference}" |
0 commit comments