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 
&gt;= 6 weeks"
+                r.description = "[botdel] Package has had build problems for 
&gt;= 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
 

Reply via email to