moxxmpp/scripts/pubspec2lock.py

71 lines
1.9 KiB
Python

'''
Takes a Dart pubspec.lock file as input and outputs a specialized lock file
that contains archive URLs and sha256 hashes for nix. Only useful in combination
with lock2nix.py.
'''
import sys
import subprocess
import urllib
import yaml
import requests
def main():
if len(sys.argv) != 3:
print('Usage: pubspec2lock.py <input> <output>')
exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
with open(input_file, 'r') as f:
data = yaml.safe_load(f.read())
result = {
'packages': {}
}
for package_name in data['packages']:
print(package_name)
package = data['packages'][package_name]
cleaned_url = package["description"]["url"]
if cleaned_url[-1] == '/':
cleaned_url = cleaned_url[:-1]
latest = requests.get(
f'{cleaned_url}/api/packages/{package_name}',
headers={
'Accept': 'application/vnd.pub.v2+json',
},
)
latest_data = None
try:
latest_data = latest.json()
except:
print(latest.text)
exit(1)
for version_data in latest_data['versions']:
if version_data['version'] == package['version']:
package['archive_url'] = version_data['archive_url']
p = subprocess.run([
'nix-prefetch-url',
'--unpack',
urllib.parse.unquote(version_data['archive_url']),
], capture_output=True)
sha256 = p.stdout.decode('utf8')[:-1]
package['sha256'] = sha256
break
result['packages'][package_name] = package
with open(output_file, 'w') as f:
f.write('# CREATED BY pubspec2lock.py\n')
f.write('# DO NOT EDIT BY HAND\n')
f.write(yaml.dump(result))
if __name__ == '__main__':
main()