mirror of
https://git.yoctoproject.org/poky
synced 2026-02-15 13:13:02 +01:00
The master version of extended package data uses zstd for efficient compression, but it relies on the zstd tool to be present on the host system. Since dunfell supports older distros, we don't want to add this tool as an additional requirement so switch to using gzip instead. (From OE-Core rev: 1c7d555379c4b0962bccd018870989050d87675f) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Steve Sakoman <steve@sakoman.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
110 lines
2.7 KiB
Python
110 lines
2.7 KiB
Python
#
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
|
|
import codecs
|
|
import os
|
|
|
|
def packaged(pkg, d):
|
|
return os.access(get_subpkgedata_fn(pkg, d) + '.packaged', os.R_OK)
|
|
|
|
def read_pkgdatafile(fn):
|
|
pkgdata = {}
|
|
|
|
def decode(str):
|
|
c = codecs.getdecoder("unicode_escape")
|
|
return c(str)[0]
|
|
|
|
if os.access(fn, os.R_OK):
|
|
import re
|
|
with open(fn, 'r') as f:
|
|
lines = f.readlines()
|
|
r = re.compile("([^:]+):\s*(.*)")
|
|
for l in lines:
|
|
m = r.match(l)
|
|
if m:
|
|
pkgdata[m.group(1)] = decode(m.group(2))
|
|
|
|
return pkgdata
|
|
|
|
def get_subpkgedata_fn(pkg, d):
|
|
return d.expand('${PKGDATA_DIR}/runtime/%s' % pkg)
|
|
|
|
def has_subpkgdata(pkg, d):
|
|
return os.access(get_subpkgedata_fn(pkg, d), os.R_OK)
|
|
|
|
def read_subpkgdata(pkg, d):
|
|
return read_pkgdatafile(get_subpkgedata_fn(pkg, d))
|
|
|
|
def has_pkgdata(pn, d):
|
|
fn = d.expand('${PKGDATA_DIR}/%s' % pn)
|
|
return os.access(fn, os.R_OK)
|
|
|
|
def read_pkgdata(pn, d):
|
|
fn = d.expand('${PKGDATA_DIR}/%s' % pn)
|
|
return read_pkgdatafile(fn)
|
|
|
|
#
|
|
# Collapse FOO_pkg variables into FOO
|
|
#
|
|
def read_subpkgdata_dict(pkg, d):
|
|
ret = {}
|
|
subd = read_pkgdatafile(get_subpkgedata_fn(pkg, d))
|
|
for var in subd:
|
|
newvar = var.replace("_" + pkg, "")
|
|
if newvar == var and var + "_" + pkg in subd:
|
|
continue
|
|
ret[newvar] = subd[var]
|
|
return ret
|
|
|
|
def read_subpkgdata_extended(pkg, d):
|
|
import json
|
|
import gzip
|
|
|
|
fn = d.expand("${PKGDATA_DIR}/extended/%s.json.gz" % pkg)
|
|
try:
|
|
with gzip.open(fn, "rt", encoding="utf-8") as f:
|
|
return json.load(f)
|
|
except FileNotFoundError:
|
|
return None
|
|
|
|
def _pkgmap(d):
|
|
"""Return a dictionary mapping package to recipe name."""
|
|
|
|
pkgdatadir = d.getVar("PKGDATA_DIR")
|
|
|
|
pkgmap = {}
|
|
try:
|
|
files = os.listdir(pkgdatadir)
|
|
except OSError:
|
|
bb.warn("No files in %s?" % pkgdatadir)
|
|
files = []
|
|
|
|
for pn in [f for f in files if not os.path.isdir(os.path.join(pkgdatadir, f))]:
|
|
try:
|
|
pkgdata = read_pkgdatafile(os.path.join(pkgdatadir, pn))
|
|
except OSError:
|
|
continue
|
|
|
|
packages = pkgdata.get("PACKAGES") or ""
|
|
for pkg in packages.split():
|
|
pkgmap[pkg] = pn
|
|
|
|
return pkgmap
|
|
|
|
def pkgmap(d):
|
|
"""Return a dictionary mapping package to recipe name.
|
|
Cache the mapping in the metadata"""
|
|
|
|
pkgmap_data = d.getVar("__pkgmap_data", False)
|
|
if pkgmap_data is None:
|
|
pkgmap_data = _pkgmap(d)
|
|
d.setVar("__pkgmap_data", pkgmap_data)
|
|
|
|
return pkgmap_data
|
|
|
|
def recipename(pkg, d):
|
|
"""Return the recipe name for the given binary package name."""
|
|
|
|
return pkgmap(d).get(pkg)
|