@@ -25,7 +25,6 @@ require() {
2525
2626require git
2727require curl
28- require perl
2928
3029checksum_cmd=" "
3130if command -v shasum > /dev/null 2>&1 ; then
@@ -103,12 +102,82 @@ SHA256=$($checksum_cmd "$tarball" | awk '{print $1}')
103102
104103echo " 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
113182git -C " $TAP_PATH " add " $FORMULA_PATH "
114183
0 commit comments