Skip to content

Commit ea6f882

Browse files
committed
update: scripts/release-homebrew.sh
1 parent e2d96ce commit ea6f882

File tree

1 file changed

+76
-7
lines changed

1 file changed

+76
-7
lines changed

scripts/release-homebrew.sh

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ require() {
2525

2626
require git
2727
require curl
28-
require perl
2928

3029
checksum_cmd=""
3130
if command -v shasum >/dev/null 2>&1; then
@@ -103,12 +102,82 @@ SHA256=$($checksum_cmd "$tarball" | awk '{print $1}')
103102

104103
echo "Updating formula at $FORMULA_PATH"
105104

106-
perl -0pi -e 's/^ url "[^"]+"/ url "'"$TARBALL_URL"'"/' "$FORMULA_PATH"
107-
perl -0pi -e 's/^ sha256 "[^"]+"/ sha256 "'"$SHA256"'"/' "$FORMULA_PATH"
108-
perl -0pi -e 's/^ version "[^"]+"/ version "'"$VERSION"'"/' "$FORMULA_PATH" 2>/dev/null || true
109-
110-
# Remove stale bottle block so new bottles can be generated after the update.
111-
perl -0pi -e 's/^bottle do\n.*?^end\n\n//ms' "$FORMULA_PATH" || true
105+
python3 - "$FORMULA_PATH" "$VERSION" "$SHA256" "$TARBALL_URL" <<'PY'
106+
import hashlib
107+
import sys
108+
import urllib.request
109+
import pathlib
110+
111+
formula_path = pathlib.Path(sys.argv[1])
112+
new_version = sys.argv[2]
113+
source_sha = sys.argv[3]
114+
source_url = sys.argv[4]
115+
116+
text = formula_path.read_text().splitlines()
117+
118+
version_line_idx = None
119+
old_version = None
120+
for idx, line in enumerate(text):
121+
if line.strip().startswith("version "):
122+
version_line_idx = idx
123+
start = line.find('"') + 1
124+
end = line.rfind('"')
125+
old_version = line[start:end]
126+
text[idx] = line[:start] + new_version + line[end:]
127+
break
128+
129+
if old_version is None:
130+
raise SystemExit("could not locate version line in formula")
131+
132+
def download_sha(url):
133+
with urllib.request.urlopen(url) as resp:
134+
data = resp.read()
135+
return hashlib.sha256(data).hexdigest()
136+
137+
sha_cache = {source_url: source_sha}
138+
139+
def update_pair(i, url_line):
140+
url_start = url_line.find('"') + 1
141+
url_end = url_line.rfind('"')
142+
current_url = url_line[url_start:url_end]
143+
updated_url = current_url.replace(old_version, new_version)
144+
if updated_url != current_url:
145+
url_line = url_line[:url_start] + updated_url + url_line[url_end:]
146+
else:
147+
updated_url = current_url
148+
# find sha line following
149+
j = i + 1
150+
while j < len(text) and "sha256" not in text[j]:
151+
j += 1
152+
if j == len(text):
153+
raise SystemExit("expected sha256 line after url line")
154+
if updated_url not in sha_cache:
155+
sha_cache[updated_url] = download_sha(updated_url)
156+
new_sha = sha_cache[updated_url]
157+
sha_line = text[j]
158+
sha_start = sha_line.find('"') + 1
159+
sha_end = sha_line.rfind('"')
160+
text[j] = sha_line[:sha_start] + new_sha + sha_line[sha_end:]
161+
text[i] = url_line
162+
163+
for idx, line in enumerate(text):
164+
stripped = line.strip()
165+
if stripped.startswith("url "):
166+
update_pair(idx, line)
167+
168+
formula_path.write_text("\n".join(text) + "\n")
169+
PY
170+
171+
# Remove stale bottle block to force regeneration
172+
python3 - "$FORMULA_PATH" <<'PY'
173+
from pathlib import Path
174+
import re
175+
path = Path(__import__('sys').argv[1])
176+
text = path.read_text()
177+
updated = re.sub(r"^bottle do\n.*?^end\n\n", "", text, flags=re.MULTILINE | re.DOTALL)
178+
if updated != text:
179+
path.write_text(updated)
180+
PY
112181

113182
git -C "$TAP_PATH" add "$FORMULA_PATH"
114183

0 commit comments

Comments
 (0)