Hello community,

here is the log from the commit of package openSUSE-release-tools for 
openSUSE:Factory checked in at 2019-02-17 12:21:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old)
 and      /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "openSUSE-release-tools"

Sun Feb 17 12:21:15 2019 rev:164 rq:676534 version:20190213.be751cc

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes
    2019-02-08 12:13:30.657466849 +0100
+++ 
/work/SRC/openSUSE:Factory/.openSUSE-release-tools.new.28833/openSUSE-release-tools.changes
 2019-02-17 12:21:20.384200580 +0100
@@ -1,0 +2,49 @@
+Wed Feb 13 07:56:21 UTC 2019 - [email protected]
+
+- Update to version 20190213.be751cc:
+  * compare_pkglist: fix return code handling introduced by 
2e339acffb03b6786c902c2ebd250d1c3720e315
+
+-------------------------------------------------------------------
+Wed Feb 13 07:06:07 UTC 2019 - [email protected]
+
+- Update to version 20190213.af2471e:
+  * compare_pkglist: minor improvements
+
+-------------------------------------------------------------------
+Wed Feb 13 06:40:49 UTC 2019 - [email protected]
+
+- Update to version 20190213.fe23e8d:
+  * repo_checker: Simplify cycle check
+
+-------------------------------------------------------------------
+Tue Feb 12 11:19:41 UTC 2019 - [email protected]
+
+- Update to version 20190212.6f70fe2:
+  * compare_pkglist: update version to Leap 15.1 and SLE15 SP1
+
+-------------------------------------------------------------------
+Mon Feb 11 10:53:47 UTC 2019 - [email protected]
+
+- Update to version 20190211.38c1c42:
+  * Fix rebuildpacs for installation-images
+
+-------------------------------------------------------------------
+Fri Feb 08 20:43:39 UTC 2019 - [email protected]
+
+- Update to version 20190208.9984223:
+  * osclib/list_command: 24ae4ba81 broke formatting.
+
+-------------------------------------------------------------------
+Thu Feb 07 12:14:21 UTC 2019 - [email protected]
+
+- Update to version 20190207.4e24164:
+  * Remove openSUSE-images from rebuildpacs - long gone
+
+-------------------------------------------------------------------
+Thu Feb 07 10:37:51 UTC 2019 - [email protected]
+
+- Update to version 20190207.6d706a6:
+  * rebuildpacs: Check the binary version not just the bdep itself
+  * Take over rebuildpac problems from packagelists VM and tidy
+
+-------------------------------------------------------------------

Old:
----
  openSUSE-release-tools-20190207.b99d841.obscpio

New:
----
  openSUSE-release-tools-20190213.be751cc.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ openSUSE-release-tools.spec ++++++
--- /var/tmp/diff_new_pack.YICUH3/_old  2019-02-17 12:21:21.996200137 +0100
+++ /var/tmp/diff_new_pack.YICUH3/_new  2019-02-17 12:21:22.004200135 +0100
@@ -20,7 +20,7 @@
 %define source_dir openSUSE-release-tools
 %define announcer_filename factory-package-news
 Name:           openSUSE-release-tools
-Version:        20190207.b99d841
+Version:        20190213.be751cc
 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.YICUH3/_old  2019-02-17 12:21:22.044200124 +0100
+++ /var/tmp/diff_new_pack.YICUH3/_new  2019-02-17 12:21:22.044200124 +0100
@@ -1,6 +1,6 @@
 <servicedata>
   <service name="tar_scm">
     <param 
name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param>
-    <param 
name="changesrevision">5d70263e89c8580d57bff08f1afdad3b286f2c32</param>
+    <param 
name="changesrevision">9c852461d47438a5e6d12c9802d7d9550d448327</param>
   </service>
-</servicedata>
\ No newline at end of file
+</servicedata>

++++++ openSUSE-release-tools-20190207.b99d841.obscpio -> 
openSUSE-release-tools-20190213.be751cc.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/compare_pkglist.py 
new/openSUSE-release-tools-20190213.be751cc/compare_pkglist.py
--- old/openSUSE-release-tools-20190207.b99d841/compare_pkglist.py      
2019-02-07 06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/compare_pkglist.py      
2019-02-13 08:50:17.000000000 +0100
@@ -17,8 +17,8 @@
 
 from osc import oscerr
 
-OPENSUSE = 'openSUSE:Leap:15.0'
-SLE = 'SUSE:SLE-15:GA'
+OPENSUSE = 'openSUSE:Leap:15.1'
+SLE = 'SUSE:SLE-15-SP1:GA'
 
 makeurl = osc.core.makeurl
 http_GET = osc.core.http_GET
@@ -79,8 +79,14 @@
         query = {'withlinked': 1}
         u = makeurl(self.apiurl, ['source', project, package], query=query)
         root = ET.parse(http_GET(u)).getroot()
-        linked = root.find('linkinfo')
-        return linked
+        links = root.findall('linkinfo/linked')
+        if links is None:
+            return False
+
+        for linked in links:
+            if linked.get('project') == project and 
linked.get('package').startswith("%s." % package):
+                return False
+        return True
 
     def check_diff(self, package, old_prj, new_prj):
         logging.debug('checking %s ...' % package)
@@ -149,13 +155,13 @@
             removed_pkgs_in_target = self.removed_pkglist(dest)
             submit_counter = 0
             for pkg in source:
-                if pkg.startswith('000') or pkg.startswith('_'):
+                if pkg.startswith('00') or pkg.startswith('_'):
                     continue
 
                 if pkg not in target:
                     # ignore the second specfile package
                     linked = self.is_linked_package(self.old_prj, pkg)
-                    if linked is not None:
+                    if linked:
                         continue
 
                     if self.existin:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/osclib/cleanup_rings.py 
new/openSUSE-release-tools-20190213.be751cc/osclib/cleanup_rings.py
--- old/openSUSE-release-tools-20190207.b99d841/osclib/cleanup_rings.py 
2019-02-07 06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/osclib/cleanup_rings.py 
2019-02-13 08:50:17.000000000 +0100
@@ -3,6 +3,7 @@
 from osc.core import makeurl
 from osc.core import http_GET
 from osclib.core import fileinfo_ext_all
+from osclib.core import builddepinfo
 
 try:
     from urllib.error import HTTPError
@@ -73,9 +74,7 @@
 
 
     def fill_pkgdeps(self, prj, repo, arch):
-        url = makeurl(self.api.apiurl, ['build', prj, repo, arch, 
'_builddepinfo'])
-        f = http_GET(url)
-        root = ET.parse(f).getroot()
+        root = builddepinfo(self.api.apiurl,  prj, repo, arch)
 
         for package in root.findall('package'):
             # use main package name for multibuild. We can't just ignore
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/osclib/core.py 
new/openSUSE-release-tools-20190213.be751cc/osclib/core.py
--- old/openSUSE-release-tools-20190207.b99d841/osclib/core.py  2019-02-07 
06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/osclib/core.py  2019-02-13 
08:50:17.000000000 +0100
@@ -232,6 +232,13 @@
                   {'view': 'fileinfo_ext'})
     return ET.parse(http_GET(url)).getroot()
 
+def builddepinfo(apiurl, project, repo, arch, order = False):
+    query = {}
+    if order:
+        query['view'] = 'order'
+    url = makeurl(apiurl, ['build', project, repo, arch, '_builddepinfo'], 
query)
+    return ETL.parse(http_GET(url)).getroot()
+
 def entity_email(apiurl, key, entity_type='person', include_name=False):
     url = makeurl(apiurl, [entity_type, key])
     root = ET.parse(http_GET(url)).getroot()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/osclib/cycle.py 
new/openSUSE-release-tools-20190213.be751cc/osclib/cycle.py
--- old/openSUSE-release-tools-20190207.b99d841/osclib/cycle.py 2019-02-07 
06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/osclib/cycle.py 1970-01-01 
01:00:00.000000000 +0100
@@ -1,218 +0,0 @@
-try:
-    from urllib.error import HTTPError
-except ImportError:
-    # python 2.x
-    from urllib2 import HTTPError
-
-from xml.etree import cElementTree as ET
-
-from osc.core import http_GET
-from osc.core import makeurl
-
-from .memoize import memoize
-
-
-class Graph(dict):
-    """Graph object. Inspired in NetworkX data model."""
-
-    def __init__(self):
-        """Initialize an empty graph."""
-        #  The nodes are stored in the Graph dict itself, but the
-        #  adjacent list is stored as an attribute.
-        self.adj = {}
-
-    def add_node(self, name, value):
-        """Add a node in the graph."""
-        self[name] = value
-        if name not in self.adj:
-            self.adj[name] = set()
-
-    def add_nodes_from(self, nodes_and_values):
-        """Add multiple nodes"""
-        for node, value in nodes_and_values:
-            self.add_node(node, value)
-
-    def add_edge(self, u, v, directed=True):
-        """Add the edge u -> v, an v -> u if not directed."""
-        self.adj[u].add(v)
-        if not directed:
-            self.adj[v].add(u)
-
-    def add_edges_from(self, edges, directed=True):
-        """Add the edges from an iterator."""
-        for u, v in edges:
-            self.add_edge(u, v, directed)
-
-    def remove_edge(self, u, v, directed=True):
-        """Remove the edge u -> v, an v -> u if not directed."""
-        try:
-            self.adj[u].remove(v)
-        except KeyError:
-            pass
-        if not directed:
-            try:
-                self.adj[v].remove(u)
-            except KeyError:
-                pass
-
-    def remove_edges_from(self, edges, directed=True):
-        """Remove the edges from an iterator."""
-        for u, v in edges:
-            self.remove_edge(u, v, directed)
-
-    def edges(self, v):
-        """Get the adjancent list for a vertex."""
-        return sorted(self.adj[v]) if v in self else ()
-
-    def edges_to(self, v):
-        """Get the all the vertex that point to v."""
-        return sorted(u for u in self.adj if v in self.adj[u])
-
-    def cycles(self):
-        """Detect cycles using Tarjan algorithm."""
-        index = [0]
-        path = []
-        cycles = []
-
-        v_index = {}
-        v_lowlink = {}
-
-        def scc(node, v):
-            v_index[v], v_lowlink[v] = index[0], index[0]
-            index[0] += 1
-            path.append(node)
-
-            for succ in self.adj.get(node, []):
-                w = self[succ]
-                if w not in v_index:
-                    scc(succ, w)
-                    v_lowlink[v] = min(v_lowlink[v], v_lowlink[w])
-                elif succ in path:
-                    v_lowlink[v] = min(v_lowlink[v], v_index[w])
-
-            if v_index[v] == v_lowlink[v]:
-                i = path.index(node)
-                path[:], cycle = path[:i], frozenset(path[i:])
-                if len(cycle) > 1:
-                    cycles.append(cycle)
-
-        for node in sorted(self):
-            v = self[node]
-            if not getattr(v, 'index', 0):
-                scc(node, v)
-        return frozenset(cycles)
-
-
-class Package(object):
-    """Simple package container. Used in a graph as a vertex."""
-
-    def __init__(self, pkg=None, src=None, deps=None, subs=None,
-                 element=None):
-        self.pkg = pkg
-        self.src = src
-        self.deps = deps
-        self.subs = subs
-        if element:
-            self.load(element)
-
-    def load(self, element):
-        """Load a node from a ElementTree package XML element"""
-        self.pkg = element.attrib['name']
-        self.src = [e.text for e in element.findall('source')]
-        assert len(self.src) == 1, 'There are more that one source packages in 
the graph'
-        self.src = self.src[0]
-        self.deps = set(e.text for e in element.findall('pkgdep'))
-        self.subs = set(e.text for e in element.findall('subpkg'))
-
-    def __repr__(self):
-        return 'PKG: %s\nSRC: %s\nDEPS: %s\n SUBS: %s' % (self.pkg,
-                                                          self.src,
-                                                          self.deps,
-                                                          self.subs)
-
-
-class CycleDetector(object):
-    """Class to detect cycles in an OBS project."""
-
-    def __init__(self, apiurl):
-        self.apiurl = apiurl
-        # Store packages prevoiusly ignored. Don't pollute the screen.
-        self._ignore_packages = set()
-
-    def _builddepinfo(self, project, repository, arch):
-        root = None
-        try:
-            # print('Generating _builddepinfo for (%s, %s, %s)' % (project, 
repository, arch))
-            url = makeurl(self.apiurl, ['build/%s/%s/%s/_builddepinfo' % 
(project, repository, arch)])
-            root = http_GET(url).read()
-        except HTTPError as e:
-            print('ERROR in URL %s [%s]' % (url, e))
-        return root
-
-    def _get_builddepinfo_graph(self, project, repository, arch):
-        """Generate the buildepinfo graph for a given architecture."""
-
-        # Note, by default generate the graph for all Factory /
-        # 13/2. If you only need the base packages you can use:
-        #   project = 'Base:System'
-        #   repository = 'openSUSE_Factory'
-
-        root = ET.fromstring(self._builddepinfo(project, repository, arch))
-        # Reset the subpackages dict here, so for every graph is a
-        # different object.
-        packages = [Package(element=e) for e in root.findall('package')]
-
-        graph = Graph()
-        graph.add_nodes_from((p.pkg, p) for p in packages)
-
-        subpkgs = {}    # Given a subpackage, recover the source package
-        for p in packages:
-            # Check for packages that provides the same subpackage
-            for subpkg in p.subs:
-                if subpkg in subpkgs:
-                    # print 'Subpackage duplication %s - %s (subpkg: %s)' % 
(p.pkg, subpkgs[subpkg], subpkg)
-                    pass
-                else:
-                    subpkgs[subpkg] = p.pkg
-
-        for p in packages:
-            # Calculate the missing deps
-            deps = p.deps
-            missing = set(deps) - set(subpkgs)
-            if missing:
-                if p.pkg not in self._ignore_packages:
-                    # print 'Ignoring package. Missing dependencies %s -> (%s) 
%s...' % (p.pkg, len(missing), missing[:5])
-                    self._ignore_packages.add(p.pkg)
-                continue
-
-            graph.add_edges_from((p.pkg, subpkgs[d]) for d in deps)
-
-        # Store the subpkgs dict in the graph. It will be used later.
-        graph.subpkgs = subpkgs
-        return graph
-
-    def cycles(self, override_pair, overridden_pair, arch):
-        """Detect cycles in a specific repository."""
-
-        # Detect cycles - We create the full graph from _builddepinfo.
-        project_graph = self._get_builddepinfo_graph(overridden_pair[0], 
overridden_pair[1], arch)
-        current_graph = self._get_builddepinfo_graph(override_pair[0], 
override_pair[1], arch)
-
-        # Sometimes, new cycles have only new edges, but not new
-        # packages.  We need to inform about this, so this can become
-        # a warning instead of an error.
-        #
-        # To do that, we store in `project_cycles_pkgs` all the
-        # project (i.e Factory) cycles as a set of packages, so we can
-        # check if the new cycle (also as a set of packages) is
-        # included here.
-        project_cycles = project_graph.cycles()
-        project_cycles_pkgs = [set(cycle) for cycle in project_cycles]
-        for cycle in current_graph.cycles():
-            if cycle not in project_cycles:
-                project_edges = set((u, v) for u in cycle for v in 
project_graph.edges(u) if v in cycle)
-                current_edges = set((u, v) for u in cycle for v in 
current_graph.edges(u) if v in cycle)
-                current_pkgs = set(cycle)
-                yield (cycle,
-                       sorted(current_edges - project_edges),
-                       not any(current_pkgs.issubset(cpkgs) for cpkgs in 
project_cycles_pkgs))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/osclib/list_command.py 
new/openSUSE-release-tools-20190213.be751cc/osclib/list_command.py
--- old/openSUSE-release-tools-20190207.b99d841/osclib/list_command.py  
2019-02-07 06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/osclib/list_command.py  
2019-02-13 08:50:17.000000000 +0100
@@ -59,7 +59,7 @@
                 if message:
                     line += '\n' + Fore.WHITE + message + Fore.RESET
 
-                print(' ' + line)
+                print(' ', line)
 
         if len(splitter.other):
             non_ring_packages = []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/rebuildpacs.pl 
new/openSUSE-release-tools-20190213.be751cc/rebuildpacs.pl
--- old/openSUSE-release-tools-20190207.b99d841/rebuildpacs.pl  2019-02-07 
06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/rebuildpacs.pl  2019-02-13 
08:50:17.000000000 +0100
@@ -23,16 +23,17 @@
     my $pkg = shift;
 
     for my $repodir (@repodirs) {
-      my @rpms = glob("$repodir/*-$pkg.rpm");
-      for my $rpm (@rpms) {
-        # 1123 == Disturl
-        my %qq = Build::Rpm::rpmq( $rpm, qw{NAME 1123} );
-        next if ( $qq{NAME}[0] ne $pkg );
-        my $distfile = basename( $qq{1123}[0] );
-        $distfile =~ s,^[^-]*-,,;
+        my @rpms = glob("$repodir/*-$pkg.rpm");
+        for my $rpm (@rpms) {
 
-        return $distfile;
-      }
+            # 1123 == Disturl
+            my %qq = Build::Rpm::rpmq( $rpm, qw{NAME 1123} );
+            next if ( $qq{NAME}[0] ne $pkg );
+            my $distfile = basename( $qq{1123}[0] );
+            $distfile =~ s,^[^-]*-,,;
+
+            return $distfile;
+        }
     }
 }
 
@@ -47,29 +48,29 @@
 my %leafed;
 
 sub read_plain_index($) {
-  my $file = shift;
+    my $file = shift;
 
-  my %ret;
+    my %ret;
 
-  open(FILE, $file) || return \%ret;
-  while ( <FILE> ) {
-    if (m/^(.*):(.*)/) {
-      $ret{$1} = $2;
-    }
-  }
-  close(FILE);
-  return \%ret;
+    open( FILE, $file ) || return \%ret;
+    while (<FILE>) {
+        if (m/^(.*):(.*)/) {
+            $ret{$1} = $2;
+        }
+    }
+    close(FILE);
+    return \%ret;
 }
 
 sub write_plain_index($$) {
-  my $file = shift;
-  my $hash = shift;
+    my $file = shift;
+    my $hash = shift;
 
-  open(FILE, ">$file") || die "can't write to $file";
-  for my $key (sort keys %{$hash}) {
-    print FILE "$key:" . $hash->{$key} . "\n";
-  }
-  close(FILE);
+    open( FILE, ">$file" ) || die "can't write to $file";
+    for my $key ( sort keys %{$hash} ) {
+        print FILE "$key:" . $hash->{$key} . "\n";
+    }
+    close(FILE);
 }
 
 # defines packages that need to be triggered too
@@ -81,26 +82,23 @@
           xfce4-branding-openSUSE
           kdebase4-openSUSE kde-branding-openSUSE
           bundle-lang-kde bundle-lang-common
-          openSUSE-images installation-images-openSUSE)
-      ],
+          installation-images:openSUSE)
+    ],
     "kdebase4-openSUSE" => [qw(bundle-lang-kde)],
-    "kernel-source" => [qw(perf)],
-  );
+    "kernel-source"     => [qw(perf)],
+);
+
 # for subsets (staging projects) we need to remember which are ignored
 my %ignored;
 
 sub check_leaf_package($$) {
 
-    my $package = shift;
+    my $package     = shift;
     my $rebuildhash = shift;
 
-    if (system("osc api /source/$project/$package/_meta > /dev/null 2>&1 ")) {
-       $ignored{$package} = 1;
-       return;
-    }
-
     my @lines = ();
-    open( OSC, "osc api 
/build/$project/$repo/$arch/$package/_buildinfo?internal=1|" );
+    open( OSC,
+        "osc api /build/$project/$repo/$arch/$package/_buildinfo|" );
     while (<OSC>) {
         chomp;
         if (m/<subpack>(.*)</) {
@@ -109,11 +107,12 @@
         if (m/bdep name="([^"]*)"/) {
             my $parent = $leafed{$1};
             if ( $parent && $parent ne "rpmlint-mini" ) {
-             # I dislike grep
-             unless (grep { $_ eq $package } @{$parents{$parent}}) {
-               print "ADD $package to PARENT $parent!!\n";
-             }
-             next;
+
+                # I dislike grep
+                unless ( grep { $_ eq $package } @{ $parents{$parent} } ) {
+                    print "ADD $package to PARENT $parent!!\n";
+                }
+                next;
             }
         }
         else {
@@ -125,111 +124,112 @@
     close(OSC);
     my $ctx = Digest::MD5->new;
     for my $line ( sort @lines ) {
-      $ctx->add($line);
+        $ctx->add($line);
     }
     my $rebuilds = read_plain_index("buildinfos");
-    my $newmd5 = $ctx->hexdigest;
-    if ($rebuilds->{"$project/$repo/$arch/$package"} ne $newmd5) {
+    my $newmd5   = $ctx->hexdigest;
+    if ( $rebuilds->{"$project/$repo/$arch/$package"} ne $newmd5 ) {
 
-      $rebuildhash->{$package} = 1;
-      for my $child (@{$parents{$package}}) {
-       $rebuildhash->{$child} = 1;
-      }
-      $rebuilds->{"$project/$repo/$arch/$package"} = $newmd5;
-      write_plain_index("buildinfos", $rebuilds);
+        $rebuildhash->{$package} = 1;
+        for my $child ( @{ $parents{$package} } ) {
+            $rebuildhash->{$child} = 1;
+        }
+        $rebuilds->{"$project/$repo/$arch/$package"} = $newmd5;
+        write_plain_index( "buildinfos", $rebuilds );
     }
 }
 
 my %torebuild;
-check_leaf_package("rpmlint", \%torebuild);
-check_leaf_package("rpmlint-mini", \%torebuild);
+check_leaf_package( "rpmlint-mini", \%torebuild );
+check_leaf_package( "rpmlint",      \%torebuild );
+
+check_leaf_package( "branding-openSUSE",            \%torebuild );
+check_leaf_package( "PackageKit-branding-openSUSE", \%torebuild );
+check_leaf_package( "xfce4-branding-openSUSE",      \%torebuild );
+
+check_leaf_package( "installation-images:openSUSE", \%torebuild );
+check_leaf_package( "installation-images:Kubic", \%torebuild );
+check_leaf_package( "installation-images-extras", \%torebuild );
 
-check_leaf_package("branding-openSUSE", \%torebuild);
-check_leaf_package("glib2-branding-openSUSE", \%torebuild);
-check_leaf_package("PackageKit-branding-openSUSE", \%torebuild);
-check_leaf_package("kiwi-config-openSUSE", \%torebuild);
-check_leaf_package("xfce4-branding-openSUSE", \%torebuild);
-check_leaf_package("kdebase4-openSUSE", \%torebuild);
-check_leaf_package("kde-branding-openSUSE", \%torebuild);
-
-check_leaf_package("bundle-lang-common", \%torebuild);
-check_leaf_package("bundle-lang-kde", \%torebuild);
-check_leaf_package("bundle-lang-gnome", \%torebuild);
-check_leaf_package("installation-images-openSUSE", \%torebuild);
-check_leaf_package("openSUSE-images", \%torebuild);
 if (%torebuild) {
-  my $api = "/build/$project?cmd=rebuild&repository=$repo&arch=$arch";
-  for my $package (sort keys %torebuild) {
-    next if (defined $ignored{$package});
-    last if (length($api) > 32767);
-    $api .= "&package=" . uri_escape( $package );
-  }
-  system("osc api -X POST '$api'");
+    my $api = "/build/$project?cmd=rebuild&repository=$repo&arch=$arch";
+    for my $package ( sort keys %torebuild ) {
+        next if ( defined $ignored{$package} );
+        last if ( length($api) > 32767 );
+        $api .= "&package=" . uri_escape($package);
+    }
+    system("osc api -X POST '$api'");
 }
 
-my $pfile = tempdir(CLEANUP => 1) . "/packages";    # the filename is 
important ;(
+my $pfile =
+  tempdir( CLEANUP => 1 ) . "/packages";    # the filename is important ;(
 
 sub mirror_repo($$$) {
 
-  my $project = shift;
-  my $repo = shift;
-  my $arch = shift;
-
-  # Old and new in single directory, but never deployed together.
-  my $repodir = 
($ENV{XDG_CACHE_HOME}||$ENV{HOME}."/.cache")."/openSUSE-release-tools/repository-meta/repo-$project-$repo-$arch";
-  mkdir($repodir);
-
-  system(
-    "$script_dir/bs_mirrorfull --nodebug 
https://api.opensuse.org/public/build/$project/$repo/$arch/ $repodir"
-  );
-  return $repodir;
+    my $project = shift;
+    my $repo    = shift;
+    my $arch    = shift;
+
+    # Old and new in single directory, but never deployed together.
+    my $repodir = ( $ENV{XDG_CACHE_HOME} || $ENV{HOME} . "/.cache" )
+      . "/openSUSE-release-tools/repository-meta/repo-$project-$repo-$arch";
+    mkdir($repodir);
+
+    system(
+"$script_dir/bs_mirrorfull --nodebug 
https://api.opensuse.org/public/build/$project/$repo/$arch/ $repodir"
+    );
+    return $repodir;
 }
 
 sub find_package_in_project($) {
-  my $project = shift;
+    my $project = shift;
 
-  open(OSC, "osc api /source/$project?expand=1 |");
-  my $xml = XMLin(join('', <OSC>), ForceArray => 1);
-  close(OSC);
-  my @packs = keys %{$xml->{entry}};
-  return shift @packs;
+    open( OSC, "osc api /source/$project?expand=1 |" );
+    my $xml = XMLin( join( '', <OSC> ), ForceArray => 1 );
+    close(OSC);
+    my @packs = keys %{ $xml->{entry} };
+    return shift @packs;
 }
 
-
 # find a random package
 
-
 sub get_paths($$$) {
-  my $project = shift;
-  my $repo = shift;
-  my $arch = shift;
-
-  my $package = find_package_in_project($project);
-
-  open(OSC, "osc api /build/$project/$repo/$arch/$package/_buildinfo|");
-  my $xml = join('', <OSC>);
-  if ($xml !~ m/^</) {
-     die "failed to open /build/$project/$repo/$arch/$package/_buildinfo";
-  }
-  $xml = XMLin($xml, ForceArray => 1);
-  close(OSC);
+    my $project = shift;
+    my $repo    = shift;
+    my $arch    = shift;
+
+    my $package = find_package_in_project($project);
+
+    open( OSC, "osc api /build/$project/$repo/$arch/$package/_buildinfo|" );
+    my $xml = join( '', <OSC> );
+    if ( $xml !~ m/^</ ) {
+        die "failed to open /build/$project/$repo/$arch/$package/_buildinfo";
+    }
+    $xml = XMLin( $xml, ForceArray => 1 );
+    close(OSC);
 
-  return $xml->{path};
+    return $xml->{path};
 }
 
-my $paths = get_paths($project, $repo, $arch);
+my $paths = get_paths( $project, $repo, $arch );
 my @rpms;
 
 for my $path (@$paths) {
 
-  # openSUSE:Factory/ports is in the paths, but not a repo
-  if (system("osc api /build/$path->{'project'}/$path->{'repository'}/$arch > 
/dev/null 2>&1 ")) {
-    next;
-  }
-
-  my $repodir = mirror_repo($path->{'project'}, $path->{'repository'}, $arch);
-  push(@repodirs, $repodir);
-  push(@rpms, glob("$repodir/*.rpm"));
+    # openSUSE:Factory/ports is in the paths, but not a repo
+    if (
+        system(
+"osc api /build/$path->{'project'}/$path->{'repository'}/$arch > /dev/null 
2>&1 "
+        )
+      )
+    {
+        next;
+    }
+
+    my $repodir =
+      mirror_repo( $path->{'project'}, $path->{'repository'}, $arch );
+    push( @repodirs, $repodir );
+    push( @rpms,     glob("$repodir/*.rpm") );
 }
 
 open( PACKAGES, ">", $pfile ) || die "can not open $pfile";
@@ -247,8 +247,8 @@
 
 # read the problems out of installcheck
 my $rpmarch = $arch;
-$rpmarch = "armv7hl" if ($arch eq "armv7l");
-$rpmarch = "armv6hl" if ($arch eq "armv6l");
+$rpmarch = "armv7hl" if ( $arch eq "armv7l" );
+$rpmarch = "armv6hl" if ( $arch eq "armv6l" );
 
 open( INSTALLCHECK, "/usr/bin/installcheck $rpmarch $pfile|" );
 while (<INSTALLCHECK>) {
@@ -274,21 +274,49 @@
     s,(needed by [^ ]*)\-[^-]*\-[^-]*\.($rpmarch|noarch)$,$1,;
 
     s,^\s*,,;
+
     # patterns are too spammy and rebuilding doesn't help
-    next if (grep { $_ eq $cproblem } qw(
-        patterns-openSUSE patterns-base patterns-haskell
-        patterns-mate patterns-media patterns-yast
-        installation-images:Kubic fftw3:gnu-openmpi-hpc hdf5:mvapich2
-        hdf5:openmpi hdf5:serial scalapack:gnu-mvapich2-hpc
-        scalapack:gnu-openmpi-hpc python-numpy:gnu-hpc
-        petsc:serial netcdf:serial netcdf:openmpi netcdf:gnu-hpc
-        netcdf:gnu-openmpi-hpc netcdf:gnu-mvapich2-hpc));
+    next
+      if (
+        grep { $_ eq $cproblem }
+        qw(
+        fftw3:gnu-openmpi-hpc
+        hdf5:gnu-hpc
+        hdf5:gnu-mpich-hpc
+        hdf5:gnu-mvapich2-hpc
+        hdf5:gnu-openmpi-hpc
+        hdf5:gnu-openmpi2-hpc
+        hdf5:gnu-openmpi3-hpc
+        hdf5:mvapich2
+        hdf5:openmpi
+        hdf5:serial
+        installation-images:Kubic
+        metis:gnu-hpc
+        netcdf:gnu-hpc
+        netcdf:gnu-mvapich2-hpc
+        netcdf:gnu-openmpi-hpc
+        netcdf:openmpi
+        netcdf:serial
+        patterns-base
+        patterns-haskell
+        patterns-mate
+        patterns-media
+        patterns-openSUSE
+        patterns-yast
+        petsc:serial
+        python-numpy:gnu-hpc
+        scalapack:gnu-mvapich2-hpc
+        scalapack:gnu-openmpi-hpc
+        warewulf:modules
+        python-scipy:gnu-hpc
+        )
+      );
     $problems{$cproblem}->{$_} = 1;
 
 }
 close(INSTALLCHECK);
 unlink($pfile);
-rmdir(dirname($pfile));
+rmdir( dirname($pfile) );
 
 for my $package ( sort keys %problems ) {
     $problems{$package} = join( ', ', sort( keys %{ $problems{$package} } ) );
@@ -301,8 +329,9 @@
 while (<PROBLEMS>) {
     chomp;
     if (m,^$project/$repo/$arch/([^:]*):\s*(.*)$,) {
-        my $package = $1;
+        my $package  = $1;
         my $oproblem = $2;
+
         # remember old problems for current project/repo
         $oproblems{$package} = $oproblem;
     }
@@ -323,46 +352,46 @@
 my $results = XMLin( join( '', @result ), ForceArray => ['status'] );
 close(RESULT);
 
-my @packages = @{ $results->{result}->{status} };
+my @packages  = @{ $results->{result}->{status} };
 my $rebuildit = 0;
 
 $api = "/build/$project?cmd=rebuild&repository=$repo&arch=$arch";
 for my $package (@packages) {
     $package = $package->{package};
-    last if (length($api) > 32767);
+    last if ( length($api) > 32767 );
 
-    if (!$problems{$package}) {
-      # it can go
-      delete $oproblems{$package};
-      next;
+    if ( !$problems{$package} ) {
+
+        # it can go
+        delete $oproblems{$package};
+        next;
     }
 
     my $oproblem = $oproblems{$package} || '';
-    if ($problems{$package} eq $oproblem) {
+    if ( $problems{$package} eq $oproblem ) {
+
         # rebuild won't help
         next;
     }
     $rebuildit = 1;
-    print "rebuild ", $package, ": ",
-      $problems{ $package }, "\n";
-    $api .= "&package=" . uri_escape( $package );
+    print "rebuild ", $package, ": ", $problems{$package}, "\n";
+    $api .= "&package=" . uri_escape($package);
     $oproblems{$package} = $problems{$package};
 }
 
 open( PROBLEMS, ">problems" );
+
 # write all lines for other projects/repos as they are
 foreach (@other_problems) {
     print PROBLEMS $_, "\n";
 }
-for my $package (keys %oproblems) {
-    print PROBLEMS "$project/$repo/$arch/"
-      . $package . ": "
-      . $oproblems{ $package }, "\n";
+for my $package ( keys %oproblems ) {
+    print PROBLEMS "$project/$repo/$arch/" . $package . ": "
+      . $oproblems{$package}, "\n";
 }
 close(PROBLEMS);
 
 if ($rebuildit) {
-  print "API '$api'\n";
-  system("osc api -X POST '$api'");
+    print "API '$api'\n";
+    system("osc api -X POST '$api'");
 }
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openSUSE-release-tools-20190207.b99d841/repo_checker.py 
new/openSUSE-release-tools-20190213.be751cc/repo_checker.py
--- old/openSUSE-release-tools-20190207.b99d841/repo_checker.py 2019-02-07 
06:43:02.000000000 +0100
+++ new/openSUSE-release-tools-20190213.be751cc/repo_checker.py 2019-02-13 
08:50:17.000000000 +0100
@@ -18,6 +18,7 @@
 from osclib.conf import Config
 from osclib.conf import str2bool
 from osclib.core import BINARY_REGEX
+from osclib.core import builddepinfo
 from osclib.core import depends_on
 from osclib.core import devel_project_fallback
 from osclib.core import fileinfo_ext_all
@@ -32,7 +33,6 @@
 from osclib.core import repository_arch_state
 from osclib.core import repositories_published
 from osclib.core import target_archs
-from osclib.cycle import CycleDetector
 from osclib.memoize import memoize
 from osclib.util import sha1_short
 
@@ -55,7 +55,6 @@
         self.comment_handler = True
 
         # RepoChecker options.
-        self.skip_cycle = False
         self.force = False
 
     def project_only(self, project, post_comments=False):
@@ -278,52 +277,27 @@
         if section:
             yield InstallSection(section, text)
 
-    @memoize(ttl=60, session=True)
-    def cycle_check_skip(self, project):
-        if self.skip_cycle:
-            return True
-
-        # Look for skip-cycle comment command.
-        comments = self.comment_api.get_comments(project_name=project)
-        users = self.request_override_check_users(project)
-        for _, who in self.comment_api.command_find(
-            comments, self.review_user, 'skip-cycle', users):
-            self.logger.debug('comment command: skip-cycle by {}'.format(who))
-            return True
-
-        return False
-
-    def cycle_check(self, override_pair, overridden_pair, arch):
-        if self.cycle_check_skip(override_pair[0]):
-            self.logger.info('cycle check: skip due to --skip-cycle or comment 
command')
-            return CheckResult(True, None)
-
-        self.logger.info('cycle check: start')
+    def cycle_check(self, project, repository, arch, cycle_packages):
+        self.logger.info('cycle check: start %s/%s/%s' % (project, repository, 
arch))
         comment = []
-        first = True
-        cycle_detector = CycleDetector(self.apiurl)
-        for index, (cycle, new_edges, new_packages) in enumerate(
-            cycle_detector.cycles(override_pair, overridden_pair, arch), 
start=1):
-
-            if not new_packages:
-                continue
-
-            if first:
-                comment.append('### new 
[cycle(s)](/project/repository_state/{}/{})\n'.format(
-                    override_pair[0], override_pair[1]))
-                first = False
-
-            # New package involved in cycle, build comment.
-            comment.append('- #{}: {} package cycle, {} new edges'.format(
-                index, len(cycle), len(new_edges)))
-
-            comment.append('   - cycle')
-            for package in sorted(cycle):
-                comment.append('      - {}'.format(package))
-
-            comment.append('   - new edges')
-            for edge in sorted(new_edges):
-                comment.append('      - ({}, {})'.format(edge[0], edge[1]))
+
+        allowed_cycles = []
+        if cycle_packages:
+            for comma_list in cycle_packages.split(';'):
+                allowed_cycles.append(comma_list.split(','))
+
+        depinfo = builddepinfo(self.apiurl, project, repository, arch, order = 
False)
+        for cycle in depinfo.findall('cycle'):
+            for package in cycle.findall('package'):
+                package = package.text
+                allowed = False
+                for acycle in allowed_cycles:
+                    if package in acycle:
+                        allowed = True
+                        break
+                if not allowed:
+                    cycled = [p.text for p in cycle.findall('package')]
+                    comment.append('Package {} appears in cycle 
{}'.format(package, '/'.join(cycled)))
 
         if len(comment):
             # New cycles, post comment.
@@ -375,7 +349,7 @@
         return None
 
     @memoize(session=True)
-    def repository_check(self, repository_pairs, state_hash, simulate_merge, 
whitelist=None, arch_whitelist=None, post_comments=False):
+    def repository_check(self, repository_pairs, state_hash, simulate_merge, 
whitelist=None, arch_whitelist=None, post_comments=False, cycle_packages=None):
         comment = []
         project, repository = repository_pairs[0]
         self.logger.info('checking {}/{}@{}[{}]'.format(
@@ -438,7 +412,7 @@
                     whitelist = self.binary_whitelist(repository_pairs[0], 
repository_pairs[1], arch)
 
                 results = {
-                    'cycle': self.cycle_check(repository_pairs[0], 
repository_pairs[1], arch),
+                    'cycle': self.cycle_check(repository_pairs[0][0], 
repository_pairs[0][1], arch, cycle_packages),
                     'install': self.install_check(
                         repository_pairs[1], arch, directories, ignore, 
whitelist),
                 }
@@ -576,6 +550,7 @@
         config = Config.get(self.apiurl, action.tgt_project)
         staging = config.get('staging')
         arch_whitelist = config.get('repo_checker-arch-whitelist')
+        cycle_packages = config.get('repo_checker-allowed-in-cycles')
         if staging:
             api = self.staging_api(staging)
             if not api.is_adi_project(repository_pairs[0][0]):
@@ -585,7 +560,10 @@
                 whitelist = config.get('repo_checker-binary-whitelist-ring', 
'').split(' ')
 
         state_hash = self.repository_state(repository_pairs, True)
-        if not self.repository_check(repository_pairs, state_hash, True, 
arch_whitelist=arch_whitelist, whitelist=whitelist):
+        if not self.repository_check(repository_pairs, state_hash, True,
+                                     arch_whitelist=arch_whitelist,
+                                     whitelist=whitelist,
+                                     cycle_packages=cycle_packages):
             return None
 
         self.review_messages['accepted'] = 'cycle and install check passed'
@@ -658,7 +636,6 @@
     def get_optparser(self):
         parser = ReviewBot.CommandLineInterface.get_optparser(self)
 
-        parser.add_option('--skip-cycle', action='store_true', help='skip 
cycle check')
         parser.add_option('--force', action='store_true', help='force review 
even if project is not ready')
 
         return parser
@@ -666,9 +643,6 @@
     def setup_checker(self):
         bot = ReviewBot.CommandLineInterface.setup_checker(self)
 
-        if self.options.skip_cycle:
-            bot.skip_cycle = self.options.skip_cycle
-
         bot.force = self.options.force
 
         return bot
@@ -678,6 +652,6 @@
         self.checker.check_requests() # Needed to properly init ReviewBot.
         self.checker.project_only(project, opts.post_comments)
 
-if __name__ == "__main__":
+if __name__ == '__main__':
     app = CommandLineInterface()
     sys.exit(app.main())

++++++ openSUSE-release-tools.obsinfo ++++++
--- /var/tmp/diff_new_pack.YICUH3/_old  2019-02-17 12:21:22.732199935 +0100
+++ /var/tmp/diff_new_pack.YICUH3/_new  2019-02-17 12:21:22.732199935 +0100
@@ -1,5 +1,5 @@
 name: openSUSE-release-tools
-version: 20190207.b99d841
-mtime: 1549518182
-commit: b99d841e96482efa1775eb6aaccf471814f29d70
+version: 20190213.be751cc
+mtime: 1550044217
+commit: be751cc578fb38e713421370ea253d4055becdb0
 


Reply via email to