]>
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 | |
8b6bc023 | 23 | log = logging.getLogger("pakfire") |
a2d1644c | 24 | |
c605d735 MT |
25 | import pakfire.packages as packages |
26 | ||
89fac8cf | 27 | from base import RepositoryDummy |
c605d735 | 28 | from local import RepositoryDir, RepositoryBuild, RepositoryLocal |
c605d735 | 29 | from remote import RepositorySolv |
a2d1644c MT |
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 | ||
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() |