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:
parent
2b779f5113
commit
84f5e191ba
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user