]>
Commit | Line | Data |
---|---|---|
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 | |
22 | import logging | |
23 | ||
c605d735 MT |
24 | import pakfire.packages as packages |
25 | ||
89fac8cf | 26 | from base import RepositoryDummy |
c605d735 | 27 | from local import RepositoryDir, RepositoryBuild, RepositoryLocal |
c605d735 | 28 | from remote import RepositorySolv |
a2d1644c MT |
29 | |
30 | class Repositories(object): | |
31 | """ | |
32 | Class that loads all repositories from the configuration files. | |
33 | ||
34 | This is the place where repositories can be activated or deactivated. | |
35 | """ | |
36 | ||
ae20b05f | 37 | def __init__(self, pakfire, enable_repos=None, disable_repos=None): |
a2d1644c MT |
38 | self.pakfire = pakfire |
39 | ||
40 | self.config = pakfire.config | |
41 | self.distro = pakfire.distro | |
42 | ||
43 | # Place to store the repositories | |
c605d735 | 44 | self.__repos = {} |
a2d1644c MT |
45 | |
46 | # Create a dummy repository | |
c605d735 | 47 | self.dummy = RepositoryDummy(self.pakfire) |
a2d1644c MT |
48 | |
49 | # Create the local repository | |
c605d735 | 50 | self.local = RepositoryLocal(self.pakfire) |
a2d1644c MT |
51 | self.add_repo(self.local) |
52 | ||
53 | # If we running in build mode, we include our local build repository. | |
54 | if self.pakfire.builder: | |
c605d735 | 55 | self.local_build = RepositoryBuild(self.pakfire) |
a2d1644c MT |
56 | self.add_repo(self.local_build) |
57 | ||
58 | for repo_name, repo_args in self.config.get_repos(): | |
59 | self._parse(repo_name, repo_args) | |
60 | ||
c605d735 MT |
61 | # Enable all repositories here as demanded on commandline |
62 | if enable_repos: | |
63 | for repo in enable_repos: | |
64 | self.enable_repo(repo) | |
65 | ||
66 | # Disable all repositories here as demanded on commandline | |
67 | if disable_repos: | |
68 | for repo in disable_repos: | |
69 | self.disable_repo(repo) | |
ae20b05f MT |
70 | |
71 | # Update all indexes of the repositories (not force) so that we will | |
72 | # always work with valid data. | |
c07a3ca7 | 73 | self.update(offline=self.pakfire.offline) |
ae20b05f | 74 | |
c605d735 MT |
75 | def __iter__(self): |
76 | repositories = self.__repos.values() | |
77 | repositories.sort() | |
78 | ||
79 | return iter(repositories) | |
ae20b05f | 80 | |
a2d1644c MT |
81 | def __len__(self): |
82 | """ | |
83 | Return the count of enabled repositories. | |
84 | """ | |
c605d735 | 85 | return len([r for r in self if r.enabled]) |
a2d1644c | 86 | |
c605d735 MT |
87 | @property |
88 | def pool(self): | |
89 | return self.pakfire.pool | |
a2d1644c MT |
90 | |
91 | def _parse(self, name, args): | |
92 | # XXX need to make variable expansion | |
93 | ||
94 | _args = { | |
95 | "name" : name, | |
96 | "enabled" : True, | |
97 | "gpgkey" : None, | |
98 | "mirrorlist" : None, | |
99 | } | |
100 | _args.update(args) | |
101 | ||
c605d735 | 102 | repo = RepositorySolv(self.pakfire, **_args) |
a2d1644c MT |
103 | |
104 | self.add_repo(repo) | |
105 | ||
106 | def add_repo(self, repo): | |
c605d735 MT |
107 | if self.__repos.has_key(repo.name): |
108 | raise Exception, "Repository with that name does already exist." | |
a2d1644c | 109 | |
c605d735 | 110 | self.__repos[repo.name] = repo |
67bc4528 | 111 | |
c157d1e2 MT |
112 | def rem_repo(self, repo): |
113 | """ | |
114 | Remove the given repository from the global repository set. | |
115 | """ | |
116 | try: | |
117 | del self.__repos[repo.name] | |
118 | except KeyError: | |
119 | logging.debug("Repository that was to be removed does not exist: %s" % repo.name) | |
120 | ||
c605d735 MT |
121 | def get_repo(self, name): |
122 | """ | |
123 | Get the repository with the given name, if not available, return | |
124 | the dummy repository. | |
125 | """ | |
126 | try: | |
127 | return self.__repos[name] | |
128 | except KeyError: | |
129 | return self.dummy | |
a2d1644c | 130 | |
c605d735 MT |
131 | def enable_repo(self, name): |
132 | try: | |
f9a012a8 | 133 | self.__repos[name].enabled = True |
c605d735 MT |
134 | except KeyError: |
135 | pass | |
a2d1644c MT |
136 | |
137 | def disable_repo(self, name): | |
c605d735 | 138 | try: |
f9a012a8 | 139 | self.__repos[name].enabled = False |
c605d735 MT |
140 | except KeyError: |
141 | pass | |
a2d1644c | 142 | |
c07a3ca7 | 143 | def update(self, force=False, offline=False): |
a2d1644c MT |
144 | logging.debug("Updating all repository indexes (force=%s)" % force) |
145 | ||
c605d735 MT |
146 | # update all indexes if necessary or forced |
147 | for repo in self: | |
c07a3ca7 | 148 | repo.update(force=force, offline=offline) |
a2d1644c | 149 | |
c605d735 | 150 | def whatprovides(self, what): |
376eb555 MT |
151 | what = self.pakfire.create_relation(what) |
152 | ||
c605d735 MT |
153 | for solv in self.pool.providers(what): |
154 | yield packages.SolvPackage(self.pakfire, solv) | |
31267a64 MT |
155 | |
156 | def clean(self): | |
157 | logging.info("Cleaning up all repository caches...") | |
158 | ||
159 | for repo in self: | |
160 | repo.clean() |