Hello community,
here is the log from the commit of package openSUSE-release-tools for
openSUSE:Factory checked in at 2018-02-15 13:27:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old)
and /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openSUSE-release-tools"
Thu Feb 15 13:27:42 2018 rev:56 rq:576855 version:20180213.c589ef1
Changes:
--------
---
/work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes
2018-02-14 10:51:24.726137110 +0100
+++
/work/SRC/openSUSE:Factory/.openSUSE-release-tools.new/openSUSE-release-tools.changes
2018-02-15 13:27:54.666734970 +0100
@@ -1,0 +2,8 @@
+Tue Feb 13 20:54:11 UTC 2018 - [email protected]
+
+- Update to version 20180213.c589ef1:
+ * autopep8 to fix indenting
+ * Move package hints into unsorted.yml
+ * Support unneeded.yml as list of regular expressions
+
+-------------------------------------------------------------------
Old:
----
openSUSE-release-tools-20180213.3e3f458.obscpio
New:
----
openSUSE-release-tools-20180213.c589ef1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openSUSE-release-tools.spec ++++++
--- /var/tmp/diff_new_pack.CRY7oK/_old 2018-02-15 13:28:00.950506735 +0100
+++ /var/tmp/diff_new_pack.CRY7oK/_new 2018-02-15 13:28:00.950506735 +0100
@@ -20,7 +20,7 @@
%define source_dir osc-plugin-factory
%define announcer_filename factory-package-news
Name: openSUSE-release-tools
-Version: 20180213.3e3f458
+Version: 20180213.c589ef1
Release: 0
Summary: Tools to aid in staging and release work for openSUSE/SUSE
License: GPL-2.0+ AND MIT
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.CRY7oK/_old 2018-02-15 13:28:00.990505282 +0100
+++ /var/tmp/diff_new_pack.CRY7oK/_new 2018-02-15 13:28:00.994505137 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://github.com/openSUSE/osc-plugin-factory.git</param>
- <param
name="changesrevision">3e3f4589f990ae2bae13dc05b947c8b0cda41a57</param>
+ <param
name="changesrevision">c6a25fb4f5c0d6aa2c94d1cd7ae13a2f099fa727</param>
</service>
</servicedata>
++++++ openSUSE-release-tools-20180213.3e3f458.obscpio ->
openSUSE-release-tools-20180213.c589ef1.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/openSUSE-release-tools-20180213.3e3f458/pkglistgen.py
new/openSUSE-release-tools-20180213.c589ef1/pkglistgen.py
--- old/openSUSE-release-tools-20180213.3e3f458/pkglistgen.py 2018-02-13
13:27:35.000000000 +0100
+++ new/openSUSE-release-tools-20180213.c589ef1/pkglistgen.py 2018-02-13
21:46:37.000000000 +0100
@@ -47,6 +47,7 @@
import solv
from pprint import pprint, pformat
import os
+import os.path
import subprocess
import re
import yaml
@@ -71,6 +72,7 @@
DEFAULT_REPOS = ("openSUSE:Factory/standard")
PRODUCT_SERVICE = '/usr/lib/obs/service/create_single_product'
+
class Group(object):
def __init__(self, name, pkglist):
@@ -91,7 +93,7 @@
self.comment = ' ### AUTOMATICALLY GENERATED, DO NOT EDIT ### '
self.srcpkgs = None
- self.develpkgs = []
+ self.develpkgs = dict()
self.silents = set()
self.ignored = set()
# special feature for SLE. Patterns are marked for expansion
@@ -163,14 +165,14 @@
self.ignore(g)
self.ignored.add(without)
- def solve(self, ignore_recommended=False, include_suggested = False):
+ def solve(self, ignore_recommended=False, include_suggested=False):
""" base: list of base groups or None """
solved = dict()
for arch in self.architectures:
solved[arch] = dict()
- self.srcpkgs = set()
+ self.srcpkgs = dict()
self.recommends = dict()
self.suggested = dict()
for arch in self.architectures:
@@ -256,7 +258,7 @@
src = s.name
else:
src = s.lookup_str(solv.SOLVABLE_SOURCENAME)
- self.srcpkgs.add(src)
+ self.srcpkgs[src] = group + ':' + s.name
for n, group in self.packages[arch]:
solve_one_package(n, group)
@@ -291,13 +293,15 @@
self.solved = True
def check_dups(self, modules, overlap):
- if not overlap: return
+ if not overlap:
+ return
packages = set(self.solved_packages['*'])
for arch in self.architectures:
packages.update(self.solved_packages[arch])
for m in modules:
# do not check with ourselves and only once for the rest
- if m.name <= self.name: continue
+ if m.name <= self.name:
+ continue
if self.name in m.conflicts or m.name in self.conflicts:
continue
mp = set(m.solved_packages['*'])
@@ -309,8 +313,7 @@
overlap.comment += '\n - ' + p
overlap._add_to_packages(p)
- def collect_devel_packages(self, modules):
- develpkgs = set()
+ def collect_devel_packages(self):
for arch in self.architectures:
pool = self.pkglist._prepare_pool(arch)
sel = pool.Selection()
@@ -322,18 +325,8 @@
else:
src = s.lookup_str(solv.SOLVABLE_SOURCENAME)
- if src in self.srcpkgs:
- develpkgs.add(s.name)
-
- self.develpkgs = []
- for p in develpkgs:
- already_present = False
- for m in modules:
- for arch in ['*'] + self.architectures:
- already_present = already_present or (p in
m.solved_packages[arch])
- already_present = already_present or (p in m.develpkgs)
- if not already_present:
- self.develpkgs.append(p)
+ if src in self.srcpkgs.keys():
+ self.develpkgs[s.name] = self.srcpkgs[src]
def _filter_already_selected(self, modules, pkgdict):
# erase our own - so we don't filter our own
@@ -349,7 +342,7 @@
self._filter_already_selected(modules, self.recommends)
self._filter_already_selected(modules, self.suggested)
- def toxml(self, arch, ignore_broken = False, comment=None):
+ def toxml(self, arch, ignore_broken=False, comment=None):
packages = self.solved_packages[arch]
name = self.name
@@ -391,29 +384,13 @@
logger.error(msg)
name = msg
status = self.pkglist.supportstatus(name)
- attrs = { 'name': name }
+ attrs = {'name': name}
if status is not None:
attrs['supportstatus'] = status
p = ET.SubElement(packagelist, 'package', attrs)
if name in packages:
c = ET.Comment(' reason: {} '.format(packages[name]))
packagelist.append(c)
- if arch == '*' and self.develpkgs:
- c = ET.Comment("\nDevelopment packages:\n - " + "\n -
".join(sorted(self.develpkgs)) + "\n")
- root.append(c)
- if arch == '*' and self.recommends:
- comment = "\nRecommended packages:\n"
- for p in sorted(self.recommends.keys()):
- comment += " - {} # {}\n".format(p, self.recommends[p])
- c = ET.Comment(comment)
- root.append(c)
- if arch == '*' and self.suggested:
- comment = "\nSuggested packages:\n"
- for p in sorted(self.suggested.keys()):
- comment += " - {} # {}\n".format(p, self.suggested[p])
- c = ET.Comment(comment)
- root.append(c)
-
return root
@@ -593,7 +570,7 @@
if hasattr(pool, 'set_namespacecallback'):
pool.set_namespacecallback(cb)
else:
- logger.warn('libsolv missing namespace callback')
+ logger.debug('libsolv missing namespace callback')
for prp in self.repos:
project, reponame = prp.split('/')
@@ -604,7 +581,7 @@
raise Exception("failed to add repo {}/{}/{}. Need to run
update first?".format(project, reponame, arch))
for solvable in repo.solvables_iter():
if solvable.name in solvables:
-
self.lockjobs[arch].append(pool.Job(solv.Job.SOLVER_SOLVABLE|solv.Job.SOLVER_LOCK,
solvable.id))
+
self.lockjobs[arch].append(pool.Job(solv.Job.SOLVER_SOLVABLE |
solv.Job.SOLVER_LOCK, solvable.id))
solvables.add(solvable.name)
pool.addfileprovides()
@@ -612,22 +589,36 @@
return pool
+ # parse file and merge all groups
+ def _parse_unneeded(self, filename):
+ filename = os.path.join(self.input_dir, filename)
+ if not os.path.isfile(filename):
+ return set()
+ fh = open(filename, 'r')
+ logger.debug("reading %s", filename)
+ result = set()
+ for groupname, group in yaml.safe_load(fh).items():
+ result.update(group)
+ return result
+
def _collect_unsorted_packages(self, modules):
+ uneeded_regexps = [re.compile(r)
+ for r in self._parse_unneeded('unneeded.yml')]
+
packages = dict()
for arch in self.architectures:
pool = self._prepare_pool(arch)
sel = pool.Selection()
- p = set([s.name for s in
- pool.solvables_iter() if not
- (s.name.endswith('-32bit') or
- s.name.endswith('-debuginfo') or
- s.name.endswith('-debugsource'))])
+ archpacks = [s.name for s in pool.solvables_iter()]
+ for r in uneeded_regexps:
+ archpacks = [p for p in archpacks if not r.match(p)]
- p -= self.unwanted
+ # convert to set
+ archpacks = set(archpacks) - self.unwanted
for g in modules:
for a in ('*', arch):
- p -= set(g.solved_packages[a].keys())
- for package in p:
+ archpacks -= set(g.solved_packages[a].keys())
+ for package in archpacks:
packages.setdefault(package, []).append(arch)
with open(os.path.join(self.output_dir, 'unsorted.yml'), 'w') as fh:
@@ -639,8 +630,26 @@
fh.write(": [")
fh.write(','.join(sorted(packages[p])))
fh.write("]")
+ reason = self._find_reason(p, modules)
+ if reason:
+ fh.write(' # ' + reason)
fh.write(" \n")
+ # give a hint if the package is related to a group
+ def _find_reason(self, package, modules):
+ # go through the modules multiple times to find the "best"
+ for g in modules:
+ if package in g.recommends:
+ return 'recommended by ' + g.recommends[package]
+ for g in modules:
+ if package in g.suggested:
+ return 'suggested by ' + g.suggested[package]
+ for g in modules:
+ if package in g.develpkgs:
+ return 'devel package of ' + g.develpkgs[package]
+ return None
+
+
class CommandLineInterface(ToolBase.CommandLineInterface):
SCOPES = ['all', 'target', 'rings', 'staging', 'ports']
@@ -847,7 +856,8 @@
for reponame in sorted(set(drops.values())):
print("<!-- %s -->" % reponame, file=ofh)
for p in sorted(drops):
- if drops[p] != reponame: continue
+ if drops[p] != reponame:
+ continue
print(" <obsoletepackage>%s</obsoletepackage>" % p, file=ofh)
@cmdln.option('--overwrite', action='store_true', help='overwrite if
output file exists')
@@ -883,7 +893,7 @@
path_prefix = 'suse/' if name and repo_style == 'build' else ''
url = urlparse.urljoin(baseurl, path_prefix + 'repodata/repomd.xml')
repomd = requests.get(url)
- ns = { 'r': 'http://linux.duke.edu/metadata/repo' }
+ ns = {'r': 'http://linux.duke.edu/metadata/repo'}
root = ET.fromstring(repomd.content)
location = root.find('.//r:data[@type="primary"]/r:location',
ns).get('href')
f.write(repomd.content)
@@ -959,8 +969,7 @@
if opts.locales_from:
with open(os.path.join(self.tool.input_dir, opts.locales_from),
'r') as fh:
root = ET.parse(fh).getroot()
- self.tool.locales |= set([ lang.text for lang in
root.findall(".//linguas/language") ])
-
+ self.tool.locales |= set([lang.text for lang in
root.findall(".//linguas/language")])
modules = []
# the yml parser makes an array out of everything, so
@@ -979,17 +988,18 @@
overlap = self.tool.groups.get('overlap')
for module in modules:
module.check_dups(modules, overlap)
- module.collect_devel_packages(modules)
+ module.collect_devel_packages()
module.filter_already_selected(modules)
if overlap:
- ignores = [ x.name for x in overlap.ignored ]
+ ignores = [x.name for x in overlap.ignored]
self.tool.solve_module(overlap.name, [], ignores)
overlapped = set(overlap.solved_packages['*'])
for arch in overlap.architectures:
overlapped |= set(overlap.solved_packages[arch])
for module in modules:
- if module.name == 'overlap' or module in overlap.ignored:
continue
+ if module.name == 'overlap' or module in overlap.ignored:
+ continue
for arch in ['*'] + module.architectures:
for p in overlapped:
module.solved_packages[arch].pop(p, None)
@@ -1329,4 +1339,3 @@
if __name__ == "__main__":
app = CommandLineInterface()
sys.exit(app.main())
-
++++++ openSUSE-release-tools.obsinfo ++++++
--- /var/tmp/diff_new_pack.CRY7oK/_old 2018-02-15 13:28:01.690479858 +0100
+++ /var/tmp/diff_new_pack.CRY7oK/_new 2018-02-15 13:28:01.694479712 +0100
@@ -1,5 +1,5 @@
name: openSUSE-release-tools
-version: 20180213.3e3f458
-mtime: 1518524855
-commit: 3e3f4589f990ae2bae13dc05b947c8b0cda41a57
+version: 20180213.c589ef1
+mtime: 1518554797
+commit: c589ef11e2a8b8362009b58443735382759aef1a