|
Packit Service |
21c75c |
# repodict.py
|
|
Packit Service |
21c75c |
# Managing repo configuration in DNF.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
# Copyright (C) 2013-2016 Red Hat, Inc.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
# This copyrighted material is made available to anyone wishing to use,
|
|
Packit Service |
21c75c |
# modify, copy, or redistribute it subject to the terms and conditions of
|
|
Packit Service |
21c75c |
# the GNU General Public License v.2, or (at your option) any later version.
|
|
Packit Service |
21c75c |
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
Packit Service |
21c75c |
# ANY WARRANTY expressed or implied, including the implied warranties of
|
|
Packit Service |
21c75c |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
Packit Service |
21c75c |
# Public License for more details. You should have received a copy of the
|
|
Packit Service |
21c75c |
# GNU General Public License along with this program; if not, write to the
|
|
Packit Service |
21c75c |
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
21c75c |
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
|
Packit Service |
21c75c |
# source code or documentation are not subject to the GNU General Public
|
|
Packit Service |
21c75c |
# License and may only be used or replicated with the express permission of
|
|
Packit Service |
21c75c |
# Red Hat, Inc.
|
|
Packit Service |
21c75c |
#
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
from __future__ import unicode_literals
|
|
Packit Service |
21c75c |
from dnf.exceptions import ConfigError
|
|
Packit Service |
21c75c |
from dnf.i18n import _
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
import dnf.util
|
|
Packit Service |
21c75c |
import libdnf.conf
|
|
Packit Service |
21c75c |
import fnmatch
|
|
Packit Service |
21c75c |
import os
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
logger = dnf.util.logger
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
class RepoDict(dict):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
def add(self, repo):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
id_ = repo.id
|
|
Packit Service |
21c75c |
if id_ in self:
|
|
Packit Service |
21c75c |
msg = 'Repository %s is listed more than once in the configuration'
|
|
Packit Service |
21c75c |
raise ConfigError(msg % id_)
|
|
Packit Service |
21c75c |
try:
|
|
Packit Service |
21c75c |
repo._repo.verify()
|
|
Packit Service |
21c75c |
except RuntimeError as e:
|
|
Packit Service |
21c75c |
raise ConfigError("{0}".format(e))
|
|
Packit Service |
21c75c |
self[id_] = repo
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def all(self):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
return dnf.util.MultiCallList(self.values())
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _any_enabled(self):
|
|
Packit Service |
21c75c |
return not dnf.util.empty(self.iter_enabled())
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def _enable_sub_repos(self, sub_name_fn):
|
|
Packit Service |
21c75c |
for repo in self.iter_enabled():
|
|
Packit Service |
21c75c |
for found in self.get_matching(sub_name_fn(repo.id)):
|
|
Packit Service |
21c75c |
if not found.enabled:
|
|
Packit Service |
21c75c |
logger.info(_('enabling %s repository'), found.id)
|
|
Packit Service |
21c75c |
found.enable()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def add_new_repo(self, repoid, conf, baseurl=(), **kwargs):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
"""
|
|
Packit Service |
21c75c |
Creates new repo object and add it into RepoDict. Variables in provided values will be
|
|
Packit Service |
21c75c |
automatically substituted using conf.substitutions (like $releasever, ...)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
@param repoid: Repo ID - string
|
|
Packit Service |
21c75c |
@param conf: dnf Base().conf object
|
|
Packit Service |
21c75c |
@param baseurl: List of strings
|
|
Packit Service |
21c75c |
@param kwargs: keys and values that will be used to setattr on dnf.repo.Repo() object
|
|
Packit Service |
21c75c |
@return: dnf.repo.Repo() object
|
|
Packit Service |
21c75c |
"""
|
|
Packit Service |
21c75c |
def substitute(values):
|
|
Packit Service |
21c75c |
if isinstance(values, str):
|
|
Packit Service |
21c75c |
return libdnf.conf.ConfigParser.substitute(values, conf.substitutions)
|
|
Packit Service |
21c75c |
elif isinstance(values, list) or isinstance(values, tuple):
|
|
Packit Service |
21c75c |
substituted = []
|
|
Packit Service |
21c75c |
for value in values:
|
|
Packit Service |
21c75c |
if isinstance(value, str):
|
|
Packit Service |
21c75c |
substituted.append(
|
|
Packit Service |
21c75c |
libdnf.conf.ConfigParser.substitute(value, conf.substitutions))
|
|
Packit Service |
21c75c |
if substituted:
|
|
Packit Service |
21c75c |
return substituted
|
|
Packit Service |
21c75c |
return values
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
repo = dnf.repo.Repo(repoid, conf)
|
|
Packit Service |
21c75c |
for path in baseurl:
|
|
Packit Service |
21c75c |
if '://' not in path:
|
|
Packit Service |
21c75c |
path = 'file://{}'.format(os.path.abspath(path))
|
|
Packit Service |
21c75c |
repo.baseurl += [substitute(path)]
|
|
Packit Service |
21c75c |
for (key, value) in kwargs.items():
|
|
Packit Service |
21c75c |
setattr(repo, key, substitute(value))
|
|
Packit Service |
21c75c |
self.add(repo)
|
|
Packit Service |
21c75c |
logger.info(_("Added %s repo from %s"), repoid, ', '.join(baseurl))
|
|
Packit Service |
21c75c |
return repo
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def enable_debug_repos(self):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
"""enable debug repos corresponding to already enabled binary repos"""
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def debug_name(name):
|
|
Packit Service |
21c75c |
return ("{}-debug-rpms".format(name[:-5]) if name.endswith("-rpms")
|
|
Packit Service |
21c75c |
else "{}-debuginfo".format(name))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
self._enable_sub_repos(debug_name)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def enable_source_repos(self):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
"""enable source repos corresponding to already enabled binary repos"""
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def source_name(name):
|
|
Packit Service |
21c75c |
return ("{}-source-rpms".format(name[:-5]) if name.endswith("-rpms")
|
|
Packit Service |
21c75c |
else "{}-source".format(name))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
self._enable_sub_repos(source_name)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def get_matching(self, key):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
if dnf.util.is_glob_pattern(key):
|
|
Packit Service |
21c75c |
l = [self[k] for k in self if fnmatch.fnmatch(k, key)]
|
|
Packit Service |
21c75c |
return dnf.util.MultiCallList(l)
|
|
Packit Service |
21c75c |
repo = self.get(key, None)
|
|
Packit Service |
21c75c |
if repo is None:
|
|
Packit Service |
21c75c |
return dnf.util.MultiCallList([])
|
|
Packit Service |
21c75c |
return dnf.util.MultiCallList([repo])
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def iter_enabled(self):
|
|
Packit Service |
21c75c |
# :api
|
|
Packit Service |
21c75c |
return (r for r in self.values() if r.enabled)
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def items(self):
|
|
Packit Service |
21c75c |
"""return repos sorted by priority"""
|
|
Packit Service |
21c75c |
return (item for item in sorted(super(RepoDict, self).items(),
|
|
Packit Service |
21c75c |
key=lambda x: (x[1].priority, x[1].cost)))
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def __iter__(self):
|
|
Packit Service |
21c75c |
return self.keys()
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def keys(self):
|
|
Packit Service |
21c75c |
return (k for k, v in self.items())
|
|
Packit Service |
21c75c |
|
|
Packit Service |
21c75c |
def values(self):
|
|
Packit Service |
21c75c |
return (v for k, v in self.items())
|