]>
git.ipfire.org Git - pakfire.git/blob - python/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
)
43 for key
in data
.keys():
44 self
._data
[key
] = data
[key
]
47 return "<%s %s>" % (self
.__class
__.__name
__, self
.friendly_name
)
55 id = self
.metadata
.get("id")
63 return self
.metadata
.get("name")
67 return self
.metadata
.get("version")
71 return self
.metadata
.get("release")
75 epoch
= self
.metadata
.get("epoch", 0)
81 return self
.metadata
.get("arch")
85 return self
.metadata
.get("maintainer")
89 return self
.metadata
.get("license")
93 return self
.metadata
.get("summary")
96 def description(self
):
97 return self
.metadata
.get("description")
101 groups
= self
.metadata
.get("groups", "")
104 return groups
.split()
109 def build_date(self
):
110 return self
.metadata
.get("build_date")
113 def build_time(self
):
114 build_time
= self
.metadata
.get("build_time", 0)
117 return int(build_time
)
122 def build_host(self
):
123 return self
.metadata
.get("build_host")
127 return self
.metadata
.get("build_id")
131 return self
.metadata
.get("uuid")
135 return self
.metadata
.get("size", 0)
144 return self
.metadata
.get("provides", "").split()
148 return self
.metadata
.get("requires", "").split()
152 return self
.metadata
.get("conflicts", "").split()
156 return self
.metadata
.get("obsoletes", "").split()
160 return self
.metadata
.get("hash1")
164 return self
.metadata
.get("scriptlet")
168 return self
.metadata
.get("filename") # XXX basename?
175 c
.execute("SELECT id FROM files WHERE pkg = ?", (self
.id,))
178 file = pakfire
.filelist
.FileDatabase(self
.pakfire
, self
.db
, id[0])
179 filelist
.append(file)
184 def configfiles(self
):
185 return [] # XXX to be done
187 def _does_provide_file(self
, requires
):
189 A faster version to find a file in the database.
192 c
.execute("SELECT * FROM files WHERE name GLOB ? AND pkg = ?",
193 (requires
.requires
, self
.id))
204 def download(self
, text
=""):
206 Downloads the package from repository and returns a new instance
210 # XXX a bit hacky, but InstalledRepository has no cache.
211 if self
.repo
.name
== "installed":
214 # Marker, if we need to download the package.
217 # Add shortcut for cache.
218 cache
= self
.repo
.cache
220 cache_filename
= "packages/%s" % os
.path
.basename(self
.filename
)
222 # Check if file already exists in cache.
223 if cache
.exists(cache_filename
):
224 # If the file does already exist, we check if the hash1 matches.
225 if cache
.verify(cache_filename
, self
.hash1
):
226 # We already got the right file. Skip download.
229 # The file in cache has a wrong hash. Remove it and repeat download.
230 cache
.remove(cache_filename
)
233 # Make sure filename is of type string (and not unicode)
234 filename
= str(self
.filename
)
236 # Get a package grabber and add mirror download capabilities to it.
237 grabber
= pakfire
.downloader
.PackageDownloader(
238 text
=text
+ os
.path
.basename(filename
),
240 grabber
= self
.repo
.mirrors
.group(grabber
)
242 i
= grabber
.urlopen(filename
)
244 # Open input and output files and download the file.
245 o
= cache
.open(cache_filename
, "w")
247 buf
= i
.read(BUFFER_SIZE
)
250 buf
= i
.read(BUFFER_SIZE
)
255 # Verify if the download was okay.
256 if not cache
.verify(cache_filename
, self
.hash1
):
257 raise Exception, "XXX this should never happen..."
259 filename
= os
.path
.join(cache
.path
, cache_filename
)
260 return BinaryPackage(self
.pakfire
, self
.repo
, filename
)
262 def cleanup(self
, message
, prefix
):
265 # Get all files, that are in this package and check for all of
266 # them if they need to be removed.
267 files
= self
.filelist
269 # Fetch the whole filelist of the system from the database and create
270 # a diff. Exclude files from this package - of course.
271 c
.execute("SELECT name FROM files WHERE pkg != ?", (self
.id,))
274 # Check if file in filelist.
275 if row
["name"] in files
:
276 files
.remove(row
["name"])
280 self
._remove
_files
(files
, message
, prefix
)
283 # XXX maybe we can remove this later?
284 class InstalledPackage(DatabasePackage
):