Exclude missing packages

This commit is contained in:
Ludwig Nussel 2017-08-31 17:09:50 +02:00 committed by Stephan Kulow
parent bb3e619e70
commit 937cf41b66

View File

@ -48,9 +48,12 @@ class Group(object):
self.pkglist = pkglist
self.conditional = None
self.packages = dict()
self.locked = dict()
self.solved_packages = None
self.solved = False
self.base = None
self.missing = None
self.flavors = []
def get_solved_packages_recursive(self, arch):
if not self.solved:
@ -76,6 +79,7 @@ class Group(object):
raise Exception("base must be list but is {}".format(type(base)))
solved = dict()
missing = dict()
for arch in ARCHITECTURES:
pool = solv.Pool()
pool.setarch(arch)
@ -89,11 +93,14 @@ class Group(object):
jobs = []
toinstall = set(self.packages['*'])
locked = set(self.locked.get('*', ()))
basepackages = set()
logger.debug("{}: {} common packages".format(self.name, len(toinstall)))
if arch in self.packages:
logger.debug("{}: {} {} packages".format(self.name, arch, len(self.packages[arch])))
toinstall |= self.packages[arch]
if arch in self.locked:
locked |= self.locked[arch]
if base:
for b in base:
logger.debug("{} adding packges from {}".format(self.name, b.name))
@ -103,7 +110,17 @@ class Group(object):
sel = pool.select(str(n), solv.Selection.SELECTION_NAME)
if sel.isempty():
logger.error('{}.{}: package {} not found'.format(self.name, arch, n))
jobs += sel.jobs(solv.Job.SOLVER_INSTALL)
missing.setdefault(arch, set()).add(n)
else:
jobs += sel.jobs(solv.Job.SOLVER_INSTALL)
for n in locked:
sel = pool.select(str(n), solv.Selection.SELECTION_NAME)
if sel.isempty():
logger.warn('{}.{}: locked package {} not found'.format(self.name, arch, n))
else:
jobs += sel.jobs(solv.Job.SOLVER_LOCK)
solver = pool.Solver()
problems = solver.solve(jobs)
@ -111,7 +128,7 @@ class Group(object):
for problem in problems:
# just ignore conflicts here
#if not ' conflicts with ' in str(problem):
logger.error(problem)
logger.error('%s.%s: %s', self.name, arch, problem)
raise Exception('unresolvable')
#logger.warning(problem)
@ -125,16 +142,31 @@ class Group(object):
solved[arch] -= basepackages
common = None
missing_common = None
# compute common packages across all architectures
for arch in solved.keys():
if common is None:
common = set(solved[arch])
continue
common &= solved[arch]
for arch in missing.keys():
if missing_common is None:
missing_common = set(missing[arch])
continue
missing_common &= missing[arch]
# reduce arch specific set by common ones
for arch in solved.keys():
solved[arch] -= common
for arch in missing.keys():
missing[arch] -= missing_common
self.missing = missing
if missing_common:
self.missing['*'] = missing_common
self.solved_packages = solved
self.solved_packages['*'] = common
@ -178,10 +210,14 @@ class Group(object):
if packages:
for name in sorted(packages):
p = ET.SubElement(packagelist, 'package', {
'name' : name,
'supportstatus' : self.pkglist.supportstatus(name)
})
if arch in self.missing and name in self.missing[arch]:
c = ET.Comment(' missing {} '.format(name))
packagelist.append(c)
else:
p = ET.SubElement(packagelist, 'package', {
'name' : name,
'supportstatus' : self.pkglist.supportstatus(name)
})
if autodeps:
c = ET.Comment(' automatic dependencies ')
@ -242,16 +278,24 @@ class PkgListGen(ToolBase.ToolBase):
def _parse_group(self, root):
groupname = root.get('name')
group = Group(groupname, self)
for node in root.findall(".//package"):
name = node.get('name')
arch = node.get('arch', '*')
status = node.get('supportstatus') or ''
logger.debug('group %s, package %s, status %s', groupname, name, status)
self.packages.setdefault(name, dict())
self.packages[name].setdefault(status, set()).add(groupname)
if len(self.packages[name]) > 1:
logger.error("multiple supports states for {}: {}".format(name, pformat(self.packages[name])))
group.packages.setdefault(arch, set()).add(name)
for packagelist in root.findall(".//packagelist"):
rel = packagelist.get('relationship', 'requires')
for node in packagelist.findall(".//package"):
name = node.get('name')
arch = node.get('arch', '*')
status = node.get('supportstatus', '')
logger.debug('group %s %s package %s, status %s', groupname, rel, name, status)
if rel in ('recommends', 'requires'):
self.packages.setdefault(name, dict())
self.packages[name].setdefault(status, set()).add(groupname)
if len(self.packages[name]) > 1:
logger.error("multiple supports states for {}: {}".format(name, pformat(self.packages[name])))
group.packages.setdefault(arch, set()).add(name)
elif rel == 'locks':
group.locked.setdefault(arch, set()).add(name)
else:
raise Exception('{}: unhandled relation {}'.format(groupname, rel))
return group
def _load_group_file(self, fn):
@ -293,7 +337,7 @@ class PkgListGen(ToolBase.ToolBase):
os.unlink(fn)
else:
with open(fn, 'w') as fh:
fh.write(ET.tostring(x, pretty_print = True))
fh.write(ET.tostring(x, pretty_print = True, doctype = '<?xml version="1.0" encoding="UTF-8"?>'))
def _parse_product(self, root):
print(root.find('.//products/product/name').text)
@ -405,6 +449,11 @@ class CommandLineInterface(ToolBase.CommandLineInterface):
setattr(g, name, self.tool.groups[name])
g.sle_minimal.solve()
# g.release_packages_sles.solve()
# g.release_packages_sled.solve(base = g.sle_minimal)
# g.release_packages_leanos.solve(base = g.sle_minimal)
g.sle_base.solve(base = g.sle_minimal)
g.x11_base.solve(base = g.sle_base)
@ -420,6 +469,15 @@ class CommandLineInterface(ToolBase.CommandLineInterface):
g.python.solve(base = g.sle_base)
g.php7.solve(base = g.sle_base)
g.gnome_minimal.solve(base = (g.x11_extended, g.php7))
# g.gnome_extended.solve(base = g.gnome_minimal)
g.qt_standard.solve(base = g.x11_extended)
g.qt_extended.solve(base = g.qt_standard)
# sle_base.dump()
self.tool._write_all_groups()