Merge lp:~mvo/aptdaemon/mvo into lp:aptdaemon

Proposed by Michael Vogt
Status: Merged
Merge reported by: Michael Vogt
Merged at revision: not available
Proposed branch: lp:~mvo/aptdaemon/mvo
Merge into: lp:aptdaemon
Diff against target: 143 lines (+63/-10)
3 files modified
aptdaemon/client.py (+6/-3)
aptdaemon/core.py (+9/-4)
aptdaemon/worker.py (+48/-3)
To merge this branch: bzr merge lp:~mvo/aptdaemon/mvo
Reviewer Review Type Date Requested Status
Sebastian Heinlein Disapprove
Review via email: mp+16775@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Michael Vogt (mvo) wrote :

support for removal of unused dependencies

Revision history for this message
Sebastian Heinlein (glatzor) wrote :

Was implemented as a transaction attribute some time ago

review: Disapprove

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'aptdaemon/client.py'
--- aptdaemon/client.py 2009-12-12 11:15:12 +0000
+++ aptdaemon/client.py 2010-01-04 11:07:14 +0000
@@ -491,10 +491,13 @@
491 return self._run_transaction("UpgradePackages", [package_names],491 return self._run_transaction("UpgradePackages", [package_names],
492 wait, reply_handler, error_handler)492 wait, reply_handler, error_handler)
493493
494 def remove_packages(self, package_names, wait=False, reply_handler=None,494 def remove_packages(self, package_names, wait=False,
495 error_handler=None):495 remove_unused_dependencies=False,
496 reply_handler=None, error_handler=None):
496 """Remove packages by name."""497 """Remove packages by name."""
497 return self._run_transaction("RemovePackages", [package_names],498 return self._run_transaction("RemovePackages",
499 (package_names,
500 remove_unused_dependencies),
498 wait, reply_handler, error_handler)501 wait, reply_handler, error_handler)
499502
500 def commit_packages(self, install, reinstall, remove, purge, upgrade,503 def commit_packages(self, install, reinstall, remove, purge, upgrade,
501504
=== modified file 'aptdaemon/core.py'
--- aptdaemon/core.py 2009-12-12 09:13:33 +0000
+++ aptdaemon/core.py 2010-01-04 11:07:14 +0000
@@ -865,24 +865,29 @@
865 return deferred865 return deferred
866866
867 @dbus_deferred_method(APTDAEMON_DBUS_INTERFACE,867 @dbus_deferred_method(APTDAEMON_DBUS_INTERFACE,
868 in_signature="as", out_signature="s",868 in_signature="asb", out_signature="s",
869 sender_keyword="sender")869 sender_keyword="sender")
870 def RemovePackages(self, package_names, sender):870 def RemovePackages(self, package_names, remove_unused_dependencies, sender):
871 """Return the id of a newly create transaction which will remove871 """Return the id of a newly create transaction which will remove
872 the given packages.872 the given packages.
873873
874 Keyword arguments:874 Keyword arguments:
875 package_names -- list of package names to remove875 package_names -- list of package names to remove
876 remove_unused_dependencies -- remove direct unused dependencies too
876 sender -- the unique D-Bus name of the sender (provided by D-Bus)877 sender -- the unique D-Bus name of the sender (provided by D-Bus)
877 """878 """
878 log.info("RemovePackages() was called: %s" % package_names)879 log.info("RemovePackages() was called: '%s' '%i'" % (
880 package_names, remove_unused_dependencies))
879 packages = ([], [], package_names, [], [])881 packages = ([], [], package_names, [], [])
882 kwargs = {"remove_unused_dependencies": remove_unused_dependencies,
883 "package_names" : package_names,
884 }
880 deferred = policykit1.check_authorization_by_name(sender,885 deferred = policykit1.check_authorization_by_name(sender,
881 policykit1.PK_ACTION_REMOVE_PACKAGES)886 policykit1.PK_ACTION_REMOVE_PACKAGES)
882 deferred.add_callback(lambda x: policykit1.get_uid_from_dbus_name(sender))887 deferred.add_callback(lambda x: policykit1.get_uid_from_dbus_name(sender))
883 deferred.add_callback(lambda uid: Transaction(ROLE_REMOVE_PACKAGES,888 deferred.add_callback(lambda uid: Transaction(ROLE_REMOVE_PACKAGES,
884 self.queue, uid,889 self.queue, uid,
885 packages=packages))890 kwargs=kwargs))
886 deferred.add_callback(lambda trans: trans.tid)891 deferred.add_callback(lambda trans: trans.tid)
887 return deferred892 return deferred
888893
889894
=== modified file 'aptdaemon/worker.py'
--- aptdaemon/worker.py 2009-12-13 07:59:57 +0000
+++ aptdaemon/worker.py 2010-01-04 11:07:14 +0000
@@ -94,7 +94,7 @@
94 elif self.trans.role == ROLE_INSTALL_FILE:94 elif self.trans.role == ROLE_INSTALL_FILE:
95 self.install_file(**self.trans.kwargs)95 self.install_file(**self.trans.kwargs)
96 elif self.trans.role == ROLE_REMOVE_PACKAGES:96 elif self.trans.role == ROLE_REMOVE_PACKAGES:
97 self.remove_packages(self.trans.packages[2])97 self.remove_packages(**self.trans.kwargs)
98 elif self.trans.role == ROLE_UPGRADE_SYSTEM:98 elif self.trans.role == ROLE_UPGRADE_SYSTEM:
99 self.upgrade_system(**self.trans.kwargs)99 self.upgrade_system(**self.trans.kwargs)
100 elif self.trans.role == ROLE_UPDATE_CACHE:100 elif self.trans.role == ROLE_UPDATE_CACHE:
@@ -281,18 +281,26 @@
281 begin=64, end=95)):281 begin=64, end=95)):
282 raise TransactionFailed(ERROR_UNKNOWN, deb._failure_string)282 raise TransactionFailed(ERROR_UNKNOWN, deb._failure_string)
283283
284 def remove_packages(self, package_names):284 def remove_packages(self, package_names, remove_unused_dependencies):
285 """Remove packages.285 """Remove packages.
286286
287 Keyword argument:287 Keyword argument:
288 package_names -- list of package name which should be installed288 package_names -- list of package name which should be installed
289 remove_unused_dependencies -- remove unused direct dependencies
289 """290 """
290 log.info("Removing packages: %s", package_names)291 log.info("Removing packages: '%s' '%i'" % (package_names, remove_unused_dependencies))
291 ac = self._cache.actiongroup()292 ac = self._cache.actiongroup()
292 resolver = apt.cache.ProblemResolver(self._cache)293 resolver = apt.cache.ProblemResolver(self._cache)
293 self._mark_packages_for_removal(package_names, resolver)294 self._mark_packages_for_removal(package_names, resolver)
294 self._resolve_depends(resolver)295 self._resolve_depends(resolver)
295 ac.release()296 ac.release()
297 if remove_unused_dependencies:
298 # remove no longer used automatic dependencies
299 ac = self._cache.actiongroup()
300 for pkgname in package_names:
301 for unused in self._get_installed_automatic_depends_for_pkg(pkgname):
302 self._cache[unused].markDelete()
303 ac.release()
296 self._commit_changes(fetch_range=(10, 10),304 self._commit_changes(fetch_range=(10, 10),
297 install_range=(10, 90))305 install_range=(10, 90))
298 #FIXME: should we use a persistant cache? make a check?306 #FIXME: should we use a persistant cache? make a check?
@@ -322,6 +330,43 @@
322 resolver.protect(pkg)330 resolver.protect(pkg)
323 resolver.remove(pkg)331 resolver.remove(pkg)
324332
333 def _installed_dependencies(self, pkg_name, all_deps=None):
334 """ recursively return all installed dependencies of a given pkg """
335 #print "_installed_dependencies", pkg_name, all_deps
336 if not all_deps:
337 all_deps = set()
338 if not self._cache.has_key(pkg_name):
339 return all_deps
340 cur = self._cache[pkg_name]._pkg.CurrentVer
341 if not cur:
342 return all_deps
343 for t in ("PreDepends", "Depends", "Recommends"):
344 try:
345 for dep in cur.DependsList[t]:
346 dep_name = dep[0].TargetPkg.Name
347 if not dep_name in all_deps:
348 all_deps.add(dep_name)
349 all_deps |= self._installed_dependencies(dep_name, all_deps)
350 except KeyError:
351 pass
352 return all_deps
353 def _get_installed_automatic_depends_for_pkg(self, pkgname):
354 """ Get the installed automatic dependencies for this given package
355 only.
356
357 Note that the package must be marked for removal already for
358 this to work
359 """
360 installed_auto_deps = set()
361 deps = self._installed_dependencies(pkgname)
362 for dep_name in deps:
363 if self._cache.has_key(dep_name):
364 pkg = self._cache[dep_name]
365 if (pkg.isInstalled and
366 pkg.isAutoRemovable):
367 installed_auto_deps.add(dep_name)
368 return installed_auto_deps
369
325 def upgrade_packages(self, package_names):370 def upgrade_packages(self, package_names):
326 """Upgrade packages.371 """Upgrade packages.
327372

Subscribers

People subscribed via source and target branches

to status/vote changes: