[Yum-devel] [PATCH 2/3] background downloading with --downloadonly

Zdeněk Pavlas zpavlas at redhat.com
Fri Oct 5 13:50:34 UTC 2012


---
 cli.py |   45 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/cli.py b/cli.py
index 3334e49..3499273 100755
--- a/cli.py
+++ b/cli.py
@@ -42,6 +42,7 @@ from yum import _, P_
 from yum.rpmtrans import RPMTransaction
 import signal
 import yumcommands
+import tempfile
 
 from yum.i18n import to_unicode, to_utf8, exception2msg
 
@@ -547,6 +548,31 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                 msg += _(" aborting.")
                 raise yum.Errors.YumBaseError(msg)
 
+        if self.conf.dlonly:
+            tmpdir = {}
+            lockfile = self._lockfile
+            for po in downloadpkgs:
+
+                # create tmpdir
+                pkgdir, fn = po.localpath.rsplit('/', 1)
+                if pkgdir not in tmpdir:
+                    tmpdir[pkgdir] = tempfile.mkdtemp(dir=pkgdir)
+
+                # update localpath
+                newpath = tmpdir[pkgdir] +'/'+ fn
+                try: os.rename(po.localpath, newpath)
+                except OSError: pass
+                po.localpath = newpath
+
+                # cache all metadata we'll need
+                po.basepath
+                po.returnChecksums()
+
+            # close DBs, unlock
+            self.repos.close()
+            self.closeRpmDB()
+            self.doUnlock()
+
         # confirm with user
         if self._promptWanted():
             if self.conf.assumeno or not self.userconfirm():
@@ -557,6 +583,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
             _('Downloading Packages:'))
         problems = self.downloadPkgs(downloadpkgs, callback_total=self.download_callback_total_cb) 
 
+        if self.conf.dlonly:
+            self.doLock(lockfile)
+            for po in downloadpkgs:
+
+                # move downloaded files back to pkgdir
+                pkgdir, tmp, fn = po.localpath.rsplit('/', 2)
+                newpath = pkgdir +'/'+ fn
+                if os.path.exists(po.localpath):
+                    if os.path.exists(newpath):
+                        # conflict: drop our file
+                        os.unlink(po.localpath)
+                    else:
+                        os.rename(po.localpath, newpath)
+                po.localpath = newpath
+
+            # remove temporary directories
+            for tmp in tmpdir.values():
+                os.rmdir(tmp)
+
         if len(problems) > 0:
             errstring = ''
             errstring += _('Error Downloading Packages:\n')
-- 
1.7.4.4



More information about the Yum-devel mailing list