]> git.ipfire.org Git - pakfire.git/blame - src/pakfire/repository/__init__.py
repository: Add compat "whatprovides" method.
[pakfire.git] / src / 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 21
1a47c04f
MT
22import re
23
a2d1644c 24import logging
8b6bc023 25log = logging.getLogger("pakfire")
a2d1644c 26
c605d735
MT
27import pakfire.packages as packages
28
c39b064b
MT
29from pakfire.i18n import _
30
89fac8cf 31from base import RepositoryDummy
0f8d6745
MT
32from local import RepositoryDir, RepositoryBuild
33from remote import RepositoryRemote
34from system import RepositorySystem
a2d1644c
MT
35
36class Repositories(object):
37 """
38 Class that loads all repositories from the configuration files.
39
40 This is the place where repositories can be activated or deactivated.
41 """
42
36b328f2 43 def __init__(self, pakfire):
a2d1644c
MT
44 self.pakfire = pakfire
45
a2d1644c 46 # Place to store the repositories
c605d735 47 self.__repos = {}
a2d1644c
MT
48
49 # Create a dummy repository
c605d735 50 self.dummy = RepositoryDummy(self.pakfire)
a2d1644c 51
0f8d6745
MT
52 # Create the local repository.
53 self.local = RepositorySystem(self.pakfire)
a2d1644c
MT
54 self.add_repo(self.local)
55
56 # If we running in build mode, we include our local build repository.
36b328f2 57 if self.pakfire.mode == "builder":
c605d735 58 self.local_build = RepositoryBuild(self.pakfire)
a2d1644c
MT
59 self.add_repo(self.local_build)
60
0f8d6745 61 # Fetch all repository from the configuration files.
a2d1644c
MT
62 for repo_name, repo_args in self.config.get_repos():
63 self._parse(repo_name, repo_args)
64
c605d735
MT
65 def __iter__(self):
66 repositories = self.__repos.values()
67 repositories.sort()
68
69 return iter(repositories)
ae20b05f 70
a2d1644c
MT
71 def __len__(self):
72 """
73 Return the count of enabled repositories.
74 """
c605d735 75 return len([r for r in self if r.enabled])
a2d1644c 76
36b328f2
MT
77 @property
78 def initialized(self):
79 """
80 Indicates if all repositories are initialized.
81 """
82 for repo in self:
83 if not repo.opened:
84 return False
85
86 return True
87
88 def initialize(self):
89 # Nothing to do, if everything is already up to date.
90 if self.initialized:
91 return
92
c39b064b 93 log.info(_("Initializing repositories..."))
36b328f2
MT
94 for repo in self:
95 repo.open()
96
c39b064b
MT
97 # Empty line.
98 log.info("")
99
36b328f2
MT
100 def shutdown(self):
101 """
102 Shuts down all repositores.
103 """
104 for repo in self:
105 repo.close()
106
107 @property
108 def config(self):
109 return self.pakfire.config
110
111 @property
112 def distro(self):
113 return self.pakfire.distro
114
c605d735
MT
115 @property
116 def pool(self):
117 return self.pakfire.pool
a2d1644c
MT
118
119 def _parse(self, name, args):
a2d1644c
MT
120 _args = {
121 "name" : name,
122 "enabled" : True,
123 "gpgkey" : None,
a6bd96bc 124 "mirrors" : None,
a2d1644c
MT
125 }
126 _args.update(args)
127
1a47c04f
MT
128 # Handle variable expansion.
129 replaces = {
130 "name" : name,
131 "arch" : self.distro.arch,
132 }
133
134 for k, v in _args.items():
135 # Skip all non-strings.
136 if not type(v) == type("a"):
137 continue
a2d1644c 138
1a47c04f
MT
139 while True:
140 m = re.search(packages.lexer.LEXER_VARIABLE, v)
141
142 # If we cannot find a match, we are done.
143 if not m:
144 _args[k] = v
145 break
146
147 # Get the name of the variable.
148 (var,) = m.groups()
149
150 # Replace the variable with its value.
151 v = v.replace("%%{%s}" % var, replaces.get(var, ""))
152
0f8d6745 153 repo = RepositoryRemote(self.pakfire, **_args)
a2d1644c
MT
154 self.add_repo(repo)
155
156 def add_repo(self, repo):
c605d735 157 if self.__repos.has_key(repo.name):
41ee403b 158 raise Exception, "Repository with that name does already exist: %s" % repo.name
a2d1644c 159
c605d735 160 self.__repos[repo.name] = repo
67bc4528 161
c157d1e2
MT
162 def rem_repo(self, repo):
163 """
164 Remove the given repository from the global repository set.
165 """
166 try:
167 del self.__repos[repo.name]
168 except KeyError:
8b6bc023 169 log.debug("Repository that was to be removed does not exist: %s" % repo.name)
c157d1e2 170
c605d735
MT
171 def get_repo(self, name):
172 """
173 Get the repository with the given name, if not available, return
174 the dummy repository.
175 """
176 try:
177 return self.__repos[name]
178 except KeyError:
179 return self.dummy
a2d1644c 180
c605d735 181 def enable_repo(self, name):
013eb9f2
MT
182 for repo in self:
183 if repo == self.local:
184 continue
185
186 if repo.name == name or name == "*":
187 repo.enabled = True
a2d1644c
MT
188
189 def disable_repo(self, name):
013eb9f2
MT
190 for repo in self:
191 if repo == self.local:
192 continue
193
194 if repo.name == name or name == "*":
195 repo.enabled = False
a2d1644c 196
6604080b
MT
197 def whatprovides(self, *args, **kwargs):
198 return self.pool.whatprovides(self.pakfire, *args, **kwargs)
199
31267a64 200 def clean(self):
8b6bc023 201 log.info("Cleaning up all repository caches...")
31267a64
MT
202
203 for repo in self:
204 repo.clean()