123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #! /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())
|