Skip to content

Commit 1ecf1de

Browse files
author
Ales Kozumplik
committed
repo: improve the RepoError message to include URL.
Hard to debug the error otherwise. Related: RhBug:1104757
1 parent 318c028 commit 1ecf1de

3 files changed

Lines changed: 40 additions & 21 deletions

File tree

dnf/repo.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ def update_saving(saving, payloads, errs):
127127
full += pload.full_size
128128
return real, full
129129

130+
131+
class _DetailedLibrepoError(Exception):
132+
def __init__(self, librepo_msg, source_url):
133+
Exception.__init__(self)
134+
self.librepo_msg = librepo_msg
135+
self.source_url = source_url
136+
137+
130138
class _Handle(librepo.Handle):
131139
def __init__(self, gpgcheck, max_mirror_tries):
132140
super(_Handle, self).__init__()
@@ -166,6 +174,15 @@ def metalink_path(self):
166174
def mirrorlist_path(self):
167175
return _mirrorlist_path(self.destdir)
168176

177+
def perform(self, result=None):
178+
try:
179+
return super(_Handle, self).perform(result)
180+
except librepo.LibrepoException as exc:
181+
lr_msg = exc.args[1]
182+
source = self.metalinkurl or self.mirrorlisturl or self.urls
183+
raise _DetailedLibrepoError(lr_msg, source)
184+
185+
169186
class Metadata(object):
170187
def __init__(self, res, handle):
171188
self.expired = False
@@ -375,8 +392,9 @@ def __init__(self, id_, basecachedir):
375392
super(Repo, self).__init__()
376393
self._pkgdir = None
377394
self._md_pload = MDPayload(dnf.callback.NullDownloadProgress())
378-
self.id = id_ # :api
379395
self.basecachedir = basecachedir
396+
self.id = id_ # :api
397+
self.hawkey_repo = None
380398
self.metadata = None # :api
381399
self.sync_strategy = self.DEFAULT_SYNC
382400
self.yumvar = {} # empty dict of yumvariables for $string replacement
@@ -386,12 +404,6 @@ def __init__(self, id_, basecachedir):
386404
def __repr__(self):
387405
return "<%s %s>" % (self.__class__.__name__, self.id)
388406

389-
def _exc2msg(self, librepo_exception):
390-
exc_msg = librepo_exception.args[1]
391-
msg = _("Failed to synchronize cache for repo '%s': %s") % \
392-
(self.id, exc_msg)
393-
return msg
394-
395407
def _handle_load(self, handle):
396408
if handle.progresscb:
397409
self._md_pload.start(self.name)
@@ -487,7 +499,7 @@ def _try_cache(self):
487499
handle = self._handle_new_local(self.cachedir)
488500
try:
489501
self.metadata = self._handle_load(handle)
490-
except (librepo.LibrepoException, IOError):
502+
except (_DetailedLibrepoError, IOError):
491503
return False
492504
if self.sync_strategy == SYNC_EXPIRED:
493505
# we shouldn't exit earlier as reviving needs self.metadata
@@ -610,9 +622,10 @@ def load(self):
610622
handle = self._handle_new_local(self.cachedir)
611623
self.metadata = self._handle_load(handle)
612624
self.metadata.fresh = True
613-
except librepo.LibrepoException as e:
614-
self.metadata = None
615-
raise dnf.exceptions.RepoError(self._exc2msg(e))
625+
except _DetailedLibrepoError as e:
626+
msg = _("Failed to synchronize cache for repo '%s' from '%s': %s") % \
627+
(self.id, e.source_url, e.librepo_msg)
628+
raise dnf.exceptions.RepoError(msg)
616629
self.sync_strategy = SYNC_TRY_CACHE
617630
return True
618631

scripts/pylint_false_positives

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
^W0622:[ a-z0-9,._:]*Redefining built-in 'reduce'$
88
^C0103:[ a-z0-9,._:]*Invalid constant name "logger"$
99
^C0103: dnf.repo:[0-9,: ]*Invalid attribute name "id"$
10+
^C0103: tests.[ a-z0-9,._:]*Invalid method name "setUpClass"$
11+
^C0103: tests.[ a-z0-9,._:]*Invalid method name "tearDown"$
12+
^C0103: tests.[ a-z0-9,._:]*Invalid method name "tearDownClass"$
1013
^E1002: dnf.repo:[0-9,: ]*Use of super on an old style class$
1114
^E1101: dnf.repo:[0-9,: ]*Instance of 'PackagePayload' has no '_target_params' member$
1215
^W0201: dnf.repo:[0-9,: ]*Attribute '[_a-z]+' defined outside __init__$

tests/test_repo.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class RepoTestMixin(object):
6464

6565
@classmethod
6666
def setUpClass(cls):
67-
cls.TMP_CACHEDIR = tempfile.mkdtemp(prefix="dnf-repotest-")
67+
cls.TMP_CACHEDIR = tempfile.mkdtemp(prefix='dnf-repotest-')
6868

6969
@classmethod
7070
def tearDownClass(cls):
@@ -97,11 +97,11 @@ def setUp(self):
9797
result.yum_repo = {'primary': support.NONEXISTENT_FILE}
9898
handle = mock.Mock(spec=['mirrors'])
9999
handle.mirrors = []
100-
self.md = dnf.repo.Metadata(result, handle)
100+
self.metadata = dnf.repo.Metadata(result, handle)
101101

102102
def test_file_timestamp(self):
103103
self.assertRaises(dnf.exceptions.MetadataError,
104-
self.md.file_timestamp, 'primary')
104+
self.metadata.file_timestamp, 'primary')
105105

106106
class RepoTest(RepoTestMixin, support.TestCase):
107107
"""Test the logic of dnf.repo.Repo.
@@ -237,11 +237,11 @@ def test_progress_cb(self):
237237
def test_repo_gpgcheck(self, setopt):
238238
"""Test repo_gpgcheck option works."""
239239
self.repo.repo_gpgcheck = False
240-
handle = self.repo._handle_new_remote("/bag")
240+
self.repo._handle_new_remote('/bag')
241241
setopt.assert_any_call(librepo.LRO_GPGCHECK, False)
242242

243243
self.repo.repo_gpgcheck = True
244-
handle = self.repo._handle_new_remote("/bag")
244+
self.repo._handle_new_remote('/bag')
245245
setopt.assert_any_call(librepo.LRO_GPGCHECK, True)
246246

247247
def test_reset_metadata_expired(self):
@@ -310,7 +310,7 @@ def test_reviving(self, new_remote_m, reset_age_m):
310310

311311
@mock.patch.object(dnf.repo.Metadata, 'reset_age')
312312
@mock.patch('dnf.repo.Repo._handle_new_remote')
313-
def test_reviving_lame_hashes(self, new_remote_m, reset_age_m):
313+
def test_reviving_lame_hashes(self, new_remote_m, _):
314314
self.repo.md_expire_cache()
315315
self.repo.metalink = 'http://meh'
316316
new_remote_m().metalink = \
@@ -321,7 +321,7 @@ def test_reviving_lame_hashes(self, new_remote_m, reset_age_m):
321321

322322
@mock.patch.object(dnf.repo.Metadata, 'reset_age')
323323
@mock.patch('dnf.repo.Repo._handle_new_remote')
324-
def test_reviving_mismatched_hashes(self, new_remote_m, reset_age_m):
324+
def test_reviving_mismatched_hashes(self, new_remote_m, _):
325325
self.repo.md_expire_cache()
326326
self.repo.metalink = 'http://meh'
327327
new_remote_m().metalink = \
@@ -334,12 +334,15 @@ def test_reviving_mismatched_hashes(self, new_remote_m, reset_age_m):
334334

335335
@mock.patch('dnf.repo.Repo._handle_new_remote')
336336
def test_reviving_404(self, new_remote_m):
337+
url = 'http://meh'
337338
self.repo.md_expire_cache()
338-
self.repo.metalink = 'http://meh'
339-
exc = librepo.LibrepoException(10, 'Error HTTP/FTP status code: 404', 404)
339+
self.repo.metalink = url
340+
exc = dnf.repo._DetailedLibrepoError('Error HTTP/FTP status code: 404',
341+
url)
340342
new_remote_m().perform = mock.Mock(side_effect=exc)
341343
self.assertRaises(dnf.exceptions.RepoError, self.repo.load)
342344

345+
343346
class DownloadPayloadsTest(RepoTestMixin, support.TestCase):
344347

345348
def test_drpm_error(self):
@@ -359,7 +362,7 @@ def test_empty_transaction(self):
359362
self.assertEmpty(errs.irrecoverable)
360363

361364
def test_fatal_error(self):
362-
def raiser(targets, failfast):
365+
def raiser(_, failfast):
363366
raise librepo.LibrepoException(10, 'hit', 'before')
364367

365368
drpm = dnf.drpm.DeltaInfo(None, None)

0 commit comments

Comments
 (0)