159 lines
5.9 KiB
Diff
159 lines
5.9 KiB
Diff
|
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
|
||
|
|