# repodict.py # Managing repo configuration in DNF. # # Copyright (C) 2013-2016 Red Hat, Inc. # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions of # the GNU General Public License v.2, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY expressed or implied, including the implied warranties of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. You should have received a copy of the # GNU General Public License along with this program; if not, write to the # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. Any Red Hat trademarks that are incorporated in the # source code or documentation are not subject to the GNU General Public # License and may only be used or replicated with the express permission of # Red Hat, Inc. # from __future__ import unicode_literals from dnf.exceptions import ConfigError from dnf.i18n import _ import dnf.util import libdnf.conf import fnmatch import os logger = dnf.util.logger class RepoDict(dict): # :api def add(self, repo): # :api id_ = repo.id if id_ in self: msg = 'Repository %s is listed more than once in the configuration' raise ConfigError(msg % id_) try: repo._repo.verify() except RuntimeError as e: raise ConfigError("{0}".format(e)) self[id_] = repo def all(self): # :api return dnf.util.MultiCallList(self.values()) def _any_enabled(self): return not dnf.util.empty(self.iter_enabled()) def _enable_sub_repos(self, sub_name_fn): for repo in self.iter_enabled(): for found in self.get_matching(sub_name_fn(repo.id)): if not found.enabled: logger.info(_('enabling %s repository'), found.id) found.enable() def add_new_repo(self, repoid, conf, baseurl=(), **kwargs): # :api """ Creates new repo object and add it into RepoDict. Variables in provided values will be automatically substituted using conf.substitutions (like $releasever, ...) @param repoid: Repo ID - string @param conf: dnf Base().conf object @param baseurl: List of strings @param kwargs: keys and values that will be used to setattr on dnf.repo.Repo() object @return: dnf.repo.Repo() object """ def substitute(values): if isinstance(values, str): return libdnf.conf.ConfigParser.substitute(values, conf.substitutions) elif isinstance(values, list) or isinstance(values, tuple): substituted = [] for value in values: if isinstance(value, str): substituted.append( libdnf.conf.ConfigParser.substitute(value, conf.substitutions)) if substituted: return substituted return values repo = dnf.repo.Repo(repoid, conf) for path in baseurl: if '://' not in path: path = 'file://{}'.format(os.path.abspath(path)) repo.baseurl += [substitute(path)] for (key, value) in kwargs.items(): setattr(repo, key, substitute(value)) self.add(repo) logger.info(_("Added %s repo from %s"), repoid, ', '.join(baseurl)) return repo def enable_debug_repos(self): # :api """enable debug repos corresponding to already enabled binary repos""" def debug_name(name): return ("{}-debug-rpms".format(name[:-5]) if name.endswith("-rpms") else "{}-debuginfo".format(name)) self._enable_sub_repos(debug_name) def enable_source_repos(self): # :api """enable source repos corresponding to already enabled binary repos""" def source_name(name): return ("{}-source-rpms".format(name[:-5]) if name.endswith("-rpms") else "{}-source".format(name)) self._enable_sub_repos(source_name) def get_matching(self, key): # :api if dnf.util.is_glob_pattern(key): l = [self[k] for k in self if fnmatch.fnmatch(k, key)] return dnf.util.MultiCallList(l) repo = self.get(key, None) if repo is None: return dnf.util.MultiCallList([]) return dnf.util.MultiCallList([repo]) def iter_enabled(self): # :api return (r for r in self.values() if r.enabled) def items(self): """return repos sorted by priority""" return (item for item in sorted(super(RepoDict, self).items(), key=lambda x: (x[1].priority, x[1].cost))) def __iter__(self): return self.keys() def keys(self): return (k for k, v in self.items()) def values(self): return (v for k, v in self.items())
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
cli | Folder | 0755 |
|
|
conf | Folder | 0755 |
|
|
db | Folder | 0755 |
|
|
module | Folder | 0755 |
|
|
rpm | Folder | 0755 |
|
|
yum | Folder | 0755 |
|
|
__init__.py | File | 1.36 KB | 0644 |
|
base.py | File | 114.74 KB | 0644 |
|
callback.py | File | 3.64 KB | 0644 |
|
comps.py | File | 24.24 KB | 0644 |
|
const.py | File | 2.31 KB | 0644 |
|
crypto.py | File | 5.98 KB | 0644 |
|
dnssec.py | File | 11.06 KB | 0644 |
|
drpm.py | File | 6.2 KB | 0644 |
|
exceptions.py | File | 5.71 KB | 0644 |
|
goal.py | File | 1.08 KB | 0644 |
|
history.py | File | 1.12 KB | 0644 |
|
i18n.py | File | 12.03 KB | 0644 |
|
lock.py | File | 5.2 KB | 0644 |
|
logging.py | File | 10.11 KB | 0644 |
|
match_counter.py | File | 3.83 KB | 0644 |
|
package.py | File | 10.94 KB | 0644 |
|
persistor.py | File | 4.61 KB | 0644 |
|
plugin.py | File | 9.33 KB | 0644 |
|
pycomp.py | File | 3.52 KB | 0644 |
|
query.py | File | 1.55 KB | 0644 |
|
repo.py | File | 20.32 KB | 0644 |
|
repodict.py | File | 5.04 KB | 0644 |
|
sack.py | File | 2.97 KB | 0644 |
|
selector.py | File | 1.1 KB | 0644 |
|
subject.py | File | 1.12 KB | 0644 |
|
transaction.py | File | 4.29 KB | 0644 |
|
transaction_sr.py | File | 25.59 KB | 0644 |
|
util.py | File | 19.9 KB | 0644 |
|