Source code
Revision control
Copy as Markdown
Other Tools
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import hashlib
import json
import os
import pathlib
import re
import urllib.request
def _fetch_json(url):
return json.load(urllib.request.urlopen(url))
def _latest(api_url, install_scripts=None):
# Make the version change every time this file changes.
md5 = hashlib.md5()
md5.update(pathlib.Path(__file__).read_bytes())
import __main__
md5.update(pathlib.Path(__main__.__file__).read_bytes())
if install_scripts:
for path in install_scripts:
md5.update(pathlib.Path(path).read_bytes())
file_hash = md5.hexdigest()[:10]
release = _fetch_json(f'{api_url}/releases/latest')['tag_name']
print('{}.{}'.format(release, file_hash))
def _get_url(api_url,
artifact_filename=None,
artifact_extension=None,
artifact_regex=None):
# Split off our md5 hash.
version = os.environ['_3PP_VERSION'].rsplit('.', 1)[0]
json_dict = _fetch_json(f'{api_url}/releases/tags/{version}')
urls = [x['browser_download_url'] for x in json_dict['assets']]
if artifact_regex:
urls = [x for x in urls if re.search(artifact_regex, x)]
if len(urls) != 1:
raise Exception('len(urls) != 1: \n' + '\n'.join(urls))
partial_manifest = {
'url': urls,
'ext': artifact_extension or '',
}
if artifact_filename:
partial_manifest['name'] = [artifact_filename]
print(json.dumps(partial_manifest))
def main(*,
project,
artifact_filename=None,
artifact_extension=None,
artifact_regex=None,
install_scripts=None,
extract_extension=None):
"""The fetch.py script for a 3pp module.
Args:
project: GitHub username for the repo. e.g. "google/protobuf".
artifact_filename: The name for the downloaded file. Required when not
setting "unpack_archive: true" in 3pp.pb.
artifact_extension: File extension of file being downloaded. Required when
setting "unpack_archive: true" in 3pp.pb.
artifact_regex: A regex to use to identify the desired artifact from the
list of artifacts on the release.
install_scripts: List of script to add to the md5 of the version. The main
module and this module are always included.
"""
parser = argparse.ArgumentParser()
parser.add_argument('action', choices=('latest', 'get_url'))
args = parser.parse_args()
if args.action == 'latest':
_latest(api_url, install_scripts=install_scripts)
else:
_get_url(api_url,
artifact_filename=artifact_filename,
artifact_extension=artifact_extension,
artifact_regex=artifact_regex)
if __name__ == '__main__':
main()