]> git.ipfire.org Git - pakfire.git/blame - python/pakfire/repository/__init__.py
logging: Make own pakfire logger.
[pakfire.git] / python / pakfire / repository / __init__.py
CommitLineData
a2d1644c 1#!/usr/bin/python
b792d887
MT
2###############################################################################
3# #
4# Pakfire - The IPFire package management system #
5# Copyright (C) 2011 Pakfire development team #
6# #
7# This program is free software: you can redistribute it and/or modify #
8# it under the terms of the GNU General Public License as published by #
9# the Free Software Foundation, either version 3 of the License, or #
10# (at your option) any later version. #
11# #
12# This program is distributed in the hope that it will be useful, #
13# but WITHOUT ANY WARRANTY; without even the implied warranty of #
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15# GNU General Public License for more details. #
16# #
17# You should have received a copy of the GNU General Public License #
18# along with this program. If not, see <http://www.gnu.org/licenses/>. #
19# #
20###############################################################################
a2d1644c
MT
21
22import logging
8b6bc023 23log = logging.getLogger("pakfire")
a2d1644c 24
c605d735
MT
25import pakfire.packages as packages
26
89fac8cf 27from base import RepositoryDummy
c605d735 28from local import RepositoryDir, RepositoryBuild, RepositoryLocal
c605d735 29from remote import RepositorySolv
a2d1644c
MT
30
31class Repositories(object):
32 """
33 Class that loads all repositories from the configuration files.
34
35 This is the place where repositories can be activated or deactivated.
36 """
37
ae20b05f 38 def __init__(self, pakfire, enable_repos=None, disable_repos=None):
a2d1644c
MT
39 self.pakfire = pakfire
40
41 self.config = pakfire.config
42 self.distro = pakfire.distro
43
44 # Place to store the repositories
c605d735 45 self.__repos = {}
a2d1644c
MT
46
47 # Create a dummy repository
c605d735 48 self.dummy = RepositoryDummy(self.pakfire)
a2d1644c
MT
49
50 # Create the local repository
c605d735 51 self.local = RepositoryLocal(self.pakfire)
a2d1644c
MT
52 self.add_repo(self.local)
53
54 # If we running in build mode, we include our local build repository.
55 if self.pakfire.builder:
c605d735 56 self.local_build = RepositoryBuild(self.pakfire)
a2d1644c
MT
57 self.add_repo(self.local_build)
58
59 for repo_name, repo_args in self.config.get_repos():
60 self._parse(repo_name, repo_args)
61
c605d735
MT
62 # Enable all repositories here as demanded on commandline
63 if enable_repos:
64 for repo in enable_repos:
65 self.enable_repo(repo)
66
67 # Disable all repositories here as demanded on commandline
68 if disable_repos:
69 for repo in disable_repos:
70 self.disable_repo(repo)
ae20b05f
MT
71
72 # Update all indexes of the repositories (not force) so that we will
73 # always work with valid data.
c07a3ca7 74 self.update(offline=self.pakfire.offline)
ae20b05f 75
c605d735
MT
76 def __iter__(self):
77 repositories = self.__repos.values()
78 repositories.sort()
79
80 return iter(repositories)
ae20b05f 81
a2d1644c
MT
82 def __len__(self):
83 """
84 Return the count of enabled repositories.
85 """
c605d735 86 return len([r for r in self if r.enabled])
a2d1644c 87
c605d735
MT
88 @property
89 def pool(self):
90 return self.pakfire.pool
a2d1644c
MT
91
92 def _parse(self, name, args):
93 # XXX need to make variable expansion
94
95 _args = {
96 "name" : name,
97 "enabled" : True,
98 "gpgkey" : None,
99 "mirrorlist" : None,
100 }
101 _args.update(args)
102
c605d735 103 repo = RepositorySolv(self.pakfire, **_args)
a2d1644c
MT
104
105 self.add_repo(repo)
106
107 def add_repo(self, repo):
c605d735
MT
108 if self.__repos.has_key(repo.name):
109 raise Exception, "Repository with that name does already exist."
a2d1644c 110
c605d735 111 self.__repos[repo.name] = repo
67bc4528 112
c157d1e2
MT
113 def rem_repo(self, repo):
114 """
115 Remove the given repository from the global repository set.
116 """
117 try:
118 del self.__repos[repo.name]
119 except KeyError:
8b6bc023 120 log.debug("Repository that was to be removed does not exist: %s" % repo.name)
c157d1e2 121
c605d735
MT
122 def get_repo(self, name):
123 """
124 Get the repository with the given name, if not available, return
125 the dummy repository.
126 """
127 try:
128 return self.__repos[name]
129 except KeyError:
130 return self.dummy
a2d1644c 131
c605d735
MT
132 def enable_repo(self, name):
133 try:
f9a012a8 134 self.__repos[name].enabled = True
c605d735
MT
135 except KeyError:
136 pass
a2d1644c
MT
137
138 def disable_repo(self, name):
c605d735 139 try:
f9a012a8 140 self.__repos[name].enabled = False
c605d735
MT
141 except KeyError:
142 pass
a2d1644c 143
c07a3ca7 144 def update(self, force=False, offline=False):
8b6bc023 145 log.debug("Updating all repository indexes (force=%s)" % force)
a2d1644c 146
c605d735
MT
147 # update all indexes if necessary or forced
148 for repo in self:
c07a3ca7 149 repo.update(force=force, offline=offline)
a2d1644c 150
c605d735 151 def whatprovides(self, what):
376eb555
MT
152 what = self.pakfire.create_relation(what)
153
c605d735
MT
154 for solv in self.pool.providers(what):
155 yield packages.SolvPackage(self.pakfire, solv)
31267a64
MT
156
157 def clean(self):
8b6bc023 158 log.info("Cleaning up all repository caches...")
31267a64
MT
159
160 for repo in self:
161 repo.clean()