Skip to content

Commit 998de3b

Browse files
authored
Merge pull request #24 from turnkeylinux/18.x-dev
Ready for v18.0!
2 parents 015d196 + 0f74d0c commit 998de3b

5 files changed

Lines changed: 103 additions & 19 deletions

File tree

fab

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,20 @@ from fablib.installer import (PoolInstaller,
3232
from chroot import Chroot
3333
from fablib.plan import Plan, Dependency
3434
from fablib import cpp, annotate, resolve, removelist
35-
35+
import logging
36+
37+
log_level={
38+
'DEBUG': logging.DEBUG,
39+
'WARN': logging.WARNING,
40+
'WARNING': logging.WARNING,
41+
'INFO': logging.INFO,
42+
'ERROR': logging.ERROR,
43+
'ERR': logging.ERROR,
44+
'CRITICAL': logging.CRITICAL,
45+
'FATAL': logging.CRITICAL,
46+
}[os.getenv('FAB_LOG_LEVEL', 'warn').upper()]
47+
logger = logging.getLogger().getChild("fab")
48+
logger.setLevel(log_level)
3649

3750
class SupportsStr(Protocol):
3851
def __str__(self) -> str:
@@ -198,6 +211,18 @@ def cmd_install(
198211
env_vars_raw: Optional[str],
199212
cpp_opts: List[Tuple[str, str]],
200213
) -> None:
214+
logger.debug(
215+
"fab-install("
216+
f"{chroot_path=}, "
217+
f"{packages=}, "
218+
f"{pool_path=}, "
219+
f"{arch=}, "
220+
f"{no_deps=}, "
221+
f"{apt_proxy=}, "
222+
f"{ignore_errors_raw=}, "
223+
f"{env_vars_raw=}, "
224+
f"{cpp_opts=})"
225+
)
201226
if not isdir(chroot_path):
202227
fatal(f"no such chroot ({chroot_path})")
203228

@@ -225,26 +250,52 @@ def cmd_install(
225250
else:
226251
ignore_errors = ignore_errors_raw.split(":")
227252

253+
logger.debug(f" with environ={environ}")
254+
logger.debug(f" with ignore_errors={ignore_errors}")
255+
logger.debug(f" with pool_path={pool_path}")
256+
228257
plan = Plan(pool_path=pool_path)
229258
for package in packages:
230259
if package == "-" or os.path.exists(package):
231260
plan |= Plan.init_from_file(package, cpp_opts, pool_path)
232261
else:
233262
plan.add(package)
234263

264+
logger.debug(f"plan={plan}")
265+
235266
installer: Installer
236267
if pool_path is not None:
237268
if no_deps:
238-
packages = list(plan)
269+
pool_packages = list(plan)
270+
other_packages = []
239271
else:
240-
packages = list(plan.resolve())
272+
pool_packages, other_packages = plan.resolve()
273+
pool_packages = list(pool_packages)
274+
logger.debug("using PoolInstaller for ")
275+
logger.debug('\n'.join(map(repr, pool_packages)))
276+
# find all packages which are present in pool
277+
278+
pool_installer = PoolInstaller(chroot_path, pool_path, arch, environ)
279+
installer = LiveInstaller(chroot_path, apt_proxy, environ)
241280

242-
installer = PoolInstaller(chroot_path, pool_path, arch, environ)
281+
print("note these packages will be installed via pool:")
282+
for pkg in pool_packages:
283+
print(f" - {pkg}")
284+
print("these packages will be installed via apt:")
285+
for pkg in other_packages:
286+
print(f" - {pkg}")
287+
pool_installer.install(pool_packages, ignore_errors)
288+
installer.install(other_packages, ignore_errors)
289+
return
243290
else:
244291
packages = list(plan)
292+
logger.debug("using LiveInstaller for ")
293+
logger.debug('\n'.join(packages))
245294
installer = LiveInstaller(chroot_path, apt_proxy, environ)
246295

296+
logger.debug("pre package install")
247297
installer.install(packages, ignore_errors)
298+
logger.debug("post package install")
248299

249300

250301
def cmd_plan_annotate(pool_path: str, inplace: bool, plan_path: str) -> None:
@@ -597,6 +648,7 @@ Environment:
597648
parser.exit(status=1,
598649
message='\nNo command, options or arguments passed\n')
599650
args = parser.parse_args(unparsed)
651+
logger.debug(f"fab command: {' '.join(map(repr, unparsed))}")
600652

601653
if args.command == "query":
602654
cmd_query(args.pool, args.packages)

fablib/installer.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
from typing import (
1515
Iterable, Optional, Dict, Tuple, List, TextIO, IO, AnyStr, cast
1616
)
17+
import logging
18+
logger = logging.getLogger('fab.installer')
1719

1820
import hashlib
1921
import debian
@@ -142,7 +144,7 @@ def _install(
142144

143145
for packages in (high, regular):
144146
if packages:
145-
args = ["install", "--assume-yes"]
147+
args = ["-o", "Debug::pkgProblemResolver=true", "install", "--assume-yes"]
146148
args.extend(extra_apt_args)
147149
apt_return_code = self.chroot.system(
148150
f"apt-get {' '.join((args + packages))}")
@@ -236,7 +238,9 @@ def __init__(
236238

237239
from pool_lib import Pool
238240

241+
logger.debug("initializing pool")
239242
self.pool = Pool(pool_path)
243+
logger.debug("pool initialized")
240244
self.arch = arch
241245

242246
@staticmethod
@@ -281,6 +285,8 @@ def install(
281285

282286
print("getting packages...")
283287
packagedir = join(self.chroot.path, "var/cache/apt/archives")
288+
logger.debug(f"{packagedir=}")
289+
logger.debug(f"{packages=}")
284290
self.pool.get(packagedir, packages, strict=True)
285291

286292
print("generating package index...")

fablib/plan.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
from pool_lib import Pool
2121

2222
from tempfile import TemporaryDirectory
23+
from logging import getLogger
24+
logger = getLogger("fab.plan")
2325

2426

2527
class Error(Exception):
@@ -170,6 +172,7 @@ def is_version_ok(self, version: str) -> bool:
170172

171173
class PackageGetter:
172174
def __init__(self, dep_list: Iterable[Dependency], pool: Pool):
175+
logger.debug(f"initializing PackageGetter({list(map(str, dep_list))}, {pool})")
173176
self._deps: Dict[Dependency, Optional[str]] = {}
174177
def format_dep(dep: Dependency) -> str:
175178
if not dep.restrict or dep.restrict.relation != "=":
@@ -325,12 +328,15 @@ def dctrls(self) -> Dict[Dependency, debfile.Deb822]:
325328

326329
return dctrls
327330

328-
def resolve(self) -> Iterable[str]:
331+
def resolve(self) -> tuple[Iterable[str], Iterable[str]]:
329332
"""resolve plan dependencies recursively -> return spec"""
333+
logger.debug("resolve")
334+
330335
spec = Spec()
336+
logger.debug("(unresolved=)" + repr(list(self)))
331337

332338
if not self.pool:
333-
return list(self)
339+
return list(self), []
334340

335341
resolved: Set[Dependency] = set()
336342
missing: Set[Dependency] = set()
@@ -350,6 +356,7 @@ def reformat2dep(pkg: str) -> str:
350356
packages = PackageGetter(unresolved, self.pool)
351357
new_deps: Set[Dependency] = set()
352358
for dep in unresolved:
359+
logger.debug(f'resolving dependency: {dep}')
353360
package_path = packages[dep]
354361
if not package_path:
355362
continue
@@ -385,11 +392,12 @@ def get_origins(dep: Dependency) -> Generator[str, None, None]:
385392
except KeyError:
386393
depname = None
387394

388-
389395
brokendeps = []
390396
for dep in missing:
391-
brokendeps.append("%s (%s)" % (dep, " -> ".join(get_origins(dep))))
397+
brokendeps.append(dep.name)
398+
399+
logger.debug(f'could not find these packages in pool: {brokendeps!r}')
392400

393-
raise Error("broken dependencies: " + "\n".join(brokendeps))
401+
return spec, brokendeps
394402

395-
return spec
403+
return spec, []

fablib/resolve.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
from os.path import join
33
import os
44
from debian.deb822 import Deb822
5+
import logging
56
from .plan import Plan, Spec, PackageOrigins
67

8+
logger = logging.getLogger("fab.resolve")
9+
710
def iter_packages(root: str) -> Generator[str, None, None]:
811
control = ''
912
with open(join(root, "var/lib/dpkg/status"), 'r') as fob:
@@ -16,17 +19,21 @@ def iter_packages(root: str) -> Generator[str, None, None]:
1619
else:
1720
control += line
1821

19-
def annotate_spec(spec: Iterable[str], packageorigins: PackageOrigins) -> str:
20-
if not spec:
22+
def annotate_spec(repo_spec: Iterable[str], pool_spec: Iterable[str], packageorigins: PackageOrigins) -> str:
23+
if not repo_spec and not pool_spec:
2124
return ""
2225

2326
annotated_spec = []
2427

25-
column_len = max(len(s) + 1 for s in spec)
26-
for s in spec:
28+
column_len = max(len(s) + 1 for s in [*repo_spec, *pool_spec])
29+
for s in repo_spec:
2730
name = s.split('=')[0]
2831
origins = " ".join(origin for origin in packageorigins[name])
2932
annotated_spec.append("%s # %s" % (s.ljust(column_len), origins))
33+
for s in pool_spec:
34+
name = s.split('=')[0]
35+
origins = " ".join(origin for origin in packageorigins[name])
36+
annotated_spec.append("%s # %s [FORCE_POOL]" % (s.ljust(column_len), origins))
3037

3138
return '\n'.join(annotated_spec)
3239

@@ -57,8 +64,11 @@ def resolve_plan(
5764
plan.add(plan_path)
5865
plan.packageorigins.add(plan_path, "_")
5966

60-
spec = plan.resolve()
61-
spec = annotate_spec(spec, plan.packageorigins)
67+
spec, unresolved = plan.resolve()
68+
logger.debug("unresolved" + '\n'.join(unresolved))
69+
spec = annotate_spec(unresolved, spec, plan.packageorigins)
70+
logger.debug(spec)
71+
logger.debug(f"{output_path=}")
6272

6373
if output_path == '-':
6474
print(spec)

share/product.mk

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ define clean/body
255255
$(call remove-deck, $O/root.patched)
256256
$(call remove-deck, $O/root.build)
257257
$(call remove-deck, $O/bootstrap)
258-
-rm -rf $O/root.spec $O/cdroot $O/product.iso $O/log $(STAMPS_DIR)
258+
-rm -rf $O/root.spec $O/cdroot $O/product.iso $O/log $O/screens $(STAMPS_DIR)
259259
endef
260260

261261
clean:
@@ -562,7 +562,15 @@ $(STAMPS_DIR)/$1: $$($1/deps) $$($1/deps/extra)
562562
touch $$@
563563
endef
564564

565+
ifeq (, $(shell command -v tkldev-detective))
566+
lint:
567+
$(error "tkldev-detective not found, (apt install tkldev-detective)")
568+
else
569+
lint:
570+
tkldev-detective lint $(shell realpath $O/..)
571+
endif
572+
565573
STAMPED_TARGETS := bootstrap root.spec root.build root.patched root.sandbox cdroot
566574
$(foreach target,$(STAMPED_TARGETS),$(eval $(call _stamped_target,$(target))))
567575

568-
.PHONY: all debug redeck help clean cdroot-dynamic updated-initramfs $(STAMPED_TARGETS)
576+
.PHONY: all debug redeck help clean cdroot-dynamic updated-initramfs $(STAMPED_TARGETS) lint

0 commit comments

Comments
 (0)