]> git.ipfire.org Git - pakfire.git/blob - python/pakfire/repository/__init__.py
logging: Make own pakfire logger.
[pakfire.git] / python / pakfire / repository / __init__.py
1 #!/usr/bin/python
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 ###############################################################################
21
22 import logging
23 log = logging.getLogger("pakfire")
24
25 import pakfire.packages as packages
26
27 from base import RepositoryDummy
28 from local import RepositoryDir, RepositoryBuild, RepositoryLocal
29 from remote import RepositorySolv
30
31 class 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
38 def __init__(self, pakfire, enable_repos=None, disable_repos=None):
39 self.pakfire = pakfire
40
41 self.config = pakfire.config
42 self.distro = pakfire.distro
43
44 # Place to store the repositories
45 self.__repos = {}
46
47 # Create a dummy repository
48 self.dummy = RepositoryDummy(self.pakfire)
49
50 # Create the local repository
51 self.local = RepositoryLocal(self.pakfire)
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:
56 self.local_build = RepositoryBuild(self.pakfire)
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
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)
71
72 # Update all indexes of the repositories (not force) so that we will
73 # always work with valid data.
74 self.update(offline=self.pakfire.offline)
75
76 def __iter__(self):
77 repositories = self.__repos.values()
78 repositories.sort()
79
80 return iter(repositories)
81
82 def __len__(self):
83 """
84 Return the count of enabled repositories.
85 """
86 return len([r for r in self if r.enabled])
87
88 @property
89 def pool(self):
90 return self.pakfire.pool
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
103 repo = RepositorySolv(self.pakfire, **_args)
104
105 self.add_repo(repo)
106
107 def add_repo(self, repo):
108 if self.__repos.has_key(repo.name):
109 raise Exception, "Repository with that name does already exist."
110
111 self.__repos[repo.name] = repo
112
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:
120 log.debug("Repository that was to be removed does not exist: %s" % repo.name)
121
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
131
132 def enable_repo(self, name):
133 try:
134 self.__repos[name].enabled = True
135 except KeyError:
136 pass
137
138 def disable_repo(self, name):
139 try:
140 self.__repos[name].enabled = False
141 except KeyError:
142 pass
143
144 def update(self, force=False, offline=False):
145 log.debug("Updating all repository indexes (force=%s)" % force)
146
147 # update all indexes if necessary or forced
148 for repo in self:
149 repo.update(force=force, offline=offline)
150
151 def whatprovides(self, what):
152 what = self.pakfire.create_relation(what)
153
154 for solv in self.pool.providers(what):
155 yield packages.SolvPackage(self.pakfire, solv)
156
157 def clean(self):
158 log.info("Cleaning up all repository caches...")
159
160 for repo in self:
161 repo.clean()