[Yum-devel] [PATCH] 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.

James Antill james at and.org
Wed Jun 2 16:47:12 UTC 2010


 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).
---
 output.py       |   36 +++++++++++++++++++++++++++---------
 yum/__init__.py |   47 ++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 69 insertions(+), 14 deletions(-)

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
 
-- 
1.7.0.1



More information about the Yum-devel mailing list