]> git.ipfire.org Git - pakfire.git/blame - python/pakfire/repository/__init__.py
Rewrite the buildsystem of this package.
[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
23
c605d735
MT
24import pakfire.packages as packages
25
89fac8cf 26from base import RepositoryDummy
c605d735 27from local import RepositoryDir, RepositoryBuild, RepositoryLocal
c605d735 28from remote import RepositorySolv
a2d1644c
MT
29
30class 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()