Hello community,

here is the log from the commit of package libzypp for openSUSE:Factory checked 
in at 2020-09-29 18:59:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libzypp (Old)
 and      /work/SRC/openSUSE:Factory/.libzypp.new.4249 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libzypp"

Tue Sep 29 18:59:22 2020 rev:435 rq:837395 version:17.25.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/libzypp/libzypp.changes  2020-09-24 
16:12:09.588773542 +0200
+++ /work/SRC/openSUSE:Factory/.libzypp.new.4249/libzypp.changes        
2020-09-29 18:59:31.001606819 +0200
@@ -1,0 +2,17 @@
+Fri Sep 25 13:39:38 CEST 2020 - [email protected]
+
+- Fix bsc#1176902: When kernel-rt has been installed, the
+  purge-kernels service fails during boot.
+- Use package name provides as group key in purge-kernel
+  (bsc#1176740 bsc#1176192)
+  kernel-default-base has new packaging, where the kernel uname -r
+  does not reflect the full package version anymore. This patch
+  adds additional logic to use the most generic/shortest edition
+  each package provides with %{packagename}=<version> to group the
+  kernel packages instead of the rpm versions.
+  This also changes how the keep-spec for specific versions is
+  applied, instead of matching the package versions, each of the
+  package name provides will be matched.
+- version 17.25.1 (22)
+
+-------------------------------------------------------------------

Old:
----
  libzypp-17.25.0.tar.bz2

New:
----
  libzypp-17.25.1.tar.bz2

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

Other differences:
------------------
++++++ libzypp.spec ++++++
--- /var/tmp/diff_new_pack.jJTRZn/_old  2020-09-29 18:59:33.505609860 +0200
+++ /var/tmp/diff_new_pack.jJTRZn/_new  2020-09-29 18:59:33.505609860 +0200
@@ -31,7 +31,7 @@
 %bcond_without mediabackend_tests
 
 Name:           libzypp
-Version:        17.25.0
+Version:        17.25.1
 Release:        0
 URL:            https://github.com/openSUSE/libzypp
 Summary:        Library for package, patch, pattern and product management

++++++ libzypp-17.25.0.tar.bz2 -> libzypp-17.25.1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libzypp-17.25.0/VERSION.cmake 
new/libzypp-17.25.1/VERSION.cmake
--- old/libzypp-17.25.0/VERSION.cmake   2020-09-18 16:54:42.000000000 +0200
+++ new/libzypp-17.25.1/VERSION.cmake   2020-09-25 13:48:06.000000000 +0200
@@ -61,8 +61,8 @@
 SET(LIBZYPP_MAJOR "17")
 SET(LIBZYPP_COMPATMINOR "22")
 SET(LIBZYPP_MINOR "25")
-SET(LIBZYPP_PATCH "0")
+SET(LIBZYPP_PATCH "1")
 #
-# LAST RELEASED: 17.25.0 (22)
+# LAST RELEASED: 17.25.1 (22)
 # (The number in parenthesis is LIBZYPP_COMPATMINOR)
 #=======
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libzypp-17.25.0/package/libzypp.changes 
new/libzypp-17.25.1/package/libzypp.changes
--- old/libzypp-17.25.0/package/libzypp.changes 2020-09-18 16:54:42.000000000 
+0200
+++ new/libzypp-17.25.1/package/libzypp.changes 2020-09-25 13:48:06.000000000 
+0200
@@ -1,4 +1,21 @@
 -------------------------------------------------------------------
+Fri Sep 25 13:39:38 CEST 2020 - [email protected]
+
+- Fix bsc#1176902: When kernel-rt has been installed, the
+  purge-kernels service fails during boot.
+- Use package name provides as group key in purge-kernel
+  (bsc#1176740 bsc#1176192)
+  kernel-default-base has new packaging, where the kernel uname -r
+  does not reflect the full package version anymore. This patch
+  adds additional logic to use the most generic/shortest edition
+  each package provides with %{packagename}=<version> to group the
+  kernel packages instead of the rpm versions.
+  This also changes how the keep-spec for specific versions is
+  applied, instead of matching the package versions, each of the
+  package name provides will be matched.
+- version 17.25.1 (22)
+
+-------------------------------------------------------------------
 Fri Sep 18 16:45:49 CEST 2020 - [email protected]
 
 - RepoInfo: Return the type of the local metadata cache as
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libzypp-17.25.0/po/pt_BR.po 
new/libzypp-17.25.1/po/pt_BR.po
--- old/libzypp-17.25.0/po/pt_BR.po     2020-09-18 16:49:30.000000000 +0200
+++ new/libzypp-17.25.1/po/pt_BR.po     2020-09-23 02:53:59.000000000 +0200
@@ -14,8 +14,8 @@
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2020-09-18 16:45+0200\n"
-"PO-Revision-Date: 2019-12-05 20:54+0000\n"
-"Last-Translator: Rodrigo Macedo <[email protected]>\n"
+"PO-Revision-Date: 2020-09-23 00:48+0000\n"
+"Last-Translator: Luiz Fernando Ranghetti <[email protected]>\n"
 "Language-Team: Portuguese (Brazil) <https://l10n.opensuse.org/projects/";
 "libzypp/master/pt_BR/>\n"
 "Language: pt_BR\n"
@@ -4912,6 +4912,8 @@
 "Download (curl) error for '%s':\n"
 "Error code: %s\n"
 msgstr ""
+"Erro de download (curl) para '%s':\n"
+"Código do erro: %s\n"
 
 #: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
@@ -4919,6 +4921,8 @@
 "Download (curl) error for '%s':\n"
 "Unable to retrieve HTTP response\n"
 msgstr ""
+"Erro de download (curl) para '%s':\n"
+"Não foi possível obter a resposta HTTP\n"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Não foi possível abrir o arquivo de bloqueio: %s"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libzypp-17.25.0/tests/zypp/PurgeKernels_test.cc 
new/libzypp-17.25.1/tests/zypp/PurgeKernels_test.cc
--- old/libzypp-17.25.0/tests/zypp/PurgeKernels_test.cc 2020-08-20 
10:20:12.000000000 +0200
+++ new/libzypp-17.25.1/tests/zypp/PurgeKernels_test.cc 2020-09-25 
09:34:10.000000000 +0200
@@ -252,6 +252,66 @@
           //{ "kernel-default-5.8.1-3.1.g846658e.x86_64", false },
           }
       },
+      TestSample {
+        TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base",
+        "5.7.8-3-default",
+        Arch("x86_64"),
+        "running",
+        {
+          { "kernel-default-base-5.7.8-1.1.1.1.x86_64", false },
+          { "kernel-default-base-5.7.8-2.1.1.1.x86_64", false },
+          //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64", false },
+          { "kernel-default-base-5.8.8-2.1.1.1.x86_64", false },
+          }
+      },
+      TestSample {
+        TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base",
+        "5.7.8-3-default",
+        Arch("x86_64"),
+        "running, 5.7.8-2.1.1",
+        {
+          { "kernel-default-base-5.7.8-1.1.1.1.x86_64", false },
+          { "kernel-default-base-5.8.8-2.1.1.1.x86_64", false },
+          //{ "kernel-default-base-5.7.8-2.1.1.1.x86_64", false },
+          //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64", false },
+          }
+      },
+      TestSample {
+        TESTS_SRC_DIR"/zypp/data/PurgeKernels/flavour",
+        "1-3-rt",
+        Arch("x86_64"),
+        "running",
+        {
+          { "kernel-rt-1-1.x86_64", false },
+          { "kernel-rt-devel-1-1.x86_64", false },
+          { "kernel-rt-devel-debuginfo-1-1.x86_64", false },
+          { "kernel-devel-rt-1-1.noarch", false },
+          { "kernel-syms-rt-1-1.x86_64", false },
+          { "kernel-source-rt-1-1.noarch", false },
+          { "kernel-rt-1-2.x86_64", false },
+          { "kernel-rt-devel-1-2.x86_64", false },
+          { "kernel-rt-devel-debuginfo-1-2.x86_64", false },
+          { "kernel-devel-rt-1-2.noarch", false },
+          { "kernel-syms-rt-1-2.x86_64", false },
+          { "kernel-rt-1-4.x86_64", false },
+          { "kernel-rt-devel-1-4.x86_64", false },
+          { "kernel-rt-devel-debuginfo-1-4.x86_64", false },
+          { "kernel-devel-rt-1-4.noarch", false },
+          { "kernel-syms-rt-1-4.x86_64", false },
+          { "kernel-rt-1-5.x86_64", false },
+          { "kernel-rt-devel-1-5.x86_64", false },
+          { "kernel-rt-devel-debuginfo-1-5.x86_64", false },
+          { "kernel-devel-rt-1-5.noarch", false },
+          { "kernel-syms-rt-1-5.x86_64", false },
+          // left over devel packages that need to go away too
+          { "kernel-devel-rt-1-1.2.noarch", false },
+          { "kernel-source-rt-1-1.2.noarch", false },
+          { "kernel-rt-devel-1-3.x86_64", false },
+          { "kernel-devel-rt-1-3.noarch", false },
+          { "kernel-rt-devel-1-3.x86_64", false },
+          { "kernel-rt-devel-debuginfo-1-3.x86_64", false },
+        }
+      },
     };
   }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/flavour/@System.repo 
new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/flavour/@System.repo
--- old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/flavour/@System.repo       
1970-01-01 01:00:00.000000000 +0100
+++ new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/flavour/@System.repo       
2020-09-25 09:34:10.000000000 +0200
@@ -0,0 +1,356 @@
+=Ver: 3.0
+=Pkg: glibc 1 1 x86_64
++Prv:
+glibc = 1-1
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-firmware <NULL> - noarch
++Prv:
+kernel-firmware = 20190312-lp151.2.3.1
+kernel-firmware = <NULL>
+-Prv:
+
+=Pkg: kernel-macros 1 0 noarch
++Prv:
+kernel-subpackage-macros
+kernel-macros = 1-0
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt 1 1 x86_64
++Prv:
+multiversion(kernel)
+kernel-rt-1-1
+kernel = 1-1
+kernel-uname-r = 1-1-rt
+kernel-rt = 1-1
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel 1 1 x86_64
++Req:
+kernel-devel-rt = 1-1
+-Req:
++Prv:
+multiversion(kernel)
+kernel-rt-devel = 1-1
+-Prv:
++Sup:
+kernel-rt & kernel-devel-rt
+-Sup:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel-debuginfo 1 1 x86_64
++Prv:
+kernel-rt-devel-debuginfo = 1-1
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 1 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-1
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-source-rt 1 1 noarch
++Req:
+kernel-devel-rt = 1-1
+-Req:
++Prv:
+multiversion(kernel)
+kernel-source-rt = 1-1
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 1.2 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-1
+kernel-devel-rt = 1-1.2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-source-rt 1 1.2 noarch
++Req:
+kernel-devel-rt = 1-1.2
+-Req:
++Prv:
+multiversion(kernel)
+kernel-source-rt = 1-1
+kernel-source-rt = 1-1.2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-syms-rt 1 1 x86_64
++Req:
+kernel-devel-rt = 1-1
+kernel-rt-devel = 1-1
+-Req:
++Prv:
+multiversion(kernel)
+kernel-syms-rt = 1-1
+-Prv:
+=Vnd: openSUSE
+
+=Tim: 1570603549
+=Pkg: kernel-rt 1 2 x86_64
++Prv:
+multiversion(kernel)
+kernel-rt-1-2
+kernel = 1-2
+kernel-uname-r = 1-2-rt
+kernel-rt = 1-2
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel 1 2 x86_64
++Req:
+kernel-devel-rt = 1-2
+-Req:
++Prv:
+multiversion(kernel)
+kernel-rt-devel = 1-2
+-Prv:
++Sup:
+kernel-rt & kernel-devel-rt
+-Sup:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel-debuginfo 1 2 x86_64
++Prv:
+kernel-rt-devel-debuginfo = 1-2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 2 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-syms-rt 1 2 x86_64
++Req:
+kernel-devel-rt = 1-2
+kernel-rt-devel = 1-2
+-Req:
++Prv:
+multiversion(kernel)
+kernel-syms-rt = 1-2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt 1 3 x86_64
++Prv:
+multiversion(kernel)
+kernel-rt-1-3
+kernel = 1-3
+kernel-uname-r = 1-3-rt
+kernel-rt = 1-3
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel 1 3 x86_64
++Req:
+kernel-devel-rt = 1-3
+-Req:
++Prv:
+multiversion(kernel)
+kernel-rt-devel = 1-3
+-Prv:
++Sup:
+kernel-rt & kernel-devel-rt
+-Sup:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel 1 3.2 x86_64
++Req:
+kernel-devel-rt = 1-3.2
+-Req:
++Prv:
+multiversion(kernel)
+kernel-rt-devel = 1-3
+kernel-rt-devel = 1-3.2
+-Prv:
++Sup:
+kernel-rt & kernel-devel-rt
+-Sup:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 3.2 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-3
+kernel-devel-rt = 1-3.2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-source-rt 1 3.2 noarch
++Req:
+kernel-devel-rt = 1-3.2
+-Req:
++Prv:
+multiversion(kernel)
+kernel-source-rt = 1-3
+kernel-source-rt = 1-3.2
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel-debuginfo 1 3 x86_64
++Prv:
+kernel-rt-devel-debuginfo = 1-3
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 3 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-3
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-syms-rt 1 3 x86_64
++Req:
+kernel-devel-rt = 1-3
+kernel-rt-devel = 1-3
+-Req:
++Prv:
+multiversion(kernel)
+kernel-syms-rt = 1-3
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt 1 4 x86_64
++Prv:
+multiversion(kernel)
+kernel-rt-1-4
+kernel = 1-4
+kernel-uname-r = 1-4-rt
+kernel-rt = 1-4
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel 1 4 x86_64
++Req:
+kernel-devel-rt = 1-4
+-Req:
++Prv:
+multiversion(kernel)
+kernel-rt-devel = 1-4
+-Prv:
++Sup:
+kernel-rt & kernel-devel-rt
+-Sup:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel-debuginfo 1 4 x86_64
++Prv:
+kernel-rt-devel-debuginfo = 1-4
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 4 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-4
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-syms-rt 1 4 x86_64
++Req:
+kernel-devel-rt = 1-4
+kernel-rt-devel = 1-4
+-Req:
++Prv:
+multiversion(kernel)
+kernel-syms-rt = 1-4
+-Prv:
+=Vnd: openSUSE
+=Tim: 1570603549
+
+=Pkg: kernel-rt 1 5 x86_64
++Prv:
+multiversion(kernel)
+kernel-rt-1-5
+kernel = 1-5
+kernel-uname-r = 1-5-rt
+ksym(foobar) = abdcfee
+kernel-rt = 1-5
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel 1 5 x86_64
++Req:
+kernel-devel-rt = 1-5
+-Req:
++Prv:
+multiversion(kernel)
+kernel-rt-devel = 1-5
+-Prv:
++Sup:
+kernel-rt & kernel-devel-rt
+-Sup:
+=Vnd: openSUSE
+
+=Pkg: kernel-rt-devel-debuginfo 1 5 x86_64
++Prv:
+kernel-rt-devel-debuginfo = 1-5
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-devel-rt 1 5 noarch
++Req:
+kernel-macros
+-Req:
++Prv:
+multiversion(kernel)
+kernel-devel-rt = 1-5
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-syms-rt 1 5 x86_64
++Req:
+kernel-devel-rt = 1-5
+kernel-rt-devel = 1-5
+-Req:
++Prv:
+multiversion(kernel)
+kernel-syms-rt = 1-5
+-Prv:
+=Vnd: openSUSE
+=Tim: 1570603549
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/flavour/zypp-control.yaml 
new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/flavour/zypp-control.yaml
--- old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/flavour/zypp-control.yaml  
1970-01-01 01:00:00.000000000 +0100
+++ new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/flavour/zypp-control.yaml  
2020-09-25 09:34:10.000000000 +0200
@@ -0,0 +1,38 @@
+version: 1.0
+setup:
+  channels:
+    - alias: "@System"
+      url: []
+      path: ""
+      type: NONE
+      generated: 0
+      outdated: 0
+      priority: 99
+      file: "@System.repo"
+  arch: x86_64
+  locales:
+    - fate: ""
+      name: en_US
+    - fate: ""
+      name: de
+  autoinst:
+    []
+  modalias:
+    []
+  multiversion:
+    []
+  resolverFlags:
+    focus: Job
+    ignorealreadyrecommended: false
+    onlyRequires: false
+    forceResolve: false
+    cleandepsOnRemove: false
+    allowDowngrade: false
+    allowNameChange: false
+    allowArchChange: false
+    allowVendorChange: false
+    dupAllowDowngrade: false
+    dupAllowNameChange: false
+    dupAllowArchChange: false
+    dupAllowVendorChange: false
+trials: []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/kernel-base/@System.repo 
new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/kernel-base/@System.repo
--- old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/kernel-base/@System.repo   
1970-01-01 01:00:00.000000000 +0100
+++ new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/kernel-base/@System.repo   
2020-09-23 17:09:59.000000000 +0200
@@ -0,0 +1,81 @@
+=Ver: 3.0
+
+=Pkg: glibc 1 1 x86_64
++Prv:
+glibc = 1-1
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-firmware <NULL> - noarch
++Prv:
+kernel-firmware = <NULL>
+-Prv:
+=Vnd: openSUSE
+
+=Pkg: kernel-default-base 5.7.8 1.1.1.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.7.8-1
+kernel = 5.7.8-1
+kernel-base = 5.7.8-1
+kernel-uname-r = 5.7.8-1-default
+kernel-default-base = 5.7.8-1
+kernel-default-base = 5.7.8-1.1
+kernel-default-base = 5.7.8-1.1.1
+kernel-default-base = 5.7.8-1.1.1.1
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-default-base 5.7.8 2.1.1.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.7.8-2
+kernel = 5.7.8-2
+kernel-base = 5.7.8-2
+kernel-uname-r = 5.7.8-2-default
+kernel-default-base = 5.7.8-2
+kernel-default-base = 5.7.8-2.1
+kernel-default-base = 5.7.8-2.1.1
+kernel-default-base = 5.7.8-2.1.1.1
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-default-base 5.7.8 3.1.1.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.7.8-3
+kernel = 5.7.8-3
+kernel-base = 5.7.8-3
+kernel-uname-r = 5.7.8-3-default
+kernel-default-base = 5.7.8-3
+kernel-default-base = 5.7.8-3.1
+kernel-default-base = 5.7.8-3.1.1
+kernel-default-base = 5.7.8-3.1.1.1
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
+
+=Pkg: kernel-default-base 5.8.8 2.1.1.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.8.8-1
+kernel = 5.8.8-1
+kernel-base = 5.8.8-1
+kernel-uname-r = 5.8.8-1-default
+kernel-default-base = 5.8.8-1
+kernel-default-base = 5.8.8-1.1
+kernel-default-base = 5.8.8-1.1.1
+kernel-default-base = 5.8.8-1.1.1.1
+-Prv:
++Rec:
+kernel-firmware
+-Rec:
+=Vnd: openSUSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/kernel-base/zypp-control.yaml 
new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/kernel-base/zypp-control.yaml
--- 
old/libzypp-17.25.0/tests/zypp/data/PurgeKernels/kernel-base/zypp-control.yaml  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/libzypp-17.25.1/tests/zypp/data/PurgeKernels/kernel-base/zypp-control.yaml  
    2020-09-23 17:09:59.000000000 +0200
@@ -0,0 +1,38 @@
+version: 1.0
+setup:
+  channels:
+    - alias: "@System"
+      url: []
+      path: ""
+      type: NONE
+      generated: 0
+      outdated: 0
+      priority: 99
+      file: "@System.repo"
+  arch: x86_64
+  locales:
+    - fate: ""
+      name: en_US
+    - fate: ""
+      name: de
+  autoinst:
+    []
+  modalias:
+    []
+  multiversion:
+    []
+  resolverFlags:
+    focus: Job
+    ignorealreadyrecommended: false
+    onlyRequires: false
+    forceResolve: false
+    cleandepsOnRemove: false
+    allowDowngrade: false
+    allowNameChange: false
+    allowArchChange: false
+    allowVendorChange: false
+    dupAllowDowngrade: false
+    dupAllowNameChange: false
+    dupAllowArchChange: false
+    dupAllowVendorChange: false
+trials: []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libzypp-17.25.0/zypp/PurgeKernels.cc 
new/libzypp-17.25.1/zypp/PurgeKernels.cc
--- old/libzypp-17.25.0/zypp/PurgeKernels.cc    2020-08-20 10:20:12.000000000 
+0200
+++ new/libzypp-17.25.1/zypp/PurgeKernels.cc    2020-09-25 09:34:10.000000000 
+0200
@@ -14,7 +14,6 @@
 #include <zypp/base/Logger.h>
 #include <zypp/base/Regex.h>
 #include <zypp/base/Iterator.h>
-#include <zypp/ui/Selectable.h>
 #include <zypp/PurgeKernels.h>
 #include <zypp/PoolQuery.h>
 #include <zypp/ResPool.h>
@@ -36,7 +35,7 @@
 namespace zypp {
 
   using Flavour                = std::string;
-  using SolvableList           = std::list<sat::Solvable::IdType>;
+  using SolvableList           = std::list<sat::Solvable>;
   using EditionToSolvableMap   = std::map<Edition, SolvableList >;
   using ArchToEditionMap       = std::map<Arch, EditionToSolvableMap >;
 
@@ -102,10 +101,10 @@
       MIL << "Kernel Edition: " << _runningKernelEdition << std::endl;
     }
 
-    bool removePackageAndCheck( const sat::Solvable::IdType id, const 
std::set<sat::Solvable::IdType> &keepList , const 
std::set<sat::Solvable::IdType> &removeList ) const;
+    bool removePackageAndCheck( const sat::Solvable slv, const 
std::set<sat::Solvable> &keepList , const std::set<sat::Solvable> &removeList ) 
const;
     static bool versionMatch ( const Edition &a, const Edition &b );
     void parseKeepSpec();
-    void fillKeepList(const GroupMap &installedKernels, 
std::set<sat::Solvable::IdType> &keepList , std::set<sat::Solvable::IdType> 
&removeList ) const;
+    void fillKeepList(const GroupMap &installedKernels, 
std::set<sat::Solvable> &keepList , std::set<sat::Solvable> &removeList ) const;
 
     std::set<size_t>  _keepLatestOffsets = { 0 };
     std::set<size_t>  _keepOldestOffsets;
@@ -123,11 +122,11 @@
    * tries to remove a the \ref PoolItem \a pi from the pool, solves and 
checks if no unexpected packages are removed due to the \a validRemovals regex.
    * If the constraint fails the changes are reverted and \a false is returned.
    */
-  bool PurgeKernels::Impl::removePackageAndCheck( const sat::Solvable::IdType 
id, const std::set<sat::Solvable::IdType> &keepList , const 
std::set<sat::Solvable::IdType> &removeList ) const
+  bool PurgeKernels::Impl::removePackageAndCheck( const sat::Solvable slv, 
const std::set<sat::Solvable> &keepList , const std::set<sat::Solvable> 
&removeList ) const
   {
     const filter::ByStatus toBeUninstalledFilter( 
&ResStatus::isToBeUninstalled );
 
-    PoolItem pi ( (sat::Solvable(id)) );
+    PoolItem pi ( slv );
 
     auto pool = ResPool::instance();
 
@@ -142,15 +141,15 @@
     //list of packages that are allowed to be removed automatically.
     const str::regex 
validRemovals("(kernel-syms(-.*)?|kgraft-patch(-.*)?|kernel-livepatch(-.*)?|.*-kmp(-.*)?)");
 
-    if ( ui::asSelectable()( pi )->hasLocks() ) {
+    if ( pi.status().isLocked() ) {
       MIL << "Package " << pi << " is locked by the user, not removing." << 
std::endl;
       return false;
     }
 
     //remember which packages are already marked for removal, we do not need 
to check them again
-    std::set< sat::Solvable::IdType> currentSetOfRemovals;
-    for ( auto it = pool.byStatusBegin( toBeUninstalledFilter ); it != 
pool.byStatusEnd( toBeUninstalledFilter );  it++  ) {
-      currentSetOfRemovals.insert( it->id() );
+    std::set<sat::Solvable> currentSetOfRemovals;
+    for ( const PoolItem & p : pool.byStatus( toBeUninstalledFilter ) ) {
+      currentSetOfRemovals.insert( p.satSolvable() );
     }
 
     pi.status().setToBeUninstalled( ResStatus::USER );
@@ -163,35 +162,35 @@
       return false;
     }
 
-    std::set<sat::Solvable::IdType> removedInThisRun;
-    removedInThisRun.insert( pi.id() );
+    std::set<sat::Solvable> removedInThisRun;
+    removedInThisRun.insert( slv );
 
-    for ( auto it = pool.byStatusBegin( toBeUninstalledFilter ); it != 
pool.byStatusEnd( toBeUninstalledFilter );  it++  ) {
+    for ( const PoolItem & p : pool.byStatus( toBeUninstalledFilter ) ) {
 
       //check if that package is removeable
-      if ( it->status().isByUser()      //this was set by us, ignore it
-           || (currentSetOfRemovals.find( it->id() ) != 
currentSetOfRemovals.end()) //this was marked by a previous removal, ignore them
+      if ( p.status().isByUser()      //this was set by us, ignore it
+           || (currentSetOfRemovals.find( p.satSolvable() ) != 
currentSetOfRemovals.end()) //this was marked by a previous removal, ignore them
         )
         continue;
 
       // remember for later we need remove the debugsource and debuginfo 
packages as well
-      removedInThisRun.insert( it->id() );
+      removedInThisRun.insert( p.satSolvable() );
 
-      MIL << "Package " << PoolItem(*it) << " was marked by the solver for 
removal." << std::endl;
+      MIL << "Package " << p << " was marked by the solver for removal." << 
std::endl;
 
       // if we do not plan to remove that package anyway, we need to check if 
its allowed to be removed ( package in removelist can never be in keep list )
-      if ( removeList.find( it->id() ) != removeList.end() )
+      if ( removeList.find( p.satSolvable() ) != removeList.end() )
         continue;
 
-      if ( keepList.find( it->id() ) != keepList.end() ) {
-        MIL << "Package " << PoolItem(*it) << " is in keep spec, skipping" << 
pi << std::endl;
+      if ( keepList.find( p.satSolvable() ) != keepList.end() ) {
+        MIL << "Package " << p << " is in keep spec, skipping" << pi << 
std::endl;
         pi.statusReset();
         return false;
       }
 
       str::smatch what;
-      if ( !str::regex_match( it->name(), what, validRemovals) ) {
-        MIL << "Package " << PoolItem(*it) << " should not be removed, 
skipping " << pi << std::endl;
+      if ( !str::regex_match( p.name(), what, validRemovals) ) {
+        MIL << "Package " << p << " should not be removed, skipping " << pi << 
std::endl;
         pi.statusReset();
         return false;
       }
@@ -201,28 +200,27 @@
 
     //now check and mark the -debugsource and -debuginfo packages for this 
package and all the packages that were removed. Maybe collect it before and 
just remove here
     MIL << "Trying to remove debuginfo for: " << pi <<"."<<std::endl;
-    for ( const auto id : removedInThisRun ) {
+    for ( sat::Solvable solvable : removedInThisRun ) {
 
-      const auto solvable = sat::Solvable(id);
       if ( solvable.arch() == Arch_noarch ||
            solvable.arch() == Arch_empty )
         continue;
 
-      for ( const auto suffix : { "-debugsource", "-debuginfo" } ) {
+      for ( const char * suffix : { "-debugsource", "-debuginfo" } ) {
         PoolQuery q;
         q.addKind( zypp::ResKind::package );
         q.addDependency( sat::SolvAttr::provides, Capability( 
solvable.name()+suffix, Rel::EQ, solvable.edition() ) );
         q.setInstalledOnly();
         q.setMatchExact();
 
-        for ( const auto debugPackage : q ) {
+        for ( sat::Solvable debugPackage : q ) {
 
           if ( debugPackage.arch() != solvable.arch() )
             continue;
 
           MIL << "Found debug package for " << solvable << " : " << 
debugPackage << std::endl;
           //if removing the package fails it will not stop us from going on , 
so no need to check
-          removePackageAndCheck( debugPackage.id(), keepList, removeList );
+          removePackageAndCheck( debugPackage, keepList, removeList );
         }
       }
     }
@@ -325,11 +323,11 @@
    * doable. This is also what the perl script did.
    *
    */
-  void PurgeKernels::Impl::fillKeepList( const GroupMap &installedKernels, 
std::set<sat::Solvable::IdType> &keepList, std::set<sat::Solvable::IdType> 
&removeList ) const
+  void PurgeKernels::Impl::fillKeepList( const GroupMap &installedKernels, 
std::set<sat::Solvable> &keepList, std::set<sat::Solvable> &removeList ) const
   {
 
-    const auto markAsKeep = [ &keepList, &removeList ]( const auto &pck ) {
-      MIL << "Marking package " << sat::Solvable(pck) << " as to keep." << 
std::endl;
+    const auto markAsKeep = [ &keepList, &removeList ]( sat::Solvable pck ) {
+      MIL << "Marking package " << pck << " as to keep." << std::endl;
       keepList.insert( pck ) ;
       removeList.erase( pck );
     };
@@ -369,7 +367,7 @@
               MIL << "NOT removing any packages for flavor 
"<<_runningKernelFlavour<<"-"<<_kernelArch<<" ."<<std::endl;
 
               for ( const auto &kernelMap : map ) {
-                for( const auto &pck : kernelMap.second )
+                for( sat::Solvable pck : kernelMap.second )
                   markAsKeep(pck);
               }
               continue;
@@ -387,7 +385,7 @@
 
           // mark all packages of the running version as keep
           if ( it != map.end() ) {
-            for( const auto &pck : it->second ) {
+            for( sat::Solvable pck : it->second ) {
               markAsKeep(pck);
             }
           }
@@ -395,19 +393,22 @@
 
         for ( const auto &kernelMap : map ) {
           //if we find one of the running offsets in the keepspec, we add the 
kernel id the the list of packages to keep
-          if (  _keepOldestOffsets.find( currOff ) != _keepOldestOffsets.end()
-               || _keepLatestOffsets.find( currROff ) != 
_keepLatestOffsets.end()
-               // a kernel might be explicitely locked by version
-               // this will currently keep all editions that match, so if keep 
spec has 1-1 , this will keep 1-1 but also all 1-1.n
-               ||  std::find_if( _keepSpecificEditions.begin(), 
_keepSpecificEditions.end(),
-                    [ edition = &kernelMap.first ]( const auto &elem ) { 
return versionMatch( *edition, elem ); } ) != _keepSpecificEditions.end() ) {
-
-            for( const auto &pck : kernelMap.second ) {
-              markAsKeep(pck);
-            }
+          if (  _keepOldestOffsets.find( currOff ) != _keepOldestOffsets.end() 
|| _keepLatestOffsets.find( currROff ) != _keepLatestOffsets.end() ) {
+            std::for_each( kernelMap.second.begin(), kernelMap.second.end(), 
markAsKeep );
           }
           currOff++;
           currROff--;
+
+          // a kernel package might be explicitely locked by version
+          // We need to go over all package name provides ( provides is named 
like the package ) and match
+          // them against the specified version to know which ones to keep. 
(bsc#1176740  bsc#1176192)
+          std::for_each( kernelMap.second.begin(), kernelMap.second.end(), [ & 
]( sat::Solvable solv ){
+            for ( Capability prov : solv.provides() ) {
+              if ( prov.detail().name() == solv.name() && 
_keepSpecificEditions.count( prov.detail().ed() ) ) {
+                markAsKeep( solv );
+              }
+            }
+          });
         }
       }
     }
@@ -449,9 +450,9 @@
 
 
     // packages that we plan to remove
-    std::set<sat::Solvable::IdType> packagesToRemove;
+    std::set<sat::Solvable> packagesToRemove;
 
-    const auto addPackageToMap = [&installedKrnlPackages, &packagesToRemove] ( 
const GroupInfo::GroupType type, const std::string &ident, const std::string 
&flavour, const auto &installedKrnlPck ) {
+    const auto addPackageToMap = [&installedKrnlPackages, &packagesToRemove] ( 
const GroupInfo::GroupType type, const std::string &ident, const std::string 
&flavour, const sat::Solvable &installedKrnlPck ) {
 
       if ( !installedKrnlPackages.count( ident ) )
         installedKrnlPackages.insert( std::make_pair( ident, GroupInfo(type, 
flavour) ) );
@@ -469,18 +470,40 @@
 
       auto &editionToSolvableMap = groupInfo.archToEdMap[ currArch ];
 
-      const auto currEd  = installedKrnlPck.edition();
-      if ( !editionToSolvableMap.count( currEd ) )
-        editionToSolvableMap.insert( std::make_pair( currEd, SolvableList{} ) 
);
+      // calculate the "shortest" or most generic edition of all the package 
name provides
+      // ( the key of the provides is the package name ). This generic edition 
is used to
+      // group the packages together. This should get us around the issue that 
uname -r does
+      // not represent the actual rpm package version anymore. ( bsc#1176740 )
+      auto currCount = INT_MAX;
+      Edition edToUse;
+      for ( Capability prov : installedKrnlPck.provides() ) {
+        if ( prov.detail().name() == installedKrnlPck.name() ) {
+          if ( edToUse == Edition::noedition ) {
+            edToUse = installedKrnlPck.edition();
+            const auto &relStr = edToUse.release();
+            currCount = std::count( relStr.begin(), relStr.end(), '.');
+          } else {
+            const auto &pckEd = prov.detail().ed();
+            const auto &relStr = pckEd.release();
+            if ( const auto pntCnt = std::count( relStr.begin(), relStr.end(), 
'.'); pntCnt < currCount ) {
+              currCount = pntCnt;
+              edToUse = pckEd;
+            }
+          }
+        }
+      }
+
+      if ( !editionToSolvableMap.count( edToUse ) )
+        editionToSolvableMap.insert( std::make_pair( edToUse, SolvableList{} ) 
);
 
-      editionToSolvableMap[currEd].push_back( installedKrnlPck.id() );
+      editionToSolvableMap[edToUse].push_back( installedKrnlPck );
 
       //in the first step we collect all packages in this list, then later we 
will remove the packages we want to explicitely keep
-      packagesToRemove.insert( installedKrnlPck.id() );
+      packagesToRemove.insert( installedKrnlPck );
     };
 
-    // the set of package IDs that have to be kept always
-    std::set<sat::Solvable::IdType> packagesToKeep;
+    // the set of satSolvables that have to be kept always
+    std::set<sat::Solvable> packagesToKeep;
 
     //collect the list of installed kernel packages
     PoolQuery q;
@@ -491,7 +514,7 @@
 
     MIL << "Searching for obsolete multiversion kernel packages." << std::endl;
 
-    for ( auto installedKrnlPck : q ) {
+    for ( sat::Solvable installedKrnlPck : q ) {
 
       MIL << "Found installed multiversion kernel package " << 
installedKrnlPck << std::endl;
 
@@ -519,6 +542,7 @@
 
       } else {
 
+        // if adapting the groups do not forget to explicitely handle the 
group when querying the matches
         const str::regex 
explicitelyHandled("kernel-syms(-.*)?|kernel(-.*)?-devel");
 
         MIL << "Not a kernel package, inspecting more closely " << std::endl;
@@ -536,15 +560,18 @@
           // getting no flavour for a kernel(-*)?-devel means we have the 
kernel-devel package otherwise the flavour specific one
           // ...yes this is horrible
           std::string flav;
-          if ( match.size() > 1 )  {
+
+          // first group match is a kernel-syms
+          if ( match.size() > 1 && match[1].size() )
+            flav = match[1].substr(1);
+          // second group match is a kernel-flavour-devel
+          else if ( match.size() > 2 &&  match[2].size() )
             flav = match[2].substr(1);
-          } else if ( installedKrnlPck.name() == "kernel-syms" ) {
+          else if ( installedKrnlPck.name() == "kernel-syms" )
             flav = "default";
-          }
 
           MIL << "Handling package explicitely due to name match."<< std::endl;
           addPackageToMap ( GroupInfo::RelatedBinaries, 
installedKrnlPck.name(), flav, installedKrnlPck );
-
         } else {
           MIL << "Package not explicitely handled" << std::endl;
         }
@@ -570,8 +597,8 @@
 
     _pimpl->fillKeepList( installedKrnlPackages, packagesToKeep, 
packagesToRemove );
 
-    for ( const auto id : packagesToRemove )
-      _pimpl->removePackageAndCheck( id, packagesToKeep, packagesToRemove );
+    for ( sat::Solvable slv : packagesToRemove )
+      _pimpl->removePackageAndCheck( slv, packagesToKeep, packagesToRemove );
   }
 
   void PurgeKernels::setUnameR( const std::string &val )


Reply via email to