repos: Form the basic chroots and cache them

This way, we'll take into account the dependencies
on the packages from the base environment when
sorting the package set topologically.
This commit is contained in:
Ivan A. Melnikov 2023-08-17 17:01:05 +04:00
parent 2b779f5113
commit 84f5e191ba

View File

@ -32,6 +32,11 @@ class Dependency(collections.namedtuple(
| rpm.RPMSENSE_GREATER
| rpm.RPMSENSE_LESS)
@classmethod
def from_names(cls, names):
for name in names:
yield cls(name, 0, None)
@classmethod
def from_header(cls, header, kind):
tp, tf, tv = cls.HEADER_TRIPLETS[kind]
@ -162,9 +167,20 @@ class Chroot:
return any(p.is_provide_for(dep)
for p in self.provides.get(dep.name, ()))
def copy(self):
copy = Chroot()
copy.provides = self.provides.copy()
copy.binaries = self.binaries.copy()
return copy
# consider this repository components by default
DEFAULT_COMPONENTS = ('classic', 'checkinstall')
PKG_INIT_LIST = tuple(Dependency.from_names(
(b'setup', b'filesystem', b'rpm', b'fakeroot')))
PKG_BUILD_LIST = tuple(Dependency.from_names(
(b'basesystem', b'rpm-build', b'kernel-headers-common',
b'sisyphus_check', b'time')))
class Repository:
@ -177,6 +193,9 @@ class Repository:
self.reverse_prov = {} # name -> [(provide, binary)]
self.addon = None
self.reverse_prov_addon = {}
self.base_chroot = None
self.build_chroot = None
self.update_indexes()
def copy(self, new_name):
@ -198,6 +217,10 @@ class Repository:
def update_indexes(self):
self.reverse_prov = self._reverse_provides_index(self.binaries)
self.reverse_prov_addon = self._reverse_provides_index(self.addon)
self.base_chroot = None
self.build_chroot = None
self.base_chroot = self.chroot_for(PKG_INIT_LIST, build=False)
self.build_chroot = self.chroot_for(PKG_BUILD_LIST, build=False)
@classmethod
def load(cls, repo_name, path, arch, components=DEFAULT_COMPONENTS):
@ -271,10 +294,18 @@ class Repository:
del self.binaries[name]
self.update_indexes()
def chroot_for(self, requires, prefer=()):
stack = list(reversed(list(requires)))
chroot = Chroot()
def chroot_for(self, requires, prefer=(), build=True):
prefer = list(prefer)
# rudimentary pkgpriorities
prefer.append(b'altlinux-release-sisyphus')
base_chroot = self.build_chroot if build else self.base_chroot
if base_chroot is not None:
chroot = base_chroot.copy()
else:
chroot = Chroot()
stack = list(reversed(list(requires)))
while stack:
dep = stack.pop()
if chroot.is_provided(dep):