nixpkgs/pkgs/by-name/se/segger-jlink/update.py
2024-06-12 17:38:32 +02:00

88 lines
2.7 KiB
Python
Executable file

#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3 python3Packages.beautifulsoup4 python3Packages.requests
import requests
import subprocess
from bs4 import BeautifulSoup
from pathlib import Path
from tempfile import NamedTemporaryFile
from textwrap import indent, dedent
ARCH_MAP = {
'x86_64-linux': 'x86_64',
'i686-linux': 'i386',
'aarch64-linux': 'arm64',
'armv7l-linux': 'arm',
}
def find_latest_jlink_version() -> str:
try:
response = requests.get('https://www.segger.com/downloads/jlink/')
response.raise_for_status()
except requests.RequestException as e:
raise RuntimeError(f"Error fetching J-Link version: {e}")
soup = BeautifulSoup(response.text, 'html.parser')
jlink_download_tile = soup.find(lambda tag: tag.name == 'tbody' and "J-Link Software and Documentation pack" in tag.text)
version_select = jlink_download_tile.find('select')
version = next(o.text for o in version_select.find_all('option'))
if version is None:
raise RuntimeError("Could not find the J-Link version on the download page.")
return version.removeprefix('V').replace('.', '')
def nar_hash(url: str) -> str:
try:
response = requests.post(url, data={'accept_license_agreement': 'accepted'})
response.raise_for_status()
except requests.RequestException as e:
raise RuntimeError(f"Error downloading file from {url}: {e}")
with NamedTemporaryFile() as tmpfile:
tmpfile.write(response.content)
tmpfile.flush()
output = subprocess.check_output([
"nix",
"--extra-experimental-features", "nix-command",
"hash", "file", "--sri", tmpfile.name
]).decode("utf8")
return output.strip()
def calculate_package_hashes(version: str) -> list[tuple[str, str, str]]:
result = []
for (arch_nix, arch_web) in ARCH_MAP.items():
url = f"https://www.segger.com/downloads/jlink/JLink_Linux_V{version}_{arch_web}.tgz";
nhash = nar_hash(url)
result.append((arch_nix, arch_web, nhash))
return result
def update_source(version: str, package_hashes: list[tuple[str, str, str]]):
content = f'version = "{version}";\n'
for arch_nix, arch_web, nhash in package_hashes:
content += dedent(f'''
{arch_nix} = {{
name = "{arch_web}";
hash = "{nhash}";
}};''').strip() + '\n'
content = '{\n' + indent(content, ' ') + '}\n'
with open(Path(__file__).parent / 'source.nix', 'w') as file:
file.write(content)
if __name__ == '__main__':
version = find_latest_jlink_version()
package_hashes = calculate_package_hashes(version)
update_source(version, package_hashes)