[yum-commits] Branch 'yum-3_2_X' - output.py yum/__init__.py

James Antill james at osuosl.org
Wed Jun 2 20:32:00 UTC 2010


 output.py       |   36 +++++++++++++++++++++++++++---------
 yum/__init__.py |   47 ++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 69 insertions(+), 14 deletions(-)

New commits:
commit 3ea64d27cf5b767123152a8aa8d1e6527dfb2750
Author: James Antill <james at and.org>
Date:   Wed Jun 2 12:42:05 2010 -0400

     Add prerepoconf, and use it to automagically setup .repos on access.
    This means we don't even need to read the config. files for repos. or
    set them up when we aren't using them.
    
     This is roughly 20% for "yum remove" etc.
    
     This should be really safe because I left in all the old code, so if
    some output.py API user does:
    
    yb.repos
    yb.setupProgressCallbacks()
    
    ...we don't complain. Dito. yb.setCacheDir() which is much more likely.
    
     Patches are required, to repoquery, for repoquery --installed to
    benefit but they seem like sane updates to using the new APIs (ie.
    not calling doSackSetup() explicitly).

diff --git a/output.py b/output.py
index de04b83..be4d1e8 100755
--- a/output.py
+++ b/output.py
@@ -1141,19 +1141,31 @@ Downgrade %5.5s Package(s)
         # progress bars - this is hacky - I'm open to other options
         # One of these is a download
         if self.conf.debuglevel < 2 or not sys.stdout.isatty():
-            self.repos.setProgressBar(None)
-            self.repos.callback = None
+            progressbar = None
+            callback = None
         else:
-            self.repos.setProgressBar(YumTextMeter(fo=sys.stdout))
-            self.repos.callback = CacheProgressCallback()
+            progressbar = YumTextMeter(fo=sys.stdout)
+            callback = CacheProgressCallback()
 
         # setup our failure report for failover
         freport = (self.failureReport,(),{})
-        self.repos.setFailureCallback(freport)
+        failure_callback = freport
 
         # setup callback for CTRL-C's
-        self.repos.setInterruptCallback(self.interrupt_callback)
-        
+        interrupt_callback = self.interrupt_callback
+        if hasattr(self, 'prerepoconf'):
+            self.prerepoconf.progressbar = progressbar
+            self.prerepoconf.callback = callback
+            self.prerepoconf.failure_callback = failure_callback
+            self.prerepoconf.interrupt_callback = interrupt_callback
+        else:
+            #  Just in case some API user decides to do self.repos before
+            # calling us.
+            self.repos.setProgressBar(progressbar)
+            self.repos.callback = callback
+            self.repos.setFailureCallback(failure_callback)
+            self.repos.setInterruptCallback(interrupt_callback)
+
         # setup our depsolve progress callback
         dscb = DepSolveProgressCallBack(weakref(self))
         self.dsCallback = dscb
@@ -1163,8 +1175,14 @@ Downgrade %5.5s Package(s)
         self.setupProgressCallbacks()
     
     def setupKeyImportCallbacks(self):
-        self.repos.confirm_func = self._cli_confirm_gpg_key_import
-        self.repos.gpg_import_func = self.getKeyForRepo
+        confirm_func = self._cli_confirm_gpg_key_import
+        gpg_import_func = self.getKeyForRepo
+        if hasattr(self, 'prerepoconf'):
+            self.prerepoconf.confirm_func = confirm_func
+            self.prerepoconf.gpg_import_func = gpg_import_func
+        else:
+            self.repos.confirm_func = confirm_func
+            self.repos.gpg_import_func = gpg_import_func
 
     def interrupt_callback(self, cbobj):
         '''Handle CTRL-C's during downloads
diff --git a/yum/__init__.py b/yum/__init__.py
index aa522f8..eaeb275 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -108,6 +108,23 @@ class _YumPreBaseConf:
         self.releasever = None
         self.uuid = None
 
+
+class _YumPreRepoConf:
+    """This is the configuration interface for the repos configuration.
+       So if you want to change callbacks etc. you tweak it here, and when
+       yb.repos does it's thing ... it happens. """
+
+    def __init__(self):
+        self.progressbar = None
+        self.callback = None
+        self.failure_callback = None
+        self.interrupt_callback = None
+        self.confirm_func = None
+        self.gpg_import_func = None
+        self.cachedir = None
+        self.cache = None
+
+
 class _YumCostExclude:
     """ This excludes packages that are in repos. of lower cost than the passed
         repo. """
@@ -163,6 +180,7 @@ class YumBase(depsolve.Depsolve):
         self.mediagrabber = None
         self.arch = ArchStorage()
         self.preconf = _YumPreBaseConf()
+        self.prerepoconf = _YumPreRepoConf()
 
         self.run_with_package_names = set()
 
@@ -306,12 +324,9 @@ class YumBase(depsolve.Depsolve):
         # this (core now only uses YumBase.conf.yumvar).
         self.yumvar = self.conf.yumvar
 
-        self.getReposFromConfig()
-
         # who are we:
         self.conf.uid = os.geteuid()
         
-        
         self.doFileLogSetup(self.conf.uid, self.conf.logfile)
         self.verbose_logger.debug('Config time: %0.3f' % (time.time() - conf_st))
         self.plugins.run('init')
@@ -518,7 +533,26 @@ class YumBase(depsolve.Depsolve):
 
     def _getRepos(self, thisrepo=None, doSetup = False):
         """ For each enabled repository set up the basics of the repository. """
-        self.conf # touch the config class first
+        if hasattr(self, 'prerepoconf'):
+            self.conf # touch the config class first
+
+            self.getReposFromConfig()
+
+            # Recursion
+            prerepoconf = self.prerepoconf
+            del self.prerepoconf
+
+            self.repos.setProgressBar(prerepoconf.progressbar)
+            self.repos.callback = prerepoconf.callback
+            self.repos.setFailureCallback(prerepoconf.failure_callback)
+            self.repos.setInterruptCallback(prerepoconf.interrupt_callback)
+            self.repos.confirm_func = prerepoconf.confirm_func
+            self.repos.gpg_import_func = prerepoconf.gpg_import_func
+            if prerepoconf.cachedir is not None:
+                self.repos.setCacheDir(prerepoconf.cachedir)
+            if prerepoconf.cache is not None:
+                self.repos.setCache(prerepoconf.cache)
+
 
         if doSetup:
             repo_st = time.time()        
@@ -4562,7 +4596,10 @@ class YumBase(depsolve.Depsolve):
             return False # Tried, but failed, to get a "user" cachedir
 
         cachedir += varReplace(suffix, self.conf.yumvar)
-        self.repos.setCacheDir(cachedir)
+        if hasattr(self, 'prerepoconf'):
+            self.prerepoconf.cachedir = cachedir
+        else:
+            self.repos.setCacheDir(cachedir)
         self.conf.cachedir = cachedir
         return True # We got a new cache dir
 


More information about the Yum-commits mailing list