From aa1a83f946455eabe0e581e2d5316148b05caeb9 Mon Sep 17 00:00:00 2001 From: Dan Callaghan Date: Mar 27 2018 22:41:24 +0000 Subject: obey skip_if_unavailable=1 when loading system repos Bug: 1537961 Change-Id: I032bc98069d0f69b256c436708a2223dfe578767 --- diff --git a/rpmdeplint/__init__.py b/rpmdeplint/__init__.py index 6902a8c..5796338 100644 --- a/rpmdeplint/__init__.py +++ b/rpmdeplint/__init__.py @@ -108,6 +108,9 @@ class DependencyAnalyzer(object): :param repos: An iterable of :py:class:`rpmdeplint.repodata.Repo` instances :param packages: An iterable of RPM package paths to be tested """ + # delayed import to avoid circular dependency + from rpmdeplint.repodata import RepoDownloadError + self.pool = solv.Pool() self.pool.setarch(arch) @@ -124,7 +127,14 @@ class DependencyAnalyzer(object): self.repos_by_name = {} #: Mapping of {repo name: :py:class:`rpmdeplint.repodata.Repo`} for repo in repos: - repo.download_repodata() + try: + repo.download_repodata() + except RepoDownloadError as e: + if repo.skip_if_unavailable: + logger.warn('Skipping repo %s: %s', repo.name, e) + continue + else: + raise solv_repo = self.pool.add_repo(repo.name) # solv.xfopen does not accept unicode filenames on Python 2 solv_repo.add_rpmmd(solv.xfopen_fd(str(repo.primary_url), repo.primary.fileno()), diff --git a/rpmdeplint/repodata.py b/rpmdeplint/repodata.py index ef69480..db5ff94 100644 --- a/rpmdeplint/repodata.py +++ b/rpmdeplint/repodata.py @@ -134,20 +134,23 @@ class Repo(object): if (config.has_option(section, 'enabled') and not config.getboolean(section, 'enabled')): continue + skip_if_unavailable = False + if config.has_option(section, 'skip_if_unavailable'): + skip_if_unavailable = config.getboolean(section, 'skip_if_unavailable') if config.has_option(section, 'baseurl'): baseurl = substitute_yumvars(config.get(section, 'baseurl'), yumvars) - yield cls(section, baseurl=baseurl) + yield cls(section, baseurl=baseurl, skip_if_unavailable=skip_if_unavailable) elif config.has_option(section, 'metalink'): metalink = substitute_yumvars(config.get(section, 'metalink'), yumvars) - yield cls(section, metalink=metalink) + yield cls(section, metalink=metalink, skip_if_unavailable=skip_if_unavailable) elif config.has_option(section, 'mirrorlist'): mirrorlist = substitute_yumvars(config.get(section, 'mirrorlist'), yumvars) - yield cls(section, metalink=mirrorlist) + yield cls(section, metalink=mirrorlist, skip_if_unavailable=skip_if_unavailable) else: raise ValueError('Yum config section %s has no ' 'baseurl or metalink or mirrorlist' % section) - def __init__(self, repo_name, baseurl=None, metalink=None): + def __init__(self, repo_name, baseurl=None, metalink=None, skip_if_unavailable=False): """ :param repo_name: Name of the repository, for example "fedora-updates" (used in problems and error messages) @@ -155,6 +158,8 @@ class Repo(object): (there should be a repodata subdirectory under this) :param metalink: URL to a Metalink file describing mirrors where the repository can be found + :param skip_if_unavailable: If True, suppress errors downloading + repodata from the repository Exactly one of the *baseurl* or *metalink* parameters must be supplied. """ @@ -163,6 +168,7 @@ class Repo(object): raise RuntimeError('Must specify either baseurl or metalink for repo') self.baseurl = baseurl self.metalink = metalink + self.skip_if_unavailable = skip_if_unavailable def download_repodata(self): clean_cache() diff --git a/rpmdeplint/tests/test_repodata.py b/rpmdeplint/tests/test_repodata.py index 660fa9d..b949307 100644 --- a/rpmdeplint/tests/test_repodata.py +++ b/rpmdeplint/tests/test_repodata.py @@ -108,3 +108,14 @@ def test_bad_repo_url_raises_error(yumdir): repos[0].download_repodata() assert 'Cannot download repomd.xml' in str(rde.value) assert "repo_name='dummy'" in str(rde.value) + + +def test_skip_if_unavailable_is_obeyed(yumdir): + yumdir.join('yum.repos.d', 'dummy.repo').write( + '[dummy]\nname=Dummy\nbaseurl=http://example.invalid/dummy\nenabled=1\nskip_if_unavailable=1\n', + ensure=True) + + repos = list(Repo.from_yum_config()) + assert len(repos) == 1 + assert repos[0].name == 'dummy' + assert repos[0].skip_if_unavailable == True