[PATCH] Use yum's new callback mode when available

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Detect whether yum supports the new headerless callback mode and
enable if available, so we save memory if possible but allows
anaconda to work with any old yum version. Once the new mode is more
widely available, the cruft for the old mode can hopefully be removed.
---
 pyanaconda/yuminstall.py |   50 +++++++++++++++++++++++++--------------------
 1 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/pyanaconda/yuminstall.py b/pyanaconda/yuminstall.py
index 93e557b..5c2c64b 100644
--- a/pyanaconda/yuminstall.py
+++ b/pyanaconda/yuminstall.py
@@ -144,17 +144,22 @@ class AnacondaCallback:
             self.progressWindow.pop()
 
         if what == rpm.RPMCALLBACK_INST_OPEN_FILE:
-            (hdr, rpmloc) = h
-            # hate hate hate at epochs...
-            epoch = hdr['epoch']
-            if epoch is not None:
-                epoch = str(epoch)
-            txmbrs = self.ayum.tsInfo.matchNaevr(hdr['name'], hdr['arch'],
-                                                 epoch, hdr['version'],
-                                                 hdr['release'])
-            if len(txmbrs) == 0:
-                raise RuntimeError, "Unable to find package %s-%s-%s.%s" %(hdr['name'], hdr['version'], hdr['release'], hdr['arch'])
-            po = txmbrs[0].po
+            # Old-style (hdr, path) callback
+            if isinstance(h, types.TupleType):
+                (hdr, rpmloc) = h
+                # hate hate hate at epochs...
+                epoch = hdr['epoch']
+                if epoch is not None:
+                    epoch = str(epoch)
+                txmbrs = self.ayum.tsInfo.matchNaevr(hdr['name'], hdr['arch'],
+                                                     epoch, hdr['version'],
+                                                     hdr['release'])
+                if len(txmbrs) == 0:
+                    raise RuntimeError, "Unable to find package %s-%s-%s.%s" %(hdr['name'], hdr['version'], hdr['release'], hdr['arch'])
+                po = txmbrs[0].po
+            # New-style callback, h is our txmbr
+            else:
+                po = h.po
 
             repo = self.repos.getRepo(po.repoid)
 
@@ -195,8 +200,6 @@ class AnacondaCallback:
                 self.initWindow.pop()
                 self.initWindow = None
 
-            (hdr, rpmloc) = h
-
             fn = self.openfile.name
             self.openfile.close()
             self.openfile = None
@@ -230,16 +233,15 @@ class AnacondaCallback:
         elif what in (rpm.RPMCALLBACK_CPIO_ERROR,
                       rpm.RPMCALLBACK_UNPACK_ERROR,
                       rpm.RPMCALLBACK_SCRIPT_ERROR):
-            if not isinstance(h, types.TupleType):
-                h = (h, None)
-
-            (hdr, rpmloc) = h
-
-            # If this is a cleanup/remove, then hdr is a string not a header.
-            if isinstance(hdr, basestring):
-                name = hdr
+            # If this is a cleanup/remove, then h is just a string.
+            # A tuple h means old-style (hdr, path) yum callback,
+            # otherwise it's a new-style txmbr callback.
+            if isinstance(h, basestring):
+                name = h
+            elif isinstance(h, types.TupleType):
+                name = h[0]['name']
             else:
-                name = hdr['name']
+                name = h.name
 
             # Script errors store whether or not they're fatal in "total".  So,
             # we should only error out for fatal script errors or the cpio and
@@ -316,6 +318,10 @@ class AnacondaYum(yum.YumBase):
         # where Packages/ is located.
         self.tree = "/mnt/source"
 
+        if hasattr(self, "use_txmbr_in_callback"):
+            log.debug("enabling new callback mode")
+            self.use_txmbr_in_callback = True
+
         self.macros = {}
 
         if flags.selinux:
-- 
1.7.4

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux