Blame dnf/repodict.py

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())