#!/usr/bin/env python3 import argparse import os import pathlib import zipfile from urllib.request import urlretrieve def fetch_zip(commit_hash, zip_dir, *, org='python', binary=False, verbose): repo = f'cpython-{"bin" if binary else "source"}-deps' url = f'https://github.com/{org}/{repo}/archive/{commit_hash}.zip' reporthook = None if verbose: reporthook = print zip_dir.mkdir(parents=True, exist_ok=True) filename, headers = urlretrieve( url, zip_dir / f'{commit_hash}.zip', reporthook=reporthook, ) return filename def extract_zip(externals_dir, zip_path): with zipfile.ZipFile(os.fspath(zip_path)) as zf: zf.extractall(os.fspath(externals_dir)) return externals_dir / zf.namelist()[0].split('/')[0] def parse_args(): p = argparse.ArgumentParser() p.add_argument('-v', '--verbose', action='store_true') p.add_argument('-b', '--binary', action='store_true', help='Is the dependency in the binary repo?') p.add_argument('-O', '--organization', help='Organization owning the deps repos', default='python') p.add_argument('-e', '--externals-dir', type=pathlib.Path, help='Directory in which to store dependencies', default=pathlib.Path(__file__).parent.parent / 'externals') p.add_argument('tag', help='tag of the dependency') return p.parse_args() def main(): args = parse_args() zip_path = fetch_zip( args.tag, args.externals_dir / 'zips', org=args.organization, binary=args.binary, verbose=args.verbose, ) final_name = args.externals_dir / args.tag extract_zip(args.externals_dir, zip_path).replace(final_name) if __name__ == '__main__': main()