]> git.ipfire.org Git - pakfire.git/blob - pakfire/repository/base.py
241fc3ec03709452ef28ff8f72d237d43a38ddc3
[pakfire.git] / pakfire / repository / base.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 fnmatch
23 import glob
24 import logging
25 import re
26
27 import cache
28 import pakfire.packages as packages
29 import pakfire.satsolver as satsolver
30
31 class RepositoryFactory(object):
32 def __init__(self, pakfire, name, description):
33 self.pakfire = pakfire
34 self.name = name
35 self.description = description
36
37 # Reference to corresponding Repo object in the solver.
38 self.solver_repo = satsolver.Repo(self.pool, self.name)
39 self.solver_repo.set_priority(self.priority)
40
41 logging.debug("Initialized new repository: %s" % self)
42
43 # Create an cache object
44 self.cache = cache.RepositoryCache(self.pakfire, self)
45
46 # The index MUST be set by an inheriting class.
47 self.index = None
48
49 def __repr__(self):
50 return "<%s %s>" % (self.__class__.__name__, self.name)
51
52 def __cmp__(self, other):
53 return cmp(self.priority * -1, other.priority * -1) or \
54 cmp(self.name, other.name)
55
56 def __len__(self):
57 return self.solver_repo.size()
58
59 def __iter__(self):
60 pkgs = []
61
62 for solv in self.solver_repo.get_all():
63 pkg = packages.SolvPackage(self.pakfire, solv, self)
64 pkgs.append(pkg)
65
66 return iter(pkgs)
67
68 @property
69 def pool(self):
70 return self.pakfire.pool
71
72 def get_enabled(self):
73 return self.solver_repo.get_enabled()
74
75 def set_enabled(self, val):
76 self.solver_repo.set_enabled(val)
77
78 if val:
79 logging.debug("Enabled repository '%s'." % self.name)
80 else:
81 logging.debug("Disabled repository '%s'." % self.name)
82
83 enabled = property(get_enabled, set_enabled)
84
85 @property
86 def arch(self):
87 return self.pakfire.distro.arch
88
89 @property
90 def distro(self):
91 """
92 Link to distro object.
93 """
94 return self.pakfire.distro
95
96 @property
97 def priority(self):
98 raise NotImplementedError
99
100 @property
101 def local(self):
102 """
103 Say if a repository is a local one or remotely located.
104
105 Used to check if we need to download files.
106 """
107 return False
108
109 def update(self, force=False, offline=False):
110 """
111 A function that is called to update the local data of
112 the repository.
113 """
114 assert self.index
115
116 self.index.update(force, offline=offline)
117
118 def clean(self):
119 """
120 Cleanup all temporary files of this repository.
121 """
122 logging.info("Cleaning up repository '%s'..." % self.name)
123 self.cache.destroy()
124
125 assert self.index
126 self.index.clear()
127
128 def dump(self, long=False, filelist=False):
129 dumps = []
130 # Dump all package information of the packages in this repository.
131 for pkg in self:
132 dump = pkg.dump(long=long, filelist=filelist)
133 dumps.append(dump)
134
135 return "\n\n".join(dumps)
136
137
138 class RepositoryDummy(RepositoryFactory):
139 """
140 Just a dummy repository that actually does nothing.
141 """
142 def __init__(self, pakfire):
143 RepositoryFactory.__init__(self, pakfire, "dummy",
144 "This is a dummy repository.")
145
146 @property
147 def priority(self):
148 # This will never be used in the solving process, but still it needs
149 # a value.
150 return 0