| # |
| # Copyright OpenEmbedded Contributors |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| |
| import collections |
| |
| DepRecipe = collections.namedtuple("DepRecipe", ("doc", "doc_sha1", "recipe")) |
| DepSource = collections.namedtuple("DepSource", ("doc", "doc_sha1", "recipe", "file")) |
| |
| |
| def get_recipe_spdxid(d): |
| return "SPDXRef-%s-%s" % ("Recipe", d.getVar("PN")) |
| |
| |
| def get_download_spdxid(d, idx): |
| return "SPDXRef-Download-%s-%d" % (d.getVar("PN"), idx) |
| |
| |
| def get_package_spdxid(pkg): |
| return "SPDXRef-Package-%s" % pkg |
| |
| |
| def get_source_file_spdxid(d, idx): |
| return "SPDXRef-SourceFile-%s-%d" % (d.getVar("PN"), idx) |
| |
| |
| def get_packaged_file_spdxid(pkg, idx): |
| return "SPDXRef-PackagedFile-%s-%d" % (pkg, idx) |
| |
| |
| def get_image_spdxid(img): |
| return "SPDXRef-Image-%s" % img |
| |
| |
| def get_sdk_spdxid(sdk): |
| return "SPDXRef-SDK-%s" % sdk |
| |
| |
| def doc_path_by_namespace(spdx_deploy, doc_namespace): |
| return spdx_deploy / "by-namespace" / doc_namespace.replace("/", "_") |
| |
| |
| def doc_path_by_hashfn(spdx_deploy, doc_name, hashfn): |
| return spdx_deploy / "by-hash" / hashfn.split()[1] / (doc_name + ".spdx.json") |
| |
| |
| def doc_path(spdx_deploy, doc_name, arch, subdir): |
| return spdx_deploy / arch/ subdir / (doc_name + ".spdx.json") |
| |
| |
| def write_doc(d, spdx_doc, arch, subdir, spdx_deploy=None, indent=None): |
| from pathlib import Path |
| |
| if spdx_deploy is None: |
| spdx_deploy = Path(d.getVar("SPDXDEPLOY")) |
| |
| dest = doc_path(spdx_deploy, spdx_doc.name, arch, subdir) |
| dest.parent.mkdir(exist_ok=True, parents=True) |
| with dest.open("wb") as f: |
| doc_sha1 = spdx_doc.to_json(f, sort_keys=True, indent=indent) |
| |
| l = doc_path_by_namespace(spdx_deploy, spdx_doc.documentNamespace) |
| l.parent.mkdir(exist_ok=True, parents=True) |
| l.symlink_to(os.path.relpath(dest, l.parent)) |
| |
| l = doc_path_by_hashfn(spdx_deploy, spdx_doc.name, d.getVar("BB_HASHFILENAME")) |
| l.parent.mkdir(exist_ok=True, parents=True) |
| l.symlink_to(os.path.relpath(dest, l.parent)) |
| |
| return doc_sha1 |
| |
| |
| def read_doc(fn): |
| import hashlib |
| import oe.spdx |
| import io |
| import contextlib |
| |
| @contextlib.contextmanager |
| def get_file(): |
| if isinstance(fn, io.IOBase): |
| yield fn |
| else: |
| with fn.open("rb") as f: |
| yield f |
| |
| with get_file() as f: |
| sha1 = hashlib.sha1() |
| while True: |
| chunk = f.read(4096) |
| if not chunk: |
| break |
| sha1.update(chunk) |
| |
| f.seek(0) |
| doc = oe.spdx.SPDXDocument.from_json(f) |
| |
| return (doc, sha1.hexdigest()) |