Hello community, here is the log from the commit of package openSUSE-release-tools for openSUSE:Factory checked in at 2017-12-08 21:48: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" Fri Dec 8 21:48:42 2017 rev:29 rq:555262 version:20171208.d7c5a3e Changes: -------- --- /work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes 2017-12-07 13:54:27.079947177 +0100 +++ /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new/openSUSE-release-tools.changes 2017-12-08 21:49:01.826830477 +0100 @@ -1,0 +2,13 @@ +Fri Dec 08 14:57:15 UTC 2017 - opensuse-releaset...@opensuse.org + +- Update to version 20171208.d7c5a3e: + * compare_pkglist: do not submit package if it has removed from target + * pkglistgen: dump_solv function + * pkglistgen: add droplist generator + * pkglistgen: include locales and suggested + * biarchtool: blacklist 000release-packages + * biarchtool: also work for rings + * biarchtool: blacklist patterns that are in ring1 + * biarchtool: fetch all packagemetas at once + +------------------------------------------------------------------- Old: ---- openSUSE-release-tools-20171205.1769209.obscpio New: ---- openSUSE-release-tools-20171208.d7c5a3e.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openSUSE-release-tools.spec ++++++ --- /var/tmp/diff_new_pack.LP4OnR/_old 2017-12-08 21:49:02.490801915 +0100 +++ /var/tmp/diff_new_pack.LP4OnR/_new 2017-12-08 21:49:02.494801743 +0100 @@ -20,7 +20,7 @@ %define source_dir osc-plugin-factory %define announcer_filename factory-package-news Name: openSUSE-release-tools -Version: 20171205.1769209 +Version: 20171208.d7c5a3e 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.LP4OnR/_old 2017-12-08 21:49:02.530800195 +0100 +++ /var/tmp/diff_new_pack.LP4OnR/_new 2017-12-08 21:49:02.530800195 +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">b165e07db38620d12e4adcd078bbe00fe192d5b8</param> + <param name="changesrevision">d7c5a3e1761e2e9980c48cc7b6424e913ae6bff4</param> </service> </servicedata> ++++++ openSUSE-release-tools-20171205.1769209.obscpio -> openSUSE-release-tools-20171208.d7c5a3e.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20171205.1769209/biarchtool.py new/openSUSE-release-tools-20171208.d7c5a3e/biarchtool.py --- old/openSUSE-release-tools-20171205.1769209/biarchtool.py 2017-12-05 13:20:49.000000000 +0100 +++ new/openSUSE-release-tools-20171208.d7c5a3e/biarchtool.py 2017-12-08 15:46:48.000000000 +0100 @@ -44,6 +44,7 @@ self.packages = [] self.arch = 'i586' self.rdeps = None + self.package_metas = dict() self.whitelist = { 'i586': set([ 'bzr', @@ -62,6 +63,11 @@ 'openSUSE-EULAs', # translate-toolkit 'skelcd-openSUSE', 'plasma5-workspace', + 'patterns-base', + 'patterns-fonts', + 'patterns-rpm-macros', + 'patterns-yast', + '000release-packages', ]), } @@ -76,19 +82,31 @@ if package in self._has_baselibs: return self._has_baselibs[package] + is_multibuild = False + srcpkgname = package + if ':' in package: + is_multibuild = True + srcpkgname = package.split(':')[0] + ret = False - files = self.get_filelist(self.project, package) + files = self.get_filelist(self.project, srcpkgname) if 'baselibs.conf' in files: logger.debug('%s has baselibs', package) - ret = True + if is_multibuild: + logger.warn('%s is multibuild and has baselibs. canot handle that!', package) + else: + ret = True elif '_link' in files: - files = self.get_filelist(self.project, package, expand = True) + files = self.get_filelist(self.project, srcpkgname, expand = True) if 'baselibs.conf' in files: logger.warn('%s is linked to a baselibs package', package) + elif is_multibuild: + logger.warn('%s is multibuild', package) self._has_baselibs[package] = ret return ret def is_biarch_recursive(self, package): + logger.debug(package) if package in self.blacklist[self.arch]: logger.debug('%s is blacklisted', package) return False @@ -110,10 +128,21 @@ def _init_biarch_packages(self): if self.biarch_packages is None: - self.biarch_packages = set(self.meta_get_packagelist("%s:Rings:0-Bootstrap"%self.project)) - self.biarch_packages |= set(self.meta_get_packagelist("%s:Rings:1-MinimalX"%self.project)) + if ':Rings' in self.project: + self.biarch_packages = set() + else: + self.biarch_packages = set(self.meta_get_packagelist("%s:Rings:0-Bootstrap"%self.project)) + self.biarch_packages |= set(self.meta_get_packagelist("%s:Rings:1-MinimalX"%self.project)) self._init_rdeps() + self.fill_package_meta() + + def fill_package_meta(self): + url = self.makeurl(['search', 'package'], "match=[@project='%s']" % self.project) + root = ET.fromstring(self.cached_GET(url)) + for p in root.findall('package'): + name = p.attrib['name'] + self.package_metas[name] = p def _init_rdeps(self): if self.rdeps is not None: @@ -125,6 +154,9 @@ name = pnode.get('name') for depnode in pnode.findall('pkgdep'): depname = depnode.text + if depname == name: + logger.warn('%s requires itself for build', name) + continue self.rdeps.setdefault(name, set()).add(depname) def select_packages(self, packages): @@ -174,8 +206,10 @@ changed = False logger.debug("processing %s", pkg) - pkgmetaurl = self.makeurl(['source', self.project, pkg, '_meta']) - pkgmeta = ET.fromstring(self.cached_GET(pkgmetaurl)) + if not pkg in self.package_metas: + logger.error("%s not found", pkg) + continue + pkgmeta = self.package_metas[pkg] for build in pkgmeta.findall("./build"): for n in build.findall("./enable[@arch='{}']".format(self.arch)): @@ -185,6 +219,7 @@ if changed: try: + pkgmetaurl = self.makeurl(['source', self.project, pkg, '_meta']) self.http_PUT(pkgmetaurl, data=ET.tostring(pkgmeta)) if self.caching: self._invalidate__cached_GET(pkgmetaurl) @@ -203,8 +238,10 @@ changed = False logger.debug("processing %s", pkg) - pkgmetaurl = self.makeurl(['source', self.project, pkg, '_meta']) - pkgmeta = ET.fromstring(self.cached_GET(pkgmetaurl)) + if not pkg in self.package_metas: + logger.error("%s not found", pkg) + continue + pkgmeta = self.package_metas[pkg] build = pkgmeta.findall("./build") if not build: @@ -217,6 +254,7 @@ if changed: try: + pkgmetaurl = self.makeurl(['source', self.project, pkg, '_meta']) self.http_PUT(pkgmetaurl, data=ET.tostring(pkgmeta)) if self.caching: self._invalidate__cached_GET(pkgmetaurl) @@ -231,16 +269,13 @@ def enable_baselibs_packages(self, force=False, wipebinaries=False): self._init_biarch_packages() + todo = dict() for pkg in self.packages: logger.debug("processing %s", pkg) - pkgmetaurl = self.makeurl(['source', self.project, pkg, '_meta']) - try: - pkgmeta = ET.fromstring(self.cached_GET(pkgmetaurl)) - except urllib2.HTTPError as e: - # catch deleted packages - if e.code == 404: - continue - raise e + if not pkg in self.package_metas: + logger.error("%s not found", pkg) + continue + pkgmeta = self.package_metas[pkg] is_enabled = None is_disabled = None @@ -294,17 +329,26 @@ logger.error('build tag not found in %s/%s!?', pkg, self.arch) if changed: - try: - self.http_PUT(pkgmetaurl, data=ET.tostring(pkgmeta)) - if self.caching: - self._invalidate__cached_GET(pkgmetaurl) - if must_disable and wipebinaries: - self.http_POST(self.makeurl(['build', self.project], { - 'cmd' : 'wipe', - 'arch': self.arch, - 'package' : pkg })) - except urllib2.HTTPError as e: - logger.error('failed to update %s: %s', pkg, e) + todo[pkg] = pkgmeta + + if todo: + logger.info("applying changes") + for pkg in sorted(todo.keys()): + pkgmeta = todo[pkg] + try: + pkgmetaurl = self.makeurl(['source', self.project, pkg, '_meta']) + self.http_PUT(pkgmetaurl, data=ET.tostring(pkgmeta)) + if self.caching: + self._invalidate__cached_GET(pkgmetaurl) + + if wipebinaries and pkgmeta.find("./build/disable[@arch='{}']".format(self.arch)) is not None: + logger.debug("wiping %s", pkg) + self.http_POST(self.makeurl(['build', self.project], { + 'cmd' : 'wipe', + 'arch': self.arch, + 'package' : pkg })) + except urllib2.HTTPError as e: + logger.error('failed to update %s: %s', pkg, e) class CommandLineInterface(ToolBase.CommandLineInterface): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20171205.1769209/compare_pkglist.py new/openSUSE-release-tools-20171208.d7c5a3e/compare_pkglist.py --- old/openSUSE-release-tools-20171205.1769209/compare_pkglist.py 2017-12-05 13:20:49.000000000 +0100 +++ new/openSUSE-release-tools-20171208.d7c5a3e/compare_pkglist.py 2017-12-08 15:46:48.000000000 +0100 @@ -156,6 +156,11 @@ existin_packages = self.get_source_packages(self.existin) if not self.removedonly: + if self.submitto: + dest = self.submitto + else: + dest = self.new_prj + removed_pkgs_in_target = self.removed_pkglist(dest) submit_counter = 0 for pkg in source: if pkg.startswith('000') or pkg.startswith('_'): @@ -171,7 +176,12 @@ if pkg not in existin_packages: continue + if pkg in removed_pkgs_in_target: + print("New package but has removed from {:<8} - {}".format(self.new_prj, pkg)) + continue + print("New package than {:<8} - {}".format(self.new_prj, pkg)) + if self.submit: if self.submit_limit and submit_counter > int(self.submit_limit): return diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20171205.1769209/pkglistgen.py new/openSUSE-release-tools-20171208.d7c5a3e/pkglistgen.py --- old/openSUSE-release-tools-20171205.1769209/pkglistgen.py 2017-12-05 13:20:49.000000000 +0100 +++ new/openSUSE-release-tools-20171208.d7c5a3e/pkglistgen.py 2017-12-08 15:46:48.000000000 +0100 @@ -37,6 +37,13 @@ import subprocess import re import yaml +import requests +import urlparse +from StringIO import StringIO +import gzip +import tempfile +import random +import string import ToolBase @@ -728,6 +735,125 @@ fh.close() return global_update + def do_create_droplist(self, subcmd, opts, *oldsolv): + """${cmd_name}: generate list of obsolete packages + + The globally specified repositories are taken as the current + package set. All solv files specified on the command line + are old versions of those repos. + + The command outputs all package names that are no longer + contained in or provided by the current repos. + + ${cmd_usage} + ${cmd_option_list} + """ + + drops = dict() + + for arch in self.tool.architectures: + + for old in oldsolv: + + logger.debug("%s: processing %s", arch, old) + + pool = solv.Pool() + pool.setarch(arch) + + for prp in self.tool.repos: + project, repo = prp.split('/') + fn = os.path.join(CACHEDIR, 'repo-{}-{}-{}.solv'.format(project, repo, arch)) + r = pool.add_repo(prp) + r.add_solv(fn) + + sysrepo = pool.add_repo(os.path.basename(old).replace('.repo.solv', '')) + sysrepo.add_solv(old) + + pool.createwhatprovides() + + for s in sysrepo.solvables: + haveit = False + for s2 in pool.whatprovides(s.nameid): + if s2.repo == sysrepo or s.nameid != s2.nameid: + continue + haveit = True + if haveit: + continue + nevr = pool.rel2id(s.nameid, s.evrid, solv.REL_EQ) + for s2 in pool.whatmatchesdep(solv.SOLVABLE_OBSOLETES, nevr): + if s2.repo == sysrepo: + continue + haveit = True + if haveit: + continue + if s.name not in drops: + drops[s.name] = sysrepo.name + + # mark it explicitly to avoid having 2 pools while GC is not run + del pool + + for reponame in sorted(set(drops.values())): + print "<!-- %s -->" % reponame + for p in sorted(drops): + if drops[p] != reponame: continue + print " <obsoletepackage>%s</obsoletepackage>" % p + + @cmdln.option('--overwrite', action='store_true', help='overwrite if output file exists') + def do_dump_solv(self, subcmd, opts, baseurl): + """${cmd_name}: fetch repomd and dump solv + + If an output directory is specified, a file named according + to the build is created there. Otherwise the solv file is + dumped to stdout. + + ${cmd_usage} + ${cmd_option_list} + """ + + name = None + ofh = sys.stdout + if self.options.output_dir: + url = urlparse.urljoin(baseurl, 'media.1/media') + with requests.get(url) as media: + for i, line in enumerate(media.iter_lines()): + if i != 1: + continue + name = line + if name is None or '-Build' not in name: + raise Exception('media.1/media includes no build number') + + name = '{}/{}.solv'.format(self.options.output_dir, name) + if not opts.overwrite and os.path.exists(name): + logger.info("%s exists", name) + return + ofh = open(name + '.new', 'w') + + pool = solv.Pool() + pool.setarch() + + repo = pool.add_repo(''.join(random.choice(string.letters) for _ in range(5))) + f = tempfile.TemporaryFile() + url = urlparse.urljoin(baseurl, 'repodata/repomd.xml') + repomd = requests.get(url) + 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) + os.lseek(f.fileno(), 0, os.SEEK_SET) + repo.add_repomdxml(f, 0) + url = urlparse.urljoin(baseurl, location) + with requests.get(url, stream=True) as primary: + content = gzip.GzipFile(fileobj=StringIO(primary.content)) + os.lseek(f.fileno(), 0, os.SEEK_SET) + f.write(content.read()) + os.lseek(f.fileno(), 0, os.SEEK_SET) + # TODO: verify checksum + repo.add_rpmmd(f, None, 0) + repo.create_stubs() + repo.write(ofh) + + if name is not None: + os.rename(name + '.new', name) @cmdln.option('--ignore-unresolvable', action='store_true', help='ignore unresolvable and missing packges') @cmdln.option('--ignore-recommended', action='store_true', help='do not include recommended packages automatically') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20171205.1769209/script/osrt-pkglistgen-openSUSE:Leap:15.0-all new/openSUSE-release-tools-20171208.d7c5a3e/script/osrt-pkglistgen-openSUSE:Leap:15.0-all --- old/openSUSE-release-tools-20171205.1769209/script/osrt-pkglistgen-openSUSE:Leap:15.0-all 2017-12-05 13:20:49.000000000 +0100 +++ new/openSUSE-release-tools-20171208.d7c5a3e/script/osrt-pkglistgen-openSUSE:Leap:15.0-all 2017-12-08 15:46:48.000000000 +0100 @@ -1,4 +1,6 @@ #!/bin/bash +export LOCALES_FROM=openSUSE-product +export INCLUDE_SUGGESTED=1 osrt-pkglistgen-openSUSE:Leap:15.0 osrt-pkglistgen-openSUSE:Leap:15.0:Rings osrt-pkglistgen-openSUSE:Leap:15.0:Staging ++++++ openSUSE-release-tools.obsinfo ++++++ --- /var/tmp/diff_new_pack.LP4OnR/_old 2017-12-08 21:49:03.134774214 +0100 +++ /var/tmp/diff_new_pack.LP4OnR/_new 2017-12-08 21:49:03.134774214 +0100 @@ -1,5 +1,5 @@ name: openSUSE-release-tools -version: 20171205.1769209 -mtime: 1512476449 -commit: 1769209240a34cf227c92baae46e2aaaccbc762f +version: 20171208.d7c5a3e +mtime: 1512744408 +commit: d7c5a3e1761e2e9980c48cc7b6424e913ae6bff4