77
79
def downloadable(self):
78
return True #FIXME: check for an equivalent
80
return True # FIXME: check for an equivalent
81
84
return self.package.get_property('summary')
84
88
return self.pkginfo.get_size(self.package.get_name())
86
91
def installed_size(self):
87
""" In packagekit, installed_size can be fetched only for installed packages,
88
and is stored in the same 'size' property as the package size """
92
"""In packagekit, installed_size can be fetched only for installed
93
packages, and is stored in the same 'size' property as the package
89
95
return self.pkginfo.get_installed_size(self.package.get_name())
92
99
return self.package.get_version()
94
102
def origins(self):
95
103
return self.pkginfo.get_origins(self.package.get_name())
97
106
def make_locale_string():
98
107
loc = locale.getlocale(locale.LC_MESSAGES)
100
109
return loc[0] + '.' + loc[1]
103
113
class PackagekitInfo(PackageInfo):
107
117
super(PackagekitInfo, self).__init__()
108
118
self.client = packagekit.Client()
109
119
self.client.set_locale(make_locale_string())
110
self._cache = {} # temporary hack for decent testing
120
self._cache = {} # temporary hack for decent testing
111
121
self._notfound_cache = []
112
122
self._repocache = {}
113
123
self.distro = get_distro()
136
146
return PackagekitVersion(p, self) if p else None
138
148
def get_candidate(self, pkgname):
139
p = self._get_one_package(pkgname, pfilter=packagekit.FilterEnum.NEWEST)
149
p = self._get_one_package(pkgname,
150
pfilter=packagekit.FilterEnum.NEWEST)
140
151
return PackagekitVersion(p, self) if p else None
142
153
def get_versions(self, pkgname):
143
return [PackagekitVersion(p, self) for p in self._get_packages(pkgname)]
154
return [PackagekitVersion(p, self)
155
for p in self._get_packages(pkgname)]
145
157
def get_section(self, pkgname):
146
158
# FIXME: things are fuzzy here - group-section association
167
179
p = self._get_one_package(pkgname)
170
res = self.client.get_files((p.get_id(),), None, self._on_progress_changed, None)
182
res = self.client.get_files((p.get_id(),), None,
183
self._on_progress_changed, None)
171
184
files = res.get_files_array()
186
199
def get_origins(self, pkgname):
187
200
self._get_repolist()
188
pkgs = self._get_packages(pkgname, pfilter=packagekit.FilterEnum.NOT_INSTALLED)
201
pkgs = self._get_packages(pkgname,
202
pfilter=packagekit.FilterEnum.NOT_INSTALLED)
225
239
autoremove = False
226
res = self.client.simulate_remove_packages((p.get_id(),),
240
res = self.client.simulate_remove_packages((p.get_id(),),
227
241
autoremove, None,
228
242
self._on_progress_changed, None,
232
return [p.get_name() for p in res.get_package_array() if p.get_name() != pkg.name]
247
for p in res.get_package_array()
248
if p.get_name() != pkg.name]
234
250
def get_packages_removed_on_install(self, pkg):
235
251
""" Returns a package names list of dependencies
237
253
p = self._get_one_package(pkg.name)
240
res = self.client.simulate_install_packages((p.get_id(),),
256
res = self.client.simulate_install_packages((p.get_id(),),
242
258
self._on_progress_changed, None,
246
return [p.get_name() for p in res.get_package_array() if (p.get_name() != pkg.name) and p.get_info() == packagekit.InfoEnum.INSTALLED]
263
for p in res.get_package_array()
264
if (p.get_name() != pkg.name)
265
and p.get_info() == packagekit.InfoEnum.INSTALLED]
248
def get_total_size_on_install(self, pkgname,
267
def get_total_size_on_install(self, pkgname,
249
268
addons_install=None, addons_remove=None,
250
269
archive_suite=None):
251
270
""" Returns a tuple (download_size, installed_size)
253
272
plus addons change.
255
274
# FIXME: support archive_suite here too
257
276
# FIXME: PackageKit reports only one size at a time
258
277
if self.is_installed(pkgname):
259
278
return (0, self.get_size(pkgname))
277
296
""" private methods """
278
297
def _get_package_details(self, packageid, cache=USE_CACHE):
279
LOG.debug("package_details %s", packageid) #, self._cache.keys()
298
LOG.debug("package_details %s", packageid) # , self._cache.keys()
280
299
if (packageid in self._cache.keys()) and cache:
281
300
return self._cache[packageid]
283
result = self.client.get_details((packageid,), None, self._on_progress_changed, None)
302
result = self.client.get_details((packageid,), None,
303
self._on_progress_changed, None)
284
304
pkgs = result.get_details_array()
287
307
packageid = pkgs[0].get_property('package-id')
288
308
self._cache[packageid] = pkgs[0]
291
def _get_one_package(self, pkgname, pfilter=packagekit.FilterEnum.NONE, cache=USE_CACHE):
292
LOG.debug("package_one %s", pkgname) #, self._cache.keys()
311
def _get_one_package(self, pkgname, pfilter=packagekit.FilterEnum.NONE,
313
LOG.debug("package_one %s", pkgname) # , self._cache.keys()
293
314
if (pkgname in self._cache.keys()) and cache:
294
315
return self._cache[pkgname]
295
316
ps = self._get_packages(pkgname, pfilter)
313
334
pkgs = result.get_package_array()
316
def _get_repolist(self, pfilter=packagekit.FilterEnum.NONE, cache=USE_CACHE):
337
def _get_repolist(self, pfilter=packagekit.FilterEnum.NONE,
317
339
""" obtain and cache a dictionary of repositories """
318
340
if self._repocache:
319
341
return self._repocache
342
364
def _on_progress_changed(self, progress, ptype, data=None):
345
if __name__=="__main__":
367
if __name__ == "__main__":
346
368
pi = PackagekitInfo()
348
370
print "Firefox, installed ", pi.is_installed('firefox')