Hello community, here is the log from the commit of package openSUSE-release-tools for openSUSE:Factory checked in at 2018-07-06 10:42:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 Jul 6 10:42:11 2018 rev:112 rq:620661 version:20180703.72eb7dc Changes: -------- --- /work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes 2018-07-03 23:36:07.216256900 +0200 +++ /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new/openSUSE-release-tools.changes 2018-07-06 10:42:18.191232782 +0200 @@ -1,0 +2,12 @@ +Tue Jul 03 15:20:29 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180703.72eb7dc: + * pkglistgen: Don't crash on empty groups (unsorted is one) + * pkglistgen: Add --stop-after-solve option to ease debugging + * pkglistgen: Add --no-checkout option to accelerate reruns + * pkglistgen: Calculate the repos list instead of hardcoding + * stagingapi: add support for Backports + * pkglistgen: drop ring 2 + * stagingapi: apply default config first + +------------------------------------------------------------------- Old: ---- openSUSE-release-tools-20180703.29c4b6a.obscpio New: ---- openSUSE-release-tools-20180703.72eb7dc.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openSUSE-release-tools.spec ++++++ --- /var/tmp/diff_new_pack.s9PNVY/_old 2018-07-06 10:42:19.123231672 +0200 +++ /var/tmp/diff_new_pack.s9PNVY/_new 2018-07-06 10:42:19.123231672 +0200 @@ -20,7 +20,7 @@ %define source_dir openSUSE-release-tools %define announcer_filename factory-package-news Name: openSUSE-release-tools -Version: 20180703.29c4b6a +Version: 20180703.72eb7dc Release: 0 Summary: Tools to aid in staging and release work for openSUSE/SUSE License: GPL-2.0-or-later AND MIT ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.s9PNVY/_old 2018-07-06 10:42:19.163231625 +0200 +++ /var/tmp/diff_new_pack.s9PNVY/_new 2018-07-06 10:42:19.163231625 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param> - <param name="changesrevision">29c4b6a2108ff226f479c5f05f366ed2e8e85bef</param> + <param name="changesrevision">72eb7dc4fc890d1b88c83df1823bc7a860910c4e</param> </service> </servicedata> ++++++ openSUSE-release-tools-20180703.29c4b6a.obscpio -> openSUSE-release-tools-20180703.72eb7dc.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180703.29c4b6a/osclib/conf.py new/openSUSE-release-tools-20180703.72eb7dc/osclib/conf.py --- old/openSUSE-release-tools-20180703.29c4b6a/osclib/conf.py 2018-07-03 15:23:42.000000000 +0200 +++ new/openSUSE-release-tools-20180703.72eb7dc/osclib/conf.py 2018-07-03 17:11:01.000000000 +0200 @@ -107,6 +107,27 @@ 'mail-noreply': 'nore...@opensuse.org', 'mail-release-list': 'opensuse-releaset...@opensuse.org', }, + r'openSUSE:(?P<project>Backports:(?P<version>[^:]+))': { + 'staging': 'openSUSE:%(project)s:Staging', + 'staging-group': 'factory-staging', + 'staging-archs': 'x86_64', + 'lock': 'openSUSE:%(project)s:Staging', + 'lock-ns': 'openSUSE', + 'onlyadi': True, + 'leaper-override-group': 'leap-reviewers', + 'review-team': 'opensuse-review-team', + 'legal-review-group': 'legal-auto', + # review-team optionally added by leaper.py. + 'repo-checker': 'repo-checker', + 'repo_checker-arch-whitelist': 'x86_64', + # 16 hour staging window for follow-ups since lower throughput. + 'splitter-staging-age-max': '57600', + # No special packages since they will pass through Leap first. + 'splitter-special-packages': '', + # Allow `unselect --cleanup` to operate immediately on: + # - Update crawler requests (leaper) + 'unselect-cleanup-whitelist': 'leaper', + }, # Allows devel projects to utilize tools that require config, but not # complete StagingAPI support. r'(?P<project>.*$)': { @@ -114,6 +135,7 @@ 'staging-group': None, 'staging-archs': '', 'staging-dvd-archs': '', + 'onlyadi': False, 'rings': None, 'nonfree': None, 'rebuild': None, @@ -123,7 +145,7 @@ 'lock-ns': None, 'delreq-review': None, 'main-repo': 'openSUSE_Factory', - 'priority': '1000', # Lowest priority as only a fallback. + '_priority': '0', # Apply defaults first }, } @@ -164,12 +186,14 @@ def populate_conf(self): """Add sane default into the configuration.""" defaults = {} - default_ordered = OrderedDict(sorted(DEFAULT.items(), key=lambda i: int(i[1].get('priority', 99)))) + default_ordered = OrderedDict(sorted(DEFAULT.items(), key=lambda i: int(i[1].get('_priority', 99)))) for prj_pattern in default_ordered: match = re.match(prj_pattern, self.project) if match: project = match.group('project') for k, v in DEFAULT[prj_pattern].items(): + if k.startswith('_'): + continue if isinstance(v, basestring) and '%(project)s' in v: defaults[k] = v % {'project': project} elif isinstance(v, basestring) and '%(project.lower)s' in v: @@ -178,7 +202,8 @@ defaults[k] = v % {'version': match.group('version')} else: defaults[k] = v - break + if int(DEFAULT[prj_pattern].get('_priority', 99)) != 0: + break if self.remote_values: defaults.update(self.remote_values) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180703.29c4b6a/osclib/request_splitter.py new/openSUSE-release-tools-20180703.72eb7dc/osclib/request_splitter.py --- old/openSUSE-release-tools-20180703.29c4b6a/osclib/request_splitter.py 2018-07-03 15:23:42.000000000 +0200 +++ new/openSUSE-release-tools-20180703.72eb7dc/osclib/request_splitter.py 2018-07-03 17:11:01.000000000 +0200 @@ -127,7 +127,7 @@ ring = self.ring_get(target_package) if ring: target.set('ring', ring) - elif request_type == 'delete': + elif not self.api.conlyadi and request_type == 'delete': # Delete requests should always be considered in a ring. target.set('ring', 'delete') @@ -140,6 +140,8 @@ request.set('postponed', 'False') def ring_get(self, target_package): + if self.api.conlyadi: + return None if self.api.crings: ring = self.api.ring_packages_for_links.get(target_package) if ring: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180703.29c4b6a/pkglistgen.py new/openSUSE-release-tools-20180703.72eb7dc/pkglistgen.py --- old/openSUSE-release-tools-20180703.29c4b6a/pkglistgen.py 2018-07-03 15:23:42.000000000 +0200 +++ new/openSUSE-release-tools-20180703.72eb7dc/pkglistgen.py 2018-07-03 17:11:01.000000000 +0200 @@ -72,7 +72,6 @@ SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__)) ARCHITECTURES = ['x86_64', 'ppc64le', 's390x', 'aarch64'] -DEFAULT_REPOS = ("openSUSE:Factory/standard") PRODUCT_SERVICE = '/usr/lib/obs/service/create_single_product' @@ -414,7 +413,6 @@ def __init__(self): ToolBase.ToolBase.__init__(self) - self.repos = DEFAULT_REPOS # package -> supportatus self.packages = dict() self.default_support_status = 'l3' @@ -528,6 +526,17 @@ for e in excludes: g.ignore(self.groups[e]) + def expand_project_repo(self, project, repo, repos): + repos.append([project, repo]) + url = makeurl(self.apiurl, ['source', project, '_meta']) + meta = ET.parse(http_GET(url)).getroot() + for path in meta.findall('.//repository[@name="{}"]/path'.format(repo)): + self.expand_project_repo(path.get('project', project), path.get('repository'), repos) + return repos + + def expand_repos(self, project, repo): + return self.expand_project_repo(project, repo, []) + def _check_supplements(self): tocheck = set() tocheck_locales = set() @@ -568,8 +577,7 @@ self.lockjobs[arch] = [] solvables = set() - for prp in self.repos: - project, reponame = prp.split('/') + for project, reponame in self.repos: repo = pool.add_repo(project) s = os.path.join(CACHEDIR, 'repo-{}-{}-{}.solv'.format(project, reponame, arch)) r = repo.add_solv(s) @@ -692,11 +700,10 @@ def __init__(self, *args, **kwargs): ToolBase.CommandLineInterface.__init__(self, args, kwargs) + self.repos = [] def get_optparser(self): parser = ToolBase.CommandLineInterface.get_optparser(self) - parser.add_option('-r', '--repositories', dest='repos', metavar='REPOS', action='append', - help='repositories to process (%s)' % DEFAULT_REPOS) parser.add_option('-i', '--input-dir', dest='input_dir', metavar='DIR', help='input directory', default='.') parser.add_option('-o', '--output-dir', dest='output_dir', metavar='DIR', @@ -712,19 +719,11 @@ tool.input_dir = self.options.input_dir tool.output_dir = self.options.output_dir tool.default_support_status = self.options.default_support_status + tool.repos = self.repos if self.options.architectures: tool.architectures = self.options.architectures else: tool.architectures = ARCHITECTURES - if self.options.repos: - repos = [] - for r in self.options.repos: - # handle comas as well, easier for shell script for now - if ',' in r: - repos += r.split(',') - else: - repos.append(r) - tool.repos = repos return tool def do_list(self, subcmd, opts): @@ -769,8 +768,7 @@ # only there to parse the repos bs_mirrorfull = os.path.join(SCRIPT_PATH, 'bs_mirrorfull') global_update = False - for prp in self.tool.repos: - project, repo = prp.split('/') + for project, repo in self.repos: for arch in self.tool.architectures: # TODO: refactor to common function with repo_checker.py d = os.path.join(CACHEDIR, project, repo, arch) @@ -804,8 +802,7 @@ def update_merge(self, nonfree): """Merge free and nonfree solv files or copy free to merged""" - for prp in self.tool.repos: - project, repo = prp.split('/') + for project, repo in self.repos: for arch in self.tool.architectures: solv_file = os.path.join( CACHEDIR, 'repo-{}-{}-{}.solv'.format(project, repo, arch)) @@ -840,8 +837,7 @@ def do_create_sle_weakremovers(self, subcmd, opts, *prjs): for prj in prjs: logger.debug("processing %s", prj) - self.options.repos = ['/'.join([prj, 'standard'])] - self.postoptparse() + self.expand_repos(prj, 'standard') opts.project = prj self.do_update('update', opts) @@ -853,7 +849,7 @@ sysrepo = None for prp in prjs: fn = os.path.join(CACHEDIR, 'repo-{}-{}-{}.solv'.format(prp, 'standard', arch)) - r = pool.add_repo(prp) + r = pool.add_repo('/'.join([prj, 'standard'])) r.add_solv(fn) if not sysrepo: sysrepo = r @@ -922,10 +918,9 @@ pool = solv.Pool() pool.setarch(arch) - for prp in self.tool.repos: - project, repo = prp.split('/') + for project, repo in self.tool.repos: fn = os.path.join(CACHEDIR, 'repo-{}-{}-{}.solv'.format(project, repo, arch)) - r = pool.add_repo(prp) + r = pool.add_repo() r.add_solv(fn) sysrepo = pool.add_repo(os.path.basename(old).replace('.merged.solv', '')) @@ -1117,6 +1112,8 @@ for group in self.tool.output: groupname = group.keys()[0] settings = group[groupname] + if not settings: # e.g. unsorted + settings = {} includes = settings.get('includes', []) excludes = settings.get('excludes', []) self.tool.solve_module(groupname, includes, excludes) @@ -1150,6 +1147,8 @@ @cmdln.option('-f', '--force', action='store_true', help='continue even if build is in progress') @cmdln.option('-p', '--project', help='target project') @cmdln.option('-s', '--scope', default='all', help='scope on which to operate ({})'.format(', '.join(SCOPES))) + @cmdln.option('--no-checkout', action='store_true', help='reuse checkout in cache') + @cmdln.option('--stop-after-solve', action='store_true', help='only create group files') def do_update_and_solve(self, subcmd, opts): """${cmd_name}: update and solve for given scope @@ -1185,47 +1184,26 @@ main_repo = target_config['main-repo'] if opts.scope == 'target': - self.options.repos = ['/'.join([target_project, main_repo])] + self.repos = self.tool.expand_repos(target_project, main_repo) self.update_and_solve_target_wrapper(apiurl, target_project, target_config, main_repo, opts, drop_list=True) return self.error_occured elif opts.scope == 'ports': # TODO Continue supporting #1297, but should be abstracted. main_repo = 'ports' opts.project += ':Ports' - self.options.repos = ['/'.join([opts.project, main_repo])] + self.repos = self.tool.expand_repos(opts.project, main_repo) self.update_and_solve_target_wrapper(apiurl, target_project, target_config, main_repo, opts, drop_list=True) return self.error_occured elif opts.scope == 'rings': opts.project = api.rings[1] - self.options.repos = [ - '/'.join([api.rings[1], main_repo]), - '/'.join([api.rings[0], main_repo]), - ] + self.repos = self.tool.expand_repos(api.rings[1], main_repo) self.update_and_solve_target_wrapper(apiurl, target_project, target_config, main_repo, opts) - - opts.project = api.rings[2] - self.options.repos.insert(0, '/'.join([api.rings[2], main_repo])) - self.update_and_solve_target_wrapper(apiurl, target_project, target_config, - main_repo, opts, skip_release=True) return self.error_occured elif opts.scope == 'staging': letters = api.get_staging_projects_short() for letter in letters: opts.project = api.prj_from_short(letter) - self.options.repos = ['/'.join([opts.project, main_repo])] - - if not api.is_staging_bootstrapped(opts.project): - self.options.repos.append('/'.join([opts.project, 'bootstrap_copy'])) - - # DVD project first since it depends on main. - if api.item_exists(opts.project + ':DVD'): - opts_dvd = copy.deepcopy(opts) - opts_dvd.project += ':DVD' - self.options.repos.insert(0, '/'.join([opts_dvd.project, main_repo])) - self.update_and_solve_target_wrapper( - apiurl, target_project, target_config, main_repo, opts_dvd, skip_release=True) - self.options.repos.pop(0) - + self.repos = self.tool.expand_repos(opts.project, main_repo) self.update_and_solve_target_wrapper(apiurl, target_project, target_config, main_repo, opts) return self.error_occured @@ -1278,15 +1256,19 @@ host = urlparse.urlparse(apiurl).hostname cache_dir = save_cache_path('opensuse-packagelists', host, opts.project) - if os.path.exists(cache_dir): - shutil.rmtree(cache_dir) - os.makedirs(cache_dir) + if not opts.no_checkout: + if os.path.exists(cache_dir): + shutil.rmtree(cache_dir) + os.makedirs(cache_dir) group_dir = os.path.join(cache_dir, group) product_dir = os.path.join(cache_dir, product) release_dir = os.path.join(cache_dir, release) for package in checkout_list: + if opts.no_checkout: + print("Skipping checkout of {}/{}".format(opts.project, package)) + continue checkout_package(apiurl, opts.project, package, expand_link=True, prj_dir=cache_dir) if not skip_release: @@ -1309,17 +1291,14 @@ print('-> do_update nonfree') # Switch to nonfree repo (ugly, but that's how the code was setup). - self.options.repos_ = self.options.repos - self.options.repos = ['/'.join([nonfree, main_repo])] - self.postoptparse() - + repos_ = self.repos opts_nonfree = copy.deepcopy(opts) opts_nonfree.project = nonfree + self.repos = self.expand_repos(nonfree, main_repo) self.do_update('update', opts_nonfree) # Switch repo back to main target project. - self.options.repos = self.options.repos_ - self.postoptparse() + self.repos = repos_ print('-> update_merge') self.update_merge(nonfree if drop_list else False) @@ -1331,6 +1310,8 @@ opts.locale = target_config.get('pkglistgen-local') opts.locales_from = target_config.get('pkglistgen-locales-from') self.do_solve('solve', opts) + if opts.stop_after_solve: + return if drop_list: # Ensure solv files from all releases in product family are updated. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180703.29c4b6a/tests/config_tests.py new/openSUSE-release-tools-20180703.72eb7dc/tests/config_tests.py --- old/openSUSE-release-tools-20180703.29c4b6a/tests/config_tests.py 2018-07-03 15:23:42.000000000 +0200 +++ new/openSUSE-release-tools-20180703.72eb7dc/tests/config_tests.py 2018-07-03 17:11:01.000000000 +0200 @@ -47,6 +47,7 @@ projects = ( 'openSUSE:Factory', 'openSUSE:Leap:15.0', + 'openSUSE:Backports:SLE-15', 'SUSE:SLE-15:GA', 'SUSE:SLE-12:GA', 'GNOME:Factory', ++++++ openSUSE-release-tools.obsinfo ++++++ --- /var/tmp/diff_new_pack.s9PNVY/_old 2018-07-06 10:42:19.627231073 +0200 +++ /var/tmp/diff_new_pack.s9PNVY/_new 2018-07-06 10:42:19.631231068 +0200 @@ -1,5 +1,5 @@ name: openSUSE-release-tools -version: 20180703.29c4b6a -mtime: 1530624222 -commit: 29c4b6a2108ff226f479c5f05f366ed2e8e85bef +version: 20180703.72eb7dc +mtime: 1530630661 +commit: 72eb7dc4fc890d1b88c83df1823bc7a860910c4e