#! /usr/bin/env python3 # # Copyright OpenEmbedded Contributors # # SPDX-License-Identifier: GPL-2.0-only import argparse import json import sys import urllib.request from pathlib import Path TOP_DIR = Path(__file__).parent.parent def main(): parser = argparse.ArgumentParser( description="Update SPDX License files from upstream" ) parser.add_argument( "-v", "--version", metavar="MAJOR.MINOR[.MICRO]", help="Pull specific version of License list instead of latest", ) parser.add_argument( "--overwrite", action="store_true", help="Update existing license file text with upstream text", ) parser.add_argument( "--deprecated", action="store_true", help="Update deprecated licenses", ) parser.add_argument( "--dest", type=Path, default=TOP_DIR / "meta" / "files" / "common-licenses", help="Write licenses to directory DEST. Default is %(default)s", ) args = parser.parse_args() if args.version: version = f"v{args.version}" else: # Fetch the latest release req = urllib.request.Request( "https://api.github.com/repos/spdx/license-list-data/releases/latest" ) req.add_header("X-GitHub-Api-Version", "2022-11-28") req.add_header("Accept", "application/vnd.github+json") with urllib.request.urlopen(req) as response: data = json.load(response) version = data["tag_name"] print(f"Pulling SPDX license list version {version}") req = urllib.request.Request( f"https://raw.githubusercontent.com/spdx/license-list-data/{version}/json/licenses.json" ) with urllib.request.urlopen(req) as response: spdx_licenses = json.load(response) with (TOP_DIR / "meta" / "files" / "spdx-licenses.json").open("w") as f: json.dump(spdx_licenses, f, sort_keys=True, indent=2) total_count = len(spdx_licenses["licenses"]) updated = 0 for idx, lic in enumerate(spdx_licenses["licenses"]): lic_id = lic["licenseId"] print(f"[{idx + 1} of {total_count}] ", end="") dest_license_file = args.dest / lic_id if dest_license_file.is_file() and not args.overwrite: print(f"Skipping {lic_id} since it already exists") continue print(f"Fetching {lic_id}... ", end="", flush=True) req = urllib.request.Request(lic["detailsUrl"]) with urllib.request.urlopen(req) as response: lic_data = json.load(response) if lic_data["isDeprecatedLicenseId"] and not args.deprecated: print("Skipping (deprecated)") continue with dest_license_file.open("w") as f: f.write(lic_data["licenseText"]) updated += 1 print("done") print(f"Updated {updated} licenses") return 0 if __name__ == "__main__": sys.exit(main())