dcavalca / rpms / rpm

Forked from rpms/rpm a year ago
Clone

Blame 0001-Fix-python-ts.addErase-not-raising-exception-on-not-.patch

James Antill ee2eaf
From 60066aba510b3ff4a7db092021aae71948e3f8be Mon Sep 17 00:00:00 2001
James Antill ee2eaf
From: Panu Matilainen <pmatilai@redhat.com>
James Antill ee2eaf
Date: Thu, 4 Jun 2020 11:18:01 +0300
James Antill ee2eaf
Subject: [PATCH] Fix python ts.addErase() not raising exception on not-found
James Antill ee2eaf
 packages
James Antill ee2eaf
James Antill ee2eaf
The code would only raise an exception if TransactionSetCore.addErase()
James Antill ee2eaf
returned an error, but the catch is that with many kinds of argument
James Antill ee2eaf
types we'd silently skip the whole addition because no headers were found.
James Antill ee2eaf
This looks to be a regression introduced some eleven years ago in
James Antill ee2eaf
commit 9b20c706a4f93266450fae2f94007343b2e8fd9e.
James Antill ee2eaf
James Antill ee2eaf
As a special case, a match iterator argument will not raise an exception
James Antill ee2eaf
if it doesn't actually match anything.
James Antill ee2eaf
James Antill ee2eaf
Fixes: #1214
James Antill ee2eaf
---
James Antill ee2eaf
 python/rpm/transaction.py | 26 +++++++++++++++-----------
James Antill ee2eaf
 tests/rpmpython.at        | 22 ++++++++++++++++++++++
James Antill ee2eaf
 2 files changed, 37 insertions(+), 11 deletions(-)
James Antill ee2eaf
James Antill ee2eaf
diff --git a/python/rpm/transaction.py b/python/rpm/transaction.py
James Antill ee2eaf
index 7c4a551d3..3c9ddb207 100644
James Antill ee2eaf
--- a/python/rpm/transaction.py
James Antill ee2eaf
+++ b/python/rpm/transaction.py
James Antill ee2eaf
@@ -91,14 +91,22 @@ class TransactionSet(TransactionSetCore):
James Antill ee2eaf
 
James Antill ee2eaf
     def addErase(self, item):
James Antill ee2eaf
         hdrs = []
James Antill ee2eaf
-        if isinstance(item, rpm.hdr):
James Antill ee2eaf
-            hdrs = [item]
James Antill ee2eaf
-        elif isinstance(item, rpm.mi):
James Antill ee2eaf
+        # match iterators are passed on as-is
James Antill ee2eaf
+        if isinstance(item, rpm.mi):
James Antill ee2eaf
             hdrs = item
James Antill ee2eaf
-        elif isinstance(item, int):
James Antill ee2eaf
-            hdrs = self.dbMatch(rpm.RPMDBI_PACKAGES, item)
James Antill ee2eaf
-        elif isinstance(item, _string_types):
James Antill ee2eaf
-            hdrs = self.dbMatch(rpm.RPMDBI_LABEL, item)
James Antill ee2eaf
+        elif isinstance(item, rpm.hdr):
James Antill ee2eaf
+            hdrs.append(item)
James Antill ee2eaf
+        elif isinstance(item, (int, _string_types)):
James Antill ee2eaf
+            if isinstance(item, int):
James Antill ee2eaf
+                dbi = rpm.RPMDBI_PACKAGES
James Antill ee2eaf
+            else:
James Antill ee2eaf
+                dbi = rpm.RPMDBI_LABEL
James Antill ee2eaf
+
James Antill ee2eaf
+            for h in self.dbMatch(dbi, item):
James Antill ee2eaf
+                hdrs.append(h)
James Antill ee2eaf
+
James Antill ee2eaf
+            if not hdrs:
James Antill ee2eaf
+                raise rpm.error("package not installed")
James Antill ee2eaf
         else:
James Antill ee2eaf
             raise TypeError("invalid type %s" % type(item))
James Antill ee2eaf
 
James Antill ee2eaf
@@ -106,10 +114,6 @@ class TransactionSet(TransactionSetCore):
James Antill ee2eaf
             if not TransactionSetCore.addErase(self, h):
James Antill ee2eaf
                 raise rpm.error("package not installed")
James Antill ee2eaf
 
James Antill ee2eaf
-        # garbage collection should take care but just in case...
James Antill ee2eaf
-        if isinstance(hdrs, rpm.mi):
James Antill ee2eaf
-            del hdrs
James Antill ee2eaf
-
James Antill ee2eaf
     def run(self, callback, data):
James Antill ee2eaf
         rc = TransactionSetCore.run(self, callback, data, self._probFilter)
James Antill ee2eaf
 
James Antill ee2eaf
diff --git a/tests/rpmpython.at b/tests/rpmpython.at
James Antill ee2eaf
index 3a7c251f1..de39c8417 100644
James Antill ee2eaf
--- a/tests/rpmpython.at
James Antill ee2eaf
+++ b/tests/rpmpython.at
James Antill ee2eaf
@@ -201,6 +201,28 @@ for e in ts:
James Antill ee2eaf
 [foo-1.0-1.noarch]
James Antill ee2eaf
 )
James Antill ee2eaf
 
James Antill ee2eaf
+RPMPY_TEST([add erasure to transaction],[
James Antill ee2eaf
+ts = rpm.ts()
James Antill ee2eaf
+for i in ['foo', 1234]:
James Antill ee2eaf
+    myprint('addErase %s' % i)
James Antill ee2eaf
+    try:
James Antill ee2eaf
+        ts.addErase(i)
James Antill ee2eaf
+    except rpm.error as err:
James Antill ee2eaf
+        myprint(err)
James Antill ee2eaf
+myprint('addErase mi')
James Antill ee2eaf
+mi = ts.dbMatch('name', 'foo')
James Antill ee2eaf
+try:
James Antill ee2eaf
+    ts.addErase(mi)
James Antill ee2eaf
+except rpm.error as err:
James Antill ee2eaf
+    myprint(err)
James Antill ee2eaf
+],
James Antill ee2eaf
+[addErase foo
James Antill ee2eaf
+package not installed
James Antill ee2eaf
+addErase 1234
James Antill ee2eaf
+package not installed
James Antill ee2eaf
+addErase mi]
James Antill ee2eaf
+)
James Antill ee2eaf
+
James Antill ee2eaf
 RPMPY_TEST([add bogus package to transaction 1],[
James Antill ee2eaf
 ts = rpm.ts()
James Antill ee2eaf
 h = rpm.hdr()
James Antill ee2eaf
-- 
James Antill ee2eaf
2.26.2
James Antill ee2eaf