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