]>
git.ipfire.org Git - 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")
203 return self
.metadata
.get("filename")
207 if self
._filelist
is None:
211 c
.execute("SELECT * FROM files WHERE pkg = ?", (self
.id,))
213 for row
in c
.fetchall():
214 file = pakfire
.filelist
.FileDatabase(self
.pakfire
, self
.db
, row
["id"], row
)
215 self
._filelist
.append(file)
217 return self
._filelist
220 def configfiles(self
):
223 for file in self
.filelist
:
224 if not file.is_config():
235 for file in self
.filelist
:
236 if not file.is_datafile():
243 def _does_provide_file(self
, requires
):
245 A faster version to find a file in the database.
248 c
.execute("SELECT * FROM files WHERE name GLOB ? AND pkg = ?",
249 (requires
.requires
, self
.id))
260 def download(self
, text
=""):
262 Downloads the package from repository and returns a new instance
266 # XXX a bit hacky, but InstalledRepository has no cache.
267 if self
.repo
.name
== "installed":
270 # Marker, if we need to download the package.
273 # Add shortcut for cache.
274 cache
= self
.repo
.cache
276 cache_filename
= "packages/%s" % os
.path
.basename(self
.filename
)
278 # Check if file already exists in cache.
279 if cache
.exists(cache_filename
):
280 # If the file does already exist, we check if the hash1 matches.
281 if cache
.verify(cache_filename
, self
.hash1
):
282 # We already got the right file. Skip download.
285 # The file in cache has a wrong hash. Remove it and repeat download.
286 cache
.remove(cache_filename
)
289 # Make sure filename is of type string (and not unicode)
290 filename
= str(self
.filename
)
292 # Get a package grabber and add mirror download capabilities to it.
293 grabber
= pakfire
.downloader
.PackageDownloader(
294 text
=text
+ os
.path
.basename(filename
),
296 grabber
= self
.repo
.mirrors
.group(grabber
)
298 i
= grabber
.urlopen(filename
)
300 # Open input and output files and download the file.
301 o
= cache
.open(cache_filename
, "w")
303 buf
= i
.read(BUFFER_SIZE
)
306 buf
= i
.read(BUFFER_SIZE
)
311 # Verify if the download was okay.
312 if not cache
.verify(cache_filename
, self
.hash1
):
313 raise Exception, "XXX this should never happen..."
315 filename
= os
.path
.join(cache
.path
, cache_filename
)
316 return BinaryPackage(self
.pakfire
, self
.repo
, filename
)
318 def cleanup(self
, message
, prefix
):
321 # Get all files, that are in this package and check for all of
322 # them if they need to be removed.
323 files
= self
.filelist
325 # Fetch the whole filelist of the system from the database and create
326 # a diff. Exclude files from this package - of course.
327 c
.execute("SELECT DISTINCT name FROM files WHERE pkg != ?", (self
.id,))
329 installed_files
= set()
331 installed_files
.add(row
["name"])
334 # List with files to be removed.
338 # Try to find the if an other package owns the file.
339 # Handles packages that move files from / to /usr.
341 filename
= os
.path
.abspath(f
.name
)
345 if filename
in installed_files
:
348 remove_files
.append(f
)
350 self
._remove
_files
(remove_files
, message
, prefix
)
353 def signatures(self
):
354 # Database packages do not have any signatures.
358 # XXX maybe we can remove this later?
359 class InstalledPackage(DatabasePackage
):