commit 61232e9f66cc64fffa8517678b6cf224d44b02ef Author: Michal Domonkos Date: Wed Jul 12 16:27:53 2017 +0200 yum-debug-dump: improve repo failure handling. BZ 1445751 Populate the repos prior to iterating over them in dump_repos(). This fixes the following bugs: 1) KeyError when calling returnPackages() on a repo that was previously disabled by the pkgSack invocation in the same loop due to skip_if_unavailable=true (BZ 1445751) 2) One broken repo with skip_if_unavailable=false would cause all other (even working) repos in the for loop to report the same error, thus making the %%%%REPOS section useless diff --git a/yum-debug-dump.py b/yum-debug-dump.py index 67d943f..01ca338 100755 --- a/yum-debug-dump.py +++ b/yum-debug-dump.py @@ -73,6 +73,26 @@ class YumDebugDump(yum.YumBase): def dump_repos(self): msg = "%%%%REPOS\n" + + # Set up the sacks first, to capture and log any broken repos. We + # cannot yet call returnPackages() from this loop as that would lead to + # a KeyError if some repo got disabled by pkgSack due to + # skip_if_unavailable=true in a previous iteration. + # + # A failure means remaining repos were not processed, so we have to + # retry the whole process ourselves by calling pkgSack again. Since + # the worst case scenario is that all the repos are broken, we have to + # do this at least as many times as there are enabled repos. + for repo in sorted(self.repos.listEnabled()): + try: + self.pkgSack + except Errors.RepoError, e: + msg += "Error accessing repo %s: %s\n" % (e.repo, str(e)) + self.repos.disableRepo(e.repo.id) + else: + break + + # Dump the packages now for repo in sorted(self.repos.listEnabled()): try: msg += '%%%s - %s\n' % (repo.id, repo.urls[0])