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 - [email protected]
+
+- Update to version 20220329.3acf5457:
+ * Add aggregates for fiscal quarter and year
+
+-------------------------------------------------------------------
+Tue Mar 29 14:46:51 UTC 2022 - [email protected]
+
+- Update to version 20220329.c967b052:
+ * build-fail-reminder: Several enhancements
+
+-------------------------------------------------------------------
+Tue Mar 29 12:29:00 UTC 2022 - [email protected]
+
+- Update to version 20220329.e9c42f69:
+ * Use all staging archs in adi projects
+
+-------------------------------------------------------------------
+Tue Mar 29 10:06:05 UTC 2022 - [email protected]
+
+- 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 - [email protected]
+
+- Update to version 20220329.425fdc5f:
+ * staging-installcheck: Fix syntax error
+
+-------------------------------------------------------------------
+Tue Mar 29 06:45:26 UTC 2022 - [email protected]
+
+- Update to version 20220329.8e2e22a2:
+ * project-installcheck: Fix off by one error
+
+-------------------------------------------------------------------
+Tue Mar 29 06:19:52 UTC 2022 - [email protected]
+
+- Update to version 20220329.cc1b2e9d:
+ * project-installcheck: Fix syntax error
+
+-------------------------------------------------------------------
+Tue Mar 29 06:18:19 UTC 2022 - [email protected]
+
+- Update to version 20220329.53f00a2b:
+ * project-installcheck: Only add comments for the run in openSUSE:Factory
+
+-------------------------------------------------------------------
+Tue Mar 29 04:57:24 UTC 2022 - [email protected]
+
+- 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