Skip to content

Commit 68f197b

Browse files
committed
cbuild: rewrite runtime depscan to use query
This should be a lot easier to follow and drops some redundant code paths.
1 parent b9d4ce7 commit 68f197b

2 files changed

Lines changed: 39 additions & 110 deletions

File tree

src/cbuild/apk/cli.py

Lines changed: 11 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ def query_chroot(fields, args, mrepo, return_repos=False, **kwargs):
255255
return outv
256256

257257

258-
def is_installed(pkgn, pkg=None):
258+
def get_provider(pkgn, pkg=None):
259259
cpf = pkg.rparent.profile() if pkg else None
260260

261261
if pkg and cpf.cross:
@@ -265,48 +265,17 @@ def is_installed(pkgn, pkg=None):
265265
sysp = paths.bldroot()
266266
aarch = None
267267

268-
return (
269-
call(
270-
"info",
271-
["--installed", pkgn],
272-
None,
273-
root=sysp,
274-
capture_output=True,
275-
arch=aarch,
276-
allow_untrusted=True,
277-
).returncode
278-
== 0
279-
)
280-
281-
282-
def get_provider(thing, pkg):
283-
cpf = pkg.rparent.profile() if pkg else None
284-
285-
if pkg and cpf.cross:
286-
sysp = paths.bldroot() / cpf.sysroot.relative_to("/")
287-
aarch = cpf.arch
288-
else:
289-
sysp = paths.bldroot()
290-
aarch = None
291-
292-
out = (
293-
call(
294-
"search",
295-
["--from", "installed", "-q", "-e", thing],
296-
None,
297-
root=sysp,
298-
capture_output=True,
299-
arch=aarch,
300-
allow_untrusted=True,
301-
)
302-
.stdout.strip()
303-
.decode()
268+
qv = query(
269+
["name"],
270+
["--installed", "--match=name,provides", pkgn],
271+
None,
272+
root=sysp,
273+
arch=aarch,
274+
allow_untrusted=True,
304275
)
305-
306-
if len(out) == 0:
307-
return None
308-
309-
return out
276+
if qv:
277+
return qv[0]["name"]
278+
return None
310279

311280

312281
def check_version(*args):

src/cbuild/hooks/pkg/001_runtime_deps.py

Lines changed: 28 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -135,54 +135,32 @@ def _scan_so(pkg):
135135
broot = None
136136
aarch = None
137137

138-
info = cli.call(
139-
"info",
140-
["--from", "installed", "--description", "so:" + dep],
138+
info = cli.query(
139+
["name"],
140+
["--installed", "--match=provides", f"so:{dep}"],
141141
None,
142142
root=broot,
143-
capture_output=True,
144143
arch=aarch,
145144
allow_untrusted=True,
146145
)
147-
if info.returncode != 0:
148-
# when bootstrapping, also check the repository
149-
if pkg.stage == 0:
150-
info = cli.call(
151-
"info",
152-
["--from", "none", "--description", "so:" + dep],
153-
"main",
154-
capture_output=True,
155-
allow_untrusted=True,
156-
)
146+
if not info and pkg.stage == 0:
147+
# when bootstrapping, check the repository...
148+
info = cli.query(
149+
["name"],
150+
["--from=none", "--match=provides", f"so:{dep}"],
151+
"main",
152+
allow_untrusted=True,
153+
)
157154

158-
# either of the commands failed
159-
if info.returncode != 0:
155+
# failed to query either way...
156+
if not info:
160157
log.out(f" \f[red]SONAME: {dep} (unknown provider)")
161158
broken = True
162159
continue
163160

164-
# this needs a bit more parsing, first take only the name-ver
165-
outl = info.stdout.split()
166-
sdep = None
167-
if len(outl) > 0:
168-
outl = outl[0].strip().decode()
169-
# find -rX
170-
dash = outl.rfind("-")
171-
if dash > 0:
172-
# find the version separator
173-
dash = outl.rfind("-", 0, dash)
174-
if dash > 0:
175-
# consider just the name
176-
sdep = outl[0:dash]
177-
178-
if not sdep or len(sdep) == 0:
179-
# this should never happen though
180-
log.out(f" \f[red]SONAME: {dep} (unknown provider)")
181-
broken = True
182-
continue
183161
# we found a package
184162
log.out_plain(
185-
f" \f[cyan]SONAME: \f[orange]{dep}\f[] (provider: \f[green]{sdep}\f[])"
163+
f" \f[cyan]SONAME: \f[orange]{dep}\f[] (provider: \f[green]{info[0]['name']}\f[])"
186164
)
187165
pkg.so_requires.append(dep)
188166

@@ -317,26 +295,14 @@ def subpkg_provides_pc(pn):
317295
for k in pcreq:
318296
pn = pcreq[k]
319297
# provided by one of ours or by a dependency
320-
in_subpkg = subpkg_provides_pc(pn)
321-
if in_subpkg or cli.is_installed("pc:" + k, pkg):
298+
prov = subpkg_provides_pc(pn)
299+
if not prov:
300+
prov = cli.get_provider(f"pc:{pn}", pkg)
301+
if prov:
322302
pkg.pc_requires.append(k)
323-
# locate the explicit provider
324-
if not in_subpkg:
325-
# apk search needs unconstrained name
326-
idx = re.search(r"[<>=]", k)
327-
if idx:
328-
prov = cli.get_provider("pc:" + k[: idx.start()], pkg)
329-
else:
330-
prov = cli.get_provider("pc:" + k, pkg)
331-
else:
332-
prov = in_subpkg
333-
# this should never happen in practice since it's already checked
334-
if not prov:
335-
pkg.error(f" pc: {k} (unknown provider)")
336-
else:
337-
log.out_plain(
338-
f" \f[cyan]pc: \f[orange]{k}\f[] (provider: \f[green]{prov}\f[])"
339-
)
303+
log.out_plain(
304+
f" \f[cyan]pc: \f[orange]{k}\f[] (provider: \f[green]{prov}\f[])"
305+
)
340306
# warn about redundancy
341307
if prov in pkg.depends:
342308
pkg.log_warn(f"redundant runtime dependency '{prov}'")
@@ -411,20 +377,14 @@ def subpkg_provides_svc(pn, pfx):
411377
if pkg_provides_svc(pkg, sv, pfx):
412378
continue
413379
# provided by one of ours or by a dependency
414-
in_subpkg = subpkg_provides_svc(sv, pfx)
415-
if in_subpkg or cli.is_installed(f"{pfx}:" + sv, pkg):
380+
prov = subpkg_provides_svc(sv, pfx)
381+
if not prov:
382+
prov = cli.get_provider(f"{pfx}:{sv}", pkg)
383+
if prov:
416384
pkg.svc_requires.append(f"{pfx}:{sv}")
417-
# locate the explicit provider
418-
if not in_subpkg:
419-
prov = cli.get_provider(f"{pfx}:{sv}", pkg)
420-
else:
421-
prov = in_subpkg
422-
if not prov:
423-
pkg.error(f" {pfx}: {sv} (unknown provider)")
424-
else:
425-
log.out_plain(
426-
f" \f[cyan]{pfx}: \f[orange]{sv}\f[] (provider: \f[green]{prov}\f[])"
427-
)
385+
log.out_plain(
386+
f" \f[cyan]{pfx}: \f[orange]{sv}\f[] (provider: \f[green]{prov}\f[])"
387+
)
428388
# warn about redundancy
429389
if prov in pkg.depends and prov != "dinit-chimera":
430390
pkg.log_warn(f"redundant runtime dependency '{prov}'")

0 commit comments

Comments
 (0)