]> git.ipfire.org Git - people/stevee/pakfire.git/blame - pakfire/repository/__init__.py
Add copyright information to all files.
[people/stevee/pakfire.git] / 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.
73 self.update()
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
c605d735
MT
112 def get_repo(self, name):
113 """
114 Get the repository with the given name, if not available, return
115 the dummy repository.
116 """
117 try:
118 return self.__repos[name]
119 except KeyError:
120 return self.dummy
a2d1644c 121
c605d735
MT
122 def enable_repo(self, name):
123 try:
f9a012a8 124 self.__repos[name].enabled = True
c605d735
MT
125 except KeyError:
126 pass
a2d1644c
MT
127
128 def disable_repo(self, name):
c605d735 129 try:
f9a012a8 130 self.__repos[name].enabled = False
c605d735
MT
131 except KeyError:
132 pass
a2d1644c
MT
133
134 def update(self, force=False):
135 logging.debug("Updating all repository indexes (force=%s)" % force)
136
c605d735
MT
137 # update all indexes if necessary or forced
138 for repo in self:
a2d1644c
MT
139 repo.update(force=force)
140
c605d735 141 def whatprovides(self, what):
376eb555
MT
142 what = self.pakfire.create_relation(what)
143
c605d735
MT
144 for solv in self.pool.providers(what):
145 yield packages.SolvPackage(self.pakfire, solv)
31267a64
MT
146
147 def clean(self):
148 logging.info("Cleaning up all repository caches...")
149
150 for repo in self:
151 repo.clean()