71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
import os
|
|
import csv
|
|
import functools
|
|
|
|
from . import log
|
|
|
|
SPDX_TO_FEDORA_CSV = os.path.dirname(__file__) + "/spdx_to_fedora.csv"
|
|
|
|
|
|
def translate_slashes(license):
|
|
"Replace all slashes with OR, emit warning"
|
|
split = [l.strip() for l in license.split("/")]
|
|
if len(split) > 1:
|
|
log.info('Upstream uses deprecated "/" syntax. Replacing with "OR"')
|
|
return " OR ".join(split)
|
|
|
|
|
|
@functools.lru_cache()
|
|
def spdx_to_fedora_map():
|
|
with open(SPDX_TO_FEDORA_CSV, newline="") as f:
|
|
reader = csv.DictReader(f)
|
|
return {
|
|
line["SPDX License Identifier"]: line["Fedora Short Name"]
|
|
for line in reader
|
|
if line["SPDX License Identifier"]
|
|
}
|
|
|
|
|
|
def dump_sdpx_to_fedora_map(file):
|
|
for k, v in spdx_to_fedora_map().items():
|
|
print(f"{k} → {v}", file=file)
|
|
|
|
|
|
def translate_license_fedora(license):
|
|
comments = []
|
|
final = []
|
|
for tag in license.split():
|
|
# We accept all variant cases, but output lowercase which is what Fedora LicensingGuidelines specify
|
|
if tag.upper() == "OR":
|
|
final.append("or")
|
|
elif tag.upper() == "AND":
|
|
final.append("and")
|
|
else:
|
|
if tag.endswith("+"):
|
|
key = tag[:-1] + "-or-later"
|
|
fulltag = f"{tag} ({key})"
|
|
else:
|
|
key = fulltag = tag
|
|
|
|
mapped = spdx_to_fedora_map().get(key, None)
|
|
if mapped is None:
|
|
comments += [f"# FIXME: Upstream uses unknown SPDX tag {fulltag}!"]
|
|
final.append(tag)
|
|
elif mapped == "":
|
|
comments += [
|
|
f"# FIXME: Upstream SPDX tag {fulltag} not listed in Fedora's good licenses list.",
|
|
"# FIXME: This package might not be allowed in Fedora!",
|
|
]
|
|
final.append(tag)
|
|
else:
|
|
final.append(mapped)
|
|
if mapped != tag:
|
|
log.info(f"Upstream license tag {fulltag!r} translated to {mapped!r}.")
|
|
return (" ".join(final), "\n".join(comments) or None)
|
|
|
|
|
|
def translate_license(target, license):
|
|
license = translate_slashes(license)
|
|
if target in {"mageia"}:
|
|
return translate_license_fedora(license)
|
|
return license, None
|