Blob Blame History Raw
From ab6eb565dc069d827a0b9fe0784ea9339554b010 Mon Sep 17 00:00:00 2001
From: Jaroslav Mracek <jmracek@redhat.com>
Date: Tue, 1 Aug 2017 10:17:32 +0200
Subject: [PATCH] Fix problems with --downloaddir options (RhBug:1476464)

It will copy all files even from local repository

It removes permissions change, because it will not work for repos where
pkg.location is not only filename but path + filename.

https://bugzilla.redhat.com/show_bug.cgi?id=1476464
---
 dnf/base.py    | 44 ++++++++++++++++++++++++++++++++------------
 dnf/cli/cli.py | 35 ++---------------------------------
 2 files changed, 34 insertions(+), 45 deletions(-)

diff --git a/dnf/base.py b/dnf/base.py
index 4e02d5c6..fa44425d 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -57,6 +57,7 @@ import dnf.transaction
 import dnf.util
 import dnf.yum.rpmtrans
 import functools
+import hawkey
 import itertools
 import logging
 import os
@@ -1008,8 +1009,7 @@ class Base(object):
         with lock:
             drpm = dnf.drpm.DeltaInfo(self.sack.query().installed(),
                                       progress, self.conf.deltarpm_percentage)
-            remote_pkgs = [po for po in pkglist
-                           if not po._is_local_pkg()]
+            remote_pkgs = self._select_remote_pkgs(pkglist)
             self._add_tempfiles([pkg.localPkg() for pkg in remote_pkgs])
 
             payloads = [dnf.repo._pkg2payload(pkg, progress, drpm.delta_factory,
@@ -1081,16 +1081,9 @@ class Base(object):
 
         if self.conf.destdir:
             dnf.util.ensure_dir(self.conf.destdir)
-            for pload in payloads:
-                payloadlocation = os.path.join(
-                    pload.pkg.repo.pkgdir,
-                    os.path.basename(pload.pkg.location)
-                )
-                shutil.copy(payloadlocation, self.conf.destdir)
-                os.chmod(
-                    os.path.join(self.conf.destdir, os.path.basename(pload.pkg.location)),
-                    0o755
-                )
+            for pkg in pkglist:
+                location = os.path.join(pkg.repo.pkgdir, os.path.basename(pkg.location))
+                shutil.copy(location, self.conf.destdir)
 
     def add_remote_rpms(self, path_list, strict=True):
         # :api
@@ -2235,6 +2228,33 @@ class Base(object):
         installonly = q.filter(provides=self.conf.installonlypkgs)
         return installonly
 
+    def _select_remote_pkgs(self, install_pkgs):
+        """ Check checksum of packages from local repositories and returns list packages from remote
+        repositories that will be downloaded. Packages from commandline are skipped.
+
+        :param install_pkgs: list of packages
+        :return: list of remote pkgs
+        """
+        remote_pkgs = []
+        local_repository_pkgs = []
+        for pkg in install_pkgs:
+            if pkg._is_local_pkg():
+                if pkg.reponame != hawkey.CMDLINE_REPO_NAME:
+                    local_repository_pkgs.append(pkg)
+            else:
+                remote_pkgs.append(pkg)
+        error = False
+        for pkg in local_repository_pkgs:
+            if not pkg.verifyLocalPkg():
+                msg = _("Package {} from local repository {} has incorrect checksum").format(
+                    pkg, pkg.reponame)
+                logger.critical(msg)
+                error = True
+        if error:
+            raise dnf.exceptions.Error(
+                _("Some packages from local repository have incorrect checksum"))
+        return remote_pkgs
+
 
 def _msg_installed(pkg):
     name = ucd(pkg)
diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
index 00b2a425..6b6ad987 100644
--- a/dnf/cli/cli.py
+++ b/dnf/cli/cli.py
@@ -70,7 +70,6 @@ import logging
 import operator
 import os
 import random
-import re
 import sys
 import time
 
@@ -214,14 +213,11 @@ class BaseCli(dnf.Base):
             return
 
         if trans:
-            remote_pkgs = self.select_remote_pkgs(install_pkgs)
-
-            if remote_pkgs:
+            if install_pkgs:
                 logger.info(_('Downloading Packages:'))
                 try:
                     total_cb = self.output.download_callback_total_cb
-                    self.download_packages(remote_pkgs, self.output.progress,
-                                           total_cb)
+                    self.download_packages(install_pkgs, self.output.progress, total_cb)
                 except dnf.exceptions.DownloadError as e:
                     specific = dnf.cli.format.indent_block(ucd(e))
                     errstr = _('Error downloading packages:') + '\n%s' % specific
@@ -246,33 +242,6 @@ class BaseCli(dnf.Base):
                 if tsi.op_type == dnf.transaction.FAIL:
                     raise dnf.exceptions.Error(_('Transaction failed'))
 
-    def select_remote_pkgs(self, install_pkgs):
-        """ Check checksum of packages from local repositories and returns list packages from remote
-        repositories that will be downloaded. Packages from commandline are skipped.
-
-        :param install_pkgs: list of packages
-        :return: list of remote pkgs
-        """
-        remote_pkgs = []
-        local_repository_pkgs = []
-        for pkg in install_pkgs:
-            if pkg._is_local_pkg():
-                if pkg.reponame != hawkey.CMDLINE_REPO_NAME:
-                    local_repository_pkgs.append(pkg)
-            else:
-                remote_pkgs.append(pkg)
-        error = False
-        for pkg in local_repository_pkgs:
-            if not pkg.verifyLocalPkg():
-                msg = _("Package {} from local repository {} has incorrect checksum").format(
-                    str(pkg), pkg.reponame)
-                logger.critical(msg)
-                error = True
-        if error:
-            raise dnf.exceptions.Error(
-                _("Some packages from local repository have incorrect checksum"))
-        return remote_pkgs
-
     def gpgsigcheck(self, pkgs):
         """Perform GPG signature verification on the given packages,
         installing keys if possible.
-- 
2.13.3