2
# Copyright (c) 2005 Canonical
3
# Copyright (c) 2004 Conectiva, Inc.
5
# Written by Anders F Bjorklund <afb@users.sourceforge.net>
7
# This file is part of Smart Package Manager.
9
# Smart Package Manager is free software; you can redistribute it and/or
10
# modify it under the terms of the GNU General Public License as published
11
# by the Free Software Foundation; either version 2 of the License, or (at
12
# your option) any later version.
14
# Smart Package Manager is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
# General Public License for more details.
19
# You should have received a copy of the GNU General Public License
20
# along with Smart Package Manager; if not, write to the Free Software
21
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
from smart.cache import PackageInfo, Loader
24
from smart.backends.rpm.base import *
32
class RPMDocumentPackageInfo(PackageInfo):
34
def __init__(self, package, loader, info):
35
PackageInfo.__init__(self, package)
40
url = self._info.get("Location")
41
baseurl = self._info.get("BaseURL")
42
if baseurl == '(none)': baseurl = None
44
return [posixpath.join(baseurl or self._loader._baseurl, str(url))]
47
def getBuildTime(self):
48
t = self._info.get("Buildtime")
50
return int(calendar.timegm(t.utctimetuple()))
53
def getInstalledSize(self):
54
return self._info.get("Size")
56
def getSize(self, url):
57
return self._info.get("Packagesize")
59
def getMD5(self, url):
62
def getSHA(self, url):
63
return self._info.get("SHA")
65
def getSHA256(self, url):
68
def getDescription(self):
69
return self._info.get("Description", "")
72
return self._info.get("Summary", "")
74
def getReferenceURLs(self):
75
return [self._info.get("Url", "")]
78
sourcerpm = self._info.get("Sourcerpm", "")
79
sourcerpm = sourcerpm.replace(".src", "")
80
sourcerpm = sourcerpm.replace(".nosrc", "")
81
return sourcerpm.replace(".rpm", "")
84
return self._info.get("Group", "")
87
return self._info.get("License", "")
90
class RPMDocumentLoader(Loader):
92
def __init__(self, collection, filelistscoll, baseurl):
94
self._collection = collection
95
self._filelistscoll = filelistscoll
96
self._baseurl = baseurl
97
self._fileprovides = {}
98
self._parsedflist = False
103
self._fileprovides.clear()
104
self._parsedflist = False
107
def getInfo(self, pkg):
108
return RPMDocumentPackageInfo(pkg, self, pkg.loaders[self])
110
def getLoadSteps(self):
111
return self._collection.count()
114
COMPMAP = { "EQ":"=", "LT":"<", "LE":"<=", "GT":">", "GE":">="}
116
# Prepare progress reporting.
117
progress = iface.getProgress(self._cache)
119
# Prepare package information.
129
version = "%s:%s" % (e, version)
131
version = "%s-%s" % (version, r)
138
return COMPMAP.get(flags)
140
for doc in self._collection.find():
141
pkgid = str(doc["_id"])
143
arch = str(doc["Arch"])
144
if rpm.archscore(arch) == 0:
148
name = str(doc["Name"])
153
version = strver(e, ver, rel)
155
for ename, erelation, e, ver, rel in doc["Requires"]:
157
ename[:7] in ("rpmlib(", "config(")):
161
erelation = strrel(erelation)
162
eversion = strver(e, ver, rel)
163
reqdict[(RPMRequires,
164
ename, erelation, eversion)] = True
166
for ename, erelation, e, ver, rel in doc["Provides"]:
168
erelation = strrel(erelation)
169
eversion = strver(e, ver, rel)
171
filedict[ename] = True
173
if ename == name and eversion == version:
174
eversion = "%s@%s" % (eversion, arch)
175
Prv = RPMNameProvides
178
prvdict[(Prv, ename.encode('utf-8'), eversion)] = True
180
for ename, erelation, e, ver, rel in doc["Obsoletes"]:
182
erelation = strrel(erelation)
183
eversion = strver(e, ver, rel)
184
tup = (RPMObsoletes, ename, erelation, eversion)
188
for ename, erelation, e, ver, rel in doc["Conflicts"]:
190
erelation = strrel(erelation)
191
eversion = strver(e, ver, rel)
192
cnfdict[(RPMConflicts,
193
ename, erelation, eversion)] = True
195
for file, type in doc["Files"]:
196
filedict[file] = True
198
# Use all the information acquired to build the package.
200
versionarch = str("%s@%s" % (version, arch))
202
upgdict[(RPMObsoletes,
203
str(name), '<', versionarch)] = True
205
reqargs = [x for x in reqdict
206
if not ((x[2] is None or "=" in x[2]) and
207
(RPMProvides, x[1], x[3]) in prvdict or
208
system_provides.match(*x[:3]))]
209
prvargs = prvdict.keys()
210
cnfargs = cnfdict.keys()
211
upgargs = upgdict.keys()
213
pkg = self.buildPackage((RPMPackage, str(name), versionarch),
214
prvargs, reqargs, upgargs, cnfargs)
215
pkg.loaders[self] = doc
217
# Store the provided files for future usage.
219
for filename in filedict:
220
lst = self._fileprovides.get(filename)
222
self._fileprovides[filename] = [pkg]
227
self._pkgids[pkgid] = pkg
229
# Reset all information.
240
def loadFileProvides(self, fndict):
241
bfp = self.buildFileProvides
242
parsed = self._parsedflist
244
if fn not in self._fileprovides:
246
self._parsedflist = parsed = True
247
self.parseFilesList(fndict)
248
if fn not in self._fileprovides:
249
pkgs = self._fileprovides[fn] = ()
251
pkgs = self._fileprovides[fn]
253
pkgs = self._fileprovides[fn] = ()
255
pkgs = self._fileprovides[fn]
259
bfp(pkg, (RPMProvides, fn, None))
262
def parseFilesList(self, fndict):
263
pkgids = self._pkgids
264
fileprovides = self._fileprovides
266
if not self._filelistscoll:
269
for doc in self._filelistscoll.find():
270
if doc["Arch"] == "src":
272
pkg = pkgids.get(doc["_id"])
273
for file, type in doc["Files"]:
275
pkgs = fileprovides.get(file)
277
fileprovides[file] = [pkg]
281
def enablePsyco(psyco):
282
psyco.bind(RPMDocumentLoader.load)
283
psyco.bind(RPMDocumentLoader.loadFileProvides)
284
psyco.bind(RPMDocumentLoader.parseFilesList)
286
hooks.register("enable-psyco", enablePsyco)