]>
git.ipfire.org Git - people/ms/pakfire.git/blob - src/pakfire/packages/installed.py
2 ###############################################################################
4 # Pakfire - The IPFire package management system #
5 # Copyright (C) 2011 Pakfire development team #
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. #
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. #
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/>. #
20 ###############################################################################
24 import pakfire
.downloader
25 import pakfire
.filelist
27 from base
import Package
28 from file import BinaryPackage
30 import pakfire
.util
as util
31 from pakfire
.constants
import *
33 class DatabasePackage(Package
):
36 def __init__(self
, pakfire
, repo
, db
, data
):
37 Package
.__init
__(self
, pakfire
, repo
)
44 for key
in data
.keys():
45 self
._data
[key
] = data
[key
]
48 return "<%s %s>" % (self
.__class
__.__name
__, self
.friendly_name
)
56 id = self
.metadata
.get("id")
64 return self
.metadata
.get("name")
68 return self
.metadata
.get("version")
72 return self
.metadata
.get("release")
76 epoch
= self
.metadata
.get("epoch", 0)
82 return self
.metadata
.get("arch")
86 return self
.metadata
.get("maintainer")
90 return self
.metadata
.get("license")
94 return self
.metadata
.get("summary")
97 def description(self
):
98 return self
.metadata
.get("description")
102 groups
= self
.metadata
.get("groups", "")
105 return groups
.split()
110 def build_date(self
):
111 return self
.metadata
.get("build_date")
114 def build_time(self
):
115 build_time
= self
.metadata
.get("build_time", 0)
118 return int(build_time
)
123 def build_host(self
):
124 return self
.metadata
.get("build_host")
128 return self
.metadata
.get("build_id")
132 return self
.metadata
.get("vendor")
136 return self
.metadata
.get("uuid")
140 return self
.metadata
.get("size", 0)
144 inst_size
= self
.metadata
.get("inst_size", None)
146 # As install size has not always been saved in the database
147 # use the package size instead.
148 if inst_size
is None:
154 def dependencies(self
):
155 if not hasattr(self
, "__dependencies"):
156 self
.__dependencies
= {}
159 c
.execute("SELECT type, dependency FROM dependencies WHERE pkg = ?", (self
.id,))
161 for type, dependency
in c
.fetchall():
163 self
.__dependencies
[type].append(dependency
)
165 self
.__dependencies
[type] = [dependency
,]
167 return self
.__dependencies
171 return self
.dependencies
.get("provides", [])
175 return self
.dependencies
.get("requires", [])
179 return self
.dependencies
.get("conflicts", [])
183 return self
.dependencies
.get("obsoletes", [])
186 def recommends(self
):
187 return self
.dependencies
.get("recommends", [])
191 return self
.dependencies
.get("suggests", [])
195 return self
.metadata
.get("hash1")
199 return self
.metadata
.get("scriptlet")
201 def get_scriptlet(self
, action
):
203 c
.execute("SELECT scriptlet FROM scriptlets WHERE pkg = ? AND action = ? LIMIT 1", (self
.id, action
,))
208 # If no row was returned, no scriptlet for this action
211 return row
["scriptlet"]
218 return self
.metadata
.get("filename")
222 if self
._filelist
is None:
226 c
.execute("SELECT * FROM files WHERE pkg = ?", (self
.id,))
228 for row
in c
.fetchall():
229 file = pakfire
.filelist
.FileDatabase(self
.pakfire
, self
.db
, row
["id"], row
)
230 self
._filelist
.append(file)
232 return self
._filelist
235 def configfiles(self
):
238 for file in self
.filelist
:
239 if not file.is_config():
250 for file in self
.filelist
:
251 if not file.is_datafile():
258 def _does_provide_file(self
, requires
):
260 A faster version to find a file in the database.
263 c
.execute("SELECT * FROM files WHERE name GLOB ? AND pkg = ?",
264 (requires
.requires
, self
.id))
275 def download(self
, text
=""):
277 Downloads the package from repository and returns a new instance
281 # XXX a bit hacky, but InstalledRepository has no cache.
282 if self
.repo
.name
== "installed":
285 # Marker, if we need to download the package.
288 # Add shortcut for cache.
289 cache
= self
.repo
.cache
291 cache_filename
= "packages/%s" % os
.path
.basename(self
.filename
)
293 # Check if file already exists in cache.
294 if cache
.exists(cache_filename
):
295 # If the file does already exist, we check if the hash1 matches.
296 if cache
.verify(cache_filename
, self
.hash1
):
297 # We already got the right file. Skip download.
300 # The file in cache has a wrong hash. Remove it and repeat download.
301 cache
.remove(cache_filename
)
304 # Make sure filename is of type string (and not unicode)
305 filename
= str(self
.filename
)
307 # Get a package grabber and add mirror download capabilities to it.
308 grabber
= pakfire
.downloader
.PackageDownloader(
309 text
=text
+ os
.path
.basename(filename
),
311 grabber
= self
.repo
.mirrors
.group(grabber
)
313 i
= grabber
.urlopen(filename
)
315 # Open input and output files and download the file.
316 o
= cache
.open(cache_filename
, "w")
318 buf
= i
.read(BUFFER_SIZE
)
321 buf
= i
.read(BUFFER_SIZE
)
326 # Verify if the download was okay.
327 if not cache
.verify(cache_filename
, self
.hash1
):
328 raise Exception, "XXX this should never happen..."
330 filename
= os
.path
.join(cache
.path
, cache_filename
)
331 return BinaryPackage(self
.pakfire
, self
.repo
, filename
)
333 def cleanup(self
, message
, prefix
):
336 # Get all files, that are in this package and check for all of
337 # them if they need to be removed.
338 files
= self
.filelist
340 # Fetch the whole filelist of the system from the database and create
341 # a diff. Exclude files from this package - of course.
342 c
.execute("SELECT DISTINCT name FROM files WHERE pkg != ?", (self
.id,))
344 installed_files
= set()
346 installed_files
.add(row
["name"])
349 # List with files to be removed.
353 # Try to find the if an other package owns the file.
354 # Handles packages that move files from / to /usr.
356 filename
= os
.path
.abspath(f
.name
)
360 if filename
in installed_files
:
363 remove_files
.append(f
)
365 self
._remove
_files
(remove_files
, message
, prefix
)
368 def signatures(self
):
369 # Database packages do not have any signatures.
373 # XXX maybe we can remove this later?
374 class InstalledPackage(DatabasePackage
):