Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package openSUSE-release-tools for openSUSE:Factory checked in at 2022-03-29 19:45:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old) and /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openSUSE-release-tools" Tue Mar 29 19:45:38 2022 rev:413 rq:965735 version:20220329.3acf5457 Changes: -------- --- /work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes 2022-03-29 18:15:36.367143809 +0200 +++ /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.1900/openSUSE-release-tools.changes 2022-03-29 19:45:45.460143397 +0200 @@ -1,0 +2,55 @@ +Tue Mar 29 16:24:22 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.3acf5457: + * Add aggregates for fiscal quarter and year + +------------------------------------------------------------------- +Tue Mar 29 14:46:51 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.c967b052: + * build-fail-reminder: Several enhancements + +------------------------------------------------------------------- +Tue Mar 29 12:29:00 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.e9c42f69: + * Use all staging archs in adi projects + +------------------------------------------------------------------- +Tue Mar 29 10:06:05 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.39d8309e: + * project-installcheck: Also store first failed results + * project-installcheck: Store when we first saw unresolvables + +------------------------------------------------------------------- +Tue Mar 29 06:56:22 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.425fdc5f: + * staging-installcheck: Fix syntax error + +------------------------------------------------------------------- +Tue Mar 29 06:45:26 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.8e2e22a2: + * project-installcheck: Fix off by one error + +------------------------------------------------------------------- +Tue Mar 29 06:19:52 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.cc1b2e9d: + * project-installcheck: Fix syntax error + +------------------------------------------------------------------- +Tue Mar 29 06:18:19 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.53f00a2b: + * project-installcheck: Only add comments for the run in openSUSE:Factory + +------------------------------------------------------------------- +Tue Mar 29 04:57:24 UTC 2022 - opensuse-releaset...@opensuse.org + +- Update to version 20220329.5a25094e: + * Extend build-fail-reminder to notify about uninstallable packages + +------------------------------------------------------------------- Old: ---- openSUSE-release-tools-20220328.c6d6df6b.obscpio New: ---- openSUSE-release-tools-20220329.3acf5457.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openSUSE-release-tools.spec ++++++ --- /var/tmp/diff_new_pack.uzDNRO/_old 2022-03-29 19:45:46.192144070 +0200 +++ /var/tmp/diff_new_pack.uzDNRO/_new 2022-03-29 19:45:46.192144070 +0200 @@ -20,7 +20,7 @@ %define source_dir openSUSE-release-tools %define announcer_filename factory-package-news Name: openSUSE-release-tools -Version: 20220328.c6d6df6b +Version: 20220329.3acf5457 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.uzDNRO/_old 2022-03-29 19:45:46.256144129 +0200 +++ /var/tmp/diff_new_pack.uzDNRO/_new 2022-03-29 19:45:46.260144133 +0200 @@ -1,7 +1,7 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param> - <param name="changesrevision">00451e3762c75695d32528544751c282014d7d15</param> + <param name="changesrevision">3acf5457ec14993d0c5804d5901d24a5893305c0</param> </service> </servicedata> ++++++ openSUSE-release-tools-20220328.c6d6df6b.obscpio -> openSUSE-release-tools-20220329.3acf5457.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/build-fail-reminder.py new/openSUSE-release-tools-20220329.3acf5457/build-fail-reminder.py --- old/openSUSE-release-tools-20220328.c6d6df6b/build-fail-reminder.py 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/build-fail-reminder.py 2022-03-29 18:23:13.000000000 +0200 @@ -9,22 +9,29 @@ import logging import argparse import sys +import yaml +import dateutil.parser +from urllib.error import HTTPError from osclib.util import mail_send_with_details import email.utils # for maintainer search FACTORY = 'openSUSE:Factory' +SEVEN_DAYS = 7 * 86400 + +apiurl = None +project = None class RemindedPackage(object): - def __init__(self, firstfail, reminded, remindCount, bug): + def __init__(self, firstfail, problem, reminded, remindCount): self.firstfail = firstfail self.reminded = reminded - self.bug = bug self.remindCount = remindCount + self.problem = problem def __str__(self): - return '{} {} {} {}'.format(self.firstfail, self.reminded, self.bug, self.remindCount) + return '{} {} {} {}'.format(self.firstfail, self.reminded, self.remindCount, self.problem) def jdefault(o): @@ -34,19 +41,21 @@ MAIL_TEMPLATES = (u"""Dear %(recipient)s, Please be informed that '%(package)s' in %(project)s has -not had a successful build since %(date)s. See -https://build.opensuse.org/package/show/%(project)s/%(package)s +a problem since %(date)s: + %(problem)s + +See https://build.opensuse.org/package/show/%(project)s/%(package)s This can be due to an error in your package directly or could be caused by a package you depend on to build. In any case, please do your utmost to get the status back to building. -You will get another reminder in a week if the package still fails -by then. +You will get another reminder in a week if the package still shows +problems by then. *** NOTE: This is an attempt to raise awareness of the maintainers about -broken builds in %(project)s. You receive this mail because you are +problems in %(project)s. You receive this mail because you are marked as maintainer for the above mentioned package (or project maintainer if the package has no explicit maintainer assigned) @@ -56,10 +65,11 @@ u"""Dear %(recipient)s, Following-up the reminder of one week ago, we have to inform you that -'%(package)s' is still failing in %(project)s. See +'%(package)s' is still showing a problem in %(project)s. See https://build.opensuse.org/package/show/%(project)s/%(package)s -It has been failing to build since %(date)s. +Since %(date)s we noticed the following problem: + %(problem)s Please find the time to fix the build of this package. If needed, also reach out to the broader community, trying to find somebody to @@ -67,7 +77,7 @@ *** NOTE: This is an attempt to raise awareness of the maintainers about -broken builds in Tumbleweed. You receive this mail because you are +problems in %(project)s. You receive this mail because you are marked as maintainer for the above mentioned package (or project maintainer if the package has no explicit maintainer assigned) @@ -78,7 +88,7 @@ def SendMail(logger, project, sender, to, fullname, subject, text): try: - xmailer = '{} - Failure Notification'.format(project) + xmailer = '{} - Problem Notification'.format(project) to = email.utils.formataddr((fullname, to)) mail_send_with_details(sender=sender, to=to, subject=subject, text=text, xmailer=xmailer, @@ -88,6 +98,37 @@ logger.error("Failed to send an email to %s (%s)" % (fullname, to)) +def check_reminder(pname, first, problem, now, Reminded, RemindedLoaded): + # Only consider packages that failed for > seconds_to_remember days (7 days) + if first >= now - SEVEN_DAYS: + return + if pname not in RemindedLoaded: + # This is the first time we see this package failing for > 7 days + reminded = now + remindCount = 1 + else: + if RemindedLoaded[pname]["reminded"] < now - SEVEN_DAYS: + # We had seen this package in the last run - special treatment + reminded = now + remindCount = RemindedLoaded[pname]["remindCount"] + 1 + else: + reminded = RemindedLoaded[pname]["reminded"] + remindCount = RemindedLoaded[pname]["remindCount"] + Reminded[pname] = RemindedPackage(first, problem, reminded, remindCount) + + +def extract_package_name(source): + _, _, _, rpm = source.split('/') + # strip multibuild flavor + package = rpm.split(':')[0] + # check multi spec origin + url = osc.core.makeurl(apiurl, ['source', project, package]) + root = ET.parse(osc.core.http_GET(url)) + for li in root.findall('linkinfo'): + return li.get('package') + return package + + def main(args): # do some work here @@ -96,21 +137,28 @@ osc.conf.get_config(override_apiurl=args.apiurl) osc.conf.config['debug'] = args.osc_debug + global apiurl apiurl = osc.conf.config['apiurl'] sender = args.sender + global project project = args.project logger.debug('loading build fails for %s' % project) - url = osc.core.makeurl(apiurl, ['projects', project, 'status'], - {'ignore_pending': True, - 'limit_to_fails': True, - 'include_versions': False, - 'format': 'json' - }) - json_data = osc.core.http_GET(url) - data = json.load(json_data) - json_data.close() + url = osc.core.makeurl(apiurl, ['source', f'{project}:Staging', 'dashboard', f'rebuildpacs.{project}-standard.yaml']) + try: + _data = osc.core.http_GET(url) + rebuilddata = yaml.safe_load(_data) + _data.close() + except HTTPError as e: + if e.code == 404: + rebuilddata = {} + else: + raise e + + rebuilddata.setdefault('check', {}) + rebuilddata.setdefault('failed', {}) + rebuilddata.setdefault('unresolvable', {}) reminded_json = args.json if not reminded_json: @@ -119,11 +167,9 @@ try: with open(reminded_json) as json_data: RemindedLoaded = json.load(json_data) - json_data.close() except FileNotFoundError: RemindedLoaded = {} - seconds_to_remember = 7 * 86400 now = int(time.time()) Reminded = {} @@ -131,25 +177,29 @@ ProjectComplainList = [] # Go through all the failed packages and update the reminder - for package in data: - # Only consider packages that failed for > seconds_to_remember days (7 days) - if package["firstfail"] < now - seconds_to_remember: - if not package["name"] in RemindedLoaded.keys(): - # This is the first time we see this package failing for > 7 days - reminded = now - bug = "" - remindCount = 1 - else: - if RemindedLoaded[package["name"]]["reminded"] < now - seconds_to_remember: - # We had seen this package in the last run - special treatment - reminded = now - bug = "boo#123" - remindCount = RemindedLoaded[package["name"]]["remindCount"] + 1 - else: - reminded = RemindedLoaded[package["name"]]["reminded"] - remindCount = RemindedLoaded[package["name"]]["remindCount"] - bug = RemindedLoaded[package["name"]]["bug"] - Reminded[package["name"]] = RemindedPackage(package["firstfail"], reminded, remindCount, bug) + for source, timestamp in rebuilddata['failed'].items(): + date = int(dateutil.parser.parse(timestamp).timestamp()) + check_reminder(extract_package_name(source), date, "Fails to build", now, Reminded, RemindedLoaded) + + for source, timestamp in rebuilddata['unresolvable'].items(): + date = int(dateutil.parser.parse(timestamp).timestamp()) + check_reminder(extract_package_name(source), date, "Unresolvable", now, Reminded, RemindedLoaded) + + repochecks = dict() + for prpa, details in rebuilddata['check'].items(): + package = extract_package_name(prpa) + date = int(dateutil.parser.parse(details["rebuild"]).timestamp()) + repochecks.setdefault(package, {"problems": set(), "rebuild": date}) + for problem in details["problem"]: + repochecks[package]["problems"].add(problem) + + if repochecks[package]["rebuild"] > date: + # prefer the youngest date + repochecks[package]["rebuild"] = date + + for pname in repochecks: + first_problem = sorted(repochecks[pname]["problems"])[0] + check_reminder(pname, repochecks[pname]["rebuild"], f"Uninstallable: {first_problem}", now, Reminded, RemindedLoaded) if not args.dry: with open(reminded_json, 'w') as json_result: @@ -175,12 +225,13 @@ for userid in maintainers: to = Person[userid][2] fullname = Person[userid][1] - subject = '%s - %s - Build fail notification' % (project, package) + subject = '%s - %s - Build problem notification' % (project, package) text = MAIL_TEMPLATES[Reminded[package].remindCount - 1] % { 'recipient': fullname, 'sender': sender, 'project': project, 'package': package, + 'problem': Reminded[package].problem, 'date': time.ctime(Reminded[package].firstfail) } SendMail(logger, project, sender, to, fullname, subject, text) @@ -191,7 +242,7 @@ # Package failed to build for 6 weeks - file a delete request r = osc.core.Request() r.add_action('delete', tgt_project=project, tgt_package=package) - r.description = "[botdel] Package has failed to build for >= 6 weeks" + r.description = "[botdel] Package has had build problems for >= 6 weeks" r.create(apiurl) if len(ProjectComplainList): @@ -203,7 +254,7 @@ text = u"""Dear Package maintainers and hackers. -Below package(s) in %(project)s have been failing to build for at +Below package(s) in %(project)s have had problems for at least 4 weeks. We tried to send out notifications to the configured bugowner/maintainers of the package(s), but so far no fix has been submitted. This probably means that the @@ -213,7 +264,7 @@ """ % {'project': project} for pkg in ProjectComplainList: - text += "- %s\n" % pkg + text += "- %s: %s\n" % (pkg, Reminded[pkg].problem) text += u""" Unless somebody is stepping up and submitting fixes, the listed package(s) are going to be removed from %(project)s. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/gocd/rebuild-trigger.gocd.yaml new/openSUSE-release-tools-20220329.3acf5457/gocd/rebuild-trigger.gocd.yaml --- old/openSUSE-release-tools-20220328.c6d6df6b/gocd/rebuild-trigger.gocd.yaml 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/gocd/rebuild-trigger.gocd.yaml 2022-03-29 18:23:13.000000000 +0200 @@ -19,7 +19,7 @@ tasks: - script: |- echo "openSUSE:Factory" - ./project-installcheck.py --debug check --store openSUSE:Factory:Staging/dashboard openSUSE:Factory + ./project-installcheck.py --debug check --add-comments --store openSUSE:Factory:Staging/dashboard openSUSE:Factory Trigger.Rebuild.Factory.Power: group: openSUSE.Checkers lock_behavior: unlockWhenFinished diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/metrics/access/aggregate.php new/openSUSE-release-tools-20220329.3acf5457/metrics/access/aggregate.php --- old/openSUSE-release-tools-20220328.c6d6df6b/metrics/access/aggregate.php 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/metrics/access/aggregate.php 2022-03-29 18:23:13.000000000 +0200 @@ -154,7 +154,7 @@ function aggregate_all($period) { global $CACHE_DIR; - $intervals = ['day' => 'Y-m-d', 'week' => 'Y-W', 'month' => 'Y-m']; + $intervals = ['day' => 'Y-m-d', 'week' => 'Y-W', 'month' => 'Y-m', 'FQ' => null, 'FY' => null]; $merged = []; $merged_protocol = []; $date_previous = null; @@ -213,7 +213,12 @@ function aggregate($intervals, &$merged, $date, $date_previous, $data, $tags = [], $prefix = 'access') { foreach ($intervals as $interval => $format) { - $value = $date->format($format); + if ($interval == 'FQ') + $value = format_FQ($date); + elseif ($interval == 'FY') + $value = format_FY($date); + else + $value = $date->format($format); if (!isset($merged[$interval]) || $value != $merged[$interval]['value']) { if (!empty($merged[$interval]['data'])) { $summary = summarize($merged[$interval]['data']); @@ -245,6 +250,23 @@ } } +function format_FQ($date) +{ + $financial_date = clone $date; + date_add($financial_date, date_interval_create_from_date_string('2 months')); + $quarter = ceil($financial_date->format('n')/3); + + return $financial_date->format('Y') . '-' . $quarter; +} + +function format_FY($date) +{ + $financial_date = clone $date; + date_add($financial_date, date_interval_create_from_date_string('2 months')); + + return $financial_date->format('Y'); +} + function normalize(&$data) { // Ensure fields added later, that are not present in all data, are available. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/osclib/stagingapi.py new/openSUSE-release-tools-20220329.3acf5457/osclib/stagingapi.py --- old/openSUSE-release-tools-20220328.c6d6df6b/osclib/stagingapi.py 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/osclib/stagingapi.py 2022-03-29 18:23:13.000000000 +0200 @@ -1431,12 +1431,16 @@ {repository} <path project="{self.cstaging}" repository="standard"/> <path project="{self.project}" repository="standard"/> - <arch>x86_64</arch> </repository> {images_repo} {containerfile_repo} </project>""" + root = ET.fromstring(meta) + repository = root.find('.//repository[@name="standard"]') + for arch in self.cstaging_archs: + a = ET.SubElement(repository, 'arch') + a.text = arch url = make_meta_url('prj', name, self.apiurl) http_PUT(url, data=meta) # put twice because on first put, the API adds useless maintainer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/osclib/util.py new/openSUSE-release-tools-20220329.3acf5457/osclib/util.py --- old/openSUSE-release-tools-20220328.c6d6df6b/osclib/util.py 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/osclib/util.py 2022-03-29 18:23:13.000000000 +0200 @@ -154,6 +154,7 @@ msg.add_header('X-Mailer', xmailer) msg.add_header('Precedence', 'bulk') if dry: + logger.debug(text) logger.debug(msg.as_string()) return logger.info("%s: %s", msg['To'], msg['Subject']) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/project-installcheck.py new/openSUSE-release-tools-20220329.3acf5457/project-installcheck.py --- old/openSUSE-release-tools-20220328.c6d6df6b/project-installcheck.py 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/project-installcheck.py 2022-03-29 18:23:13.000000000 +0200 @@ -1,6 +1,5 @@ #!/usr/bin/python3 -import datetime import difflib import hashlib import logging @@ -10,6 +9,8 @@ import sys import tempfile import cmdln +import dateutil.parser +from datetime import datetime, timedelta from urllib.parse import urlencode import yaml @@ -32,17 +33,20 @@ self.store_project = None self.store_package = None self.rebuild = None + self.comment = None def parse_store(self, project_package): if project_package: self.store_project, self.store_package = project_package.split('/') def check(self, project, repository): + self.project = project if not repository: repository = self.project_repository(project) if not repository: self.logger.error('a repository must be specified via OSRT:Config main-repo for {}'.format(project)) return + self.repository = repository archs = target_archs(self.apiurl, project, repository) if not len(archs): @@ -50,10 +54,19 @@ return None for arch in archs: + self.arch = arch state = self.check_pra(project, repository, arch) + if self.comment: + self.create_comments(state) + + def create_comments(self, state): comments = dict() for source, details in state['check'].items(): + rebuild = dateutil.parser.parse(details["rebuild"]) + if datetime.now() - rebuild < timedelta(days=2): + self.logger.debug(f"Ignore {source} - problem too recent") + continue _, _, arch, rpm = source.split('/') rpm = rpm.split(':')[0] comments.setdefault(rpm, {}) @@ -62,12 +75,12 @@ url = makeurl(self.apiurl, ['comments', 'user']) root = ET.parse(http_GET(url)).getroot() for comment in root.findall('.//comment'): - if comment.get('project') != project: + if comment.get('project') != self.project: continue if comment.get('package') in comments: continue self.logger.info("Removing comment for package {}".format(comment.get('package'))) - url = makeurl(self.apiurl, [comment, comment.get('id')]) + url = makeurl(self.apiurl, ['comment', comment.get('id')]) http_DELETE(url) commentapi = CommentAPI(self.apiurl) @@ -81,24 +94,15 @@ newcomment += "+ " + problem + "\n" newcomment = commentapi.add_marker(newcomment.strip(), MARKER) - oldcomments = commentapi.get_comments(project_name=project, package_name=package) + oldcomments = commentapi.get_comments(project_name=self.project, package_name=package) oldcomment, _ = commentapi.comment_find(oldcomments, MARKER) if oldcomment and oldcomment['comment'] == newcomment: continue if oldcomment: commentapi.delete(oldcomment['id']) - self.logger.debug("Adding comment to {}/{}".format(project, package)) - commentapi.add_comment(project_name=project, package_name=package, comment=newcomment) - - def project_pseudometa_file_name(self, project, repository): - filename = 'repo_checker' - - main_repo = Config.get(self.apiurl, project).get('main-repo') - if not main_repo: - filename += '.' + repository - - return filename + self.logger.debug("Adding comment to {}/{}".format(self.project, package)) + commentapi.add_comment(project_name=self.project, package_name=package, comment=newcomment) def _split_and_filter(self, output): output = output.split("\n") @@ -133,15 +137,30 @@ return repository - def store_yaml(self, state, project, repository, arch): + def store_yaml(self, state): if not self.store_project or not self.store_package: return state_yaml = yaml.dump(state, default_flow_style=False) - comment = 'Updated rebuild infos for {}/{}/{}'.format(project, repository, arch) + comment = 'Updated rebuild infos for {}/{}/{}'.format(self.project, self.repository, self.arch) source_file_ensure(self.apiurl, self.store_project, self.store_package, self.store_filename, state_yaml, comment=comment) + def check_buildstate(self, oldstate, buildresult, code): + oldstate.setdefault(code, {}) + for source in list(oldstate[code]): + project, repo, arch, rpm = source.split('/') + if project != self.project or repo != self.repository or arch != self.arch: + continue + if buildresult.get(rpm, 'gone') != code: + del oldstate[code][source] + for rpm, rcode in buildresult.items(): + if rcode != code: + continue + source = "{}/{}/{}/{}".format(self.project, self.repository, self.arch, rpm) + if source not in oldstate[code]: + oldstate[code][source] = str(datetime.now()) + def check_pra(self, project, repository, arch): config = Config.get(self.apiurl, project) @@ -213,6 +232,11 @@ for p in root.findall('.//status'): buildresult[p.get('package')] = p.get('code') + repo_state = root.find('result').get('state') + if repo_state in ['published', 'unpublished', 'building']: + self.check_buildstate(oldstate, buildresult, 'unresolvable') + self.check_buildstate(oldstate, buildresult, 'failed') + per_source = dict() for package, entry in parsed.items(): @@ -238,7 +262,7 @@ for line in difflib.unified_diff(old_output, per_source[source]['output'], 'before', 'now'): self.logger.debug(line.strip()) oldstate['check'][source] = {'problem': per_source[source]['output'], - 'rebuild': str(datetime.datetime.now())} + 'rebuild': str(datetime.now())} for source in list(oldstate['check']): if not source.startswith('{}/{}/{}/'.format(project, repository, arch)): @@ -291,7 +315,7 @@ self.logger.info("rebuild leaf package %s (%s vs %s)", package, olddigest, m.hexdigest()) rebuilds.add(package) oldstate['leafs'][state_key] = {'buildinfo': m.hexdigest(), - 'rebuild': str(datetime.datetime.now())} + 'rebuild': str(datetime.now())} if self.dryrun: if self.rebuild: @@ -301,7 +325,7 @@ if not self.rebuild or not len(rebuilds): self.logger.debug("Nothing to rebuild") # in case we do rebuild, wait for it to succeed before saving - self.store_yaml(oldstate, project, repository, arch) + self.store_yaml(oldstate) return oldstate query = {'cmd': 'rebuild', 'repository': repository, 'arch': arch, 'package': rebuilds} @@ -309,7 +333,7 @@ headers = {'Content-Type': 'application/x-www-form-urlencoded'} http_request('POST', url, headers, data=urlencode(query, doseq=True)) - self.store_yaml(oldstate, project, repository, arch) + self.store_yaml(oldstate) return oldstate def check_leaf_package(self, project, repository, arch, package): @@ -336,6 +360,7 @@ @cmdln.option('--store', help='Project/Package to store the rebuild infos in') @cmdln.option('-r', '--repo', dest='repo', help='Repository to check') + @cmdln.option('--add-comments', dest='comments', action='store_true', help='Create comments about issues') @cmdln.option('--no-rebuild', dest='norebuild', action='store_true', help='Only track issues, do not rebuild') def do_check(self, subcmd, opts, project): """${cmd_name}: Rebuild packages in rebuild=local projects @@ -344,6 +369,7 @@ ${cmd_option_list} """ self.tool.rebuild = not opts.norebuild + self.tool.comment = opts.comments self.tool.parse_store(opts.store) self.tool.apiurl = conf.config['apiurl'] self.tool.check(project, opts.repo) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20220328.c6d6df6b/staging-installcheck.py new/openSUSE-release-tools-20220329.3acf5457/staging-installcheck.py --- old/openSUSE-release-tools-20220328.c6d6df6b/staging-installcheck.py 2022-03-28 20:01:57.000000000 +0200 +++ new/openSUSE-release-tools-20220329.3acf5457/staging-installcheck.py 2022-03-29 18:23:13.000000000 +0200 @@ -224,7 +224,7 @@ del duplicates[arch] if len(duplicates): self.logger.warning('Found duplicated binaries') - result.comment.append('Found duplicated binaries') + result_comment.append('Found duplicated binaries') result_comment.append(yaml.dump(duplicates, default_flow_style=False)) result = False @@ -346,15 +346,6 @@ self.logger.info('cycle check: passed') return CheckResult(True, None) - def project_pseudometa_file_name(self, project, repository): - filename = 'repo_checker' - - main_repo = Config.get(self.api.apiurl, project).get('main-repo') - if not main_repo: - filename += '.' + repository - - return filename - if __name__ == '__main__': parser = argparse.ArgumentParser( ++++++ openSUSE-release-tools.obsinfo ++++++ --- /var/tmp/diff_new_pack.uzDNRO/_old 2022-03-29 19:45:46.908144729 +0200 +++ /var/tmp/diff_new_pack.uzDNRO/_new 2022-03-29 19:45:46.912144733 +0200 @@ -1,5 +1,5 @@ name: openSUSE-release-tools -version: 20220328.c6d6df6b -mtime: 1648490517 -commit: c6d6df6b9c3195531d83a3ba4978399eb4c36d26 +version: 20220329.3acf5457 +mtime: 1648570993 +commit: 3acf5457ec14993d0c5804d5901d24a5893305c0