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 - opensuse-releaset...@opensuse.org + +- 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