Merge lp:~mterry/update-manager/toggle-fix into lp:update-manager

Proposed by Michael Terry
Status: Merged
Merged at revision: 2594
Proposed branch: lp:~mterry/update-manager/toggle-fix
Merge into: lp:update-manager
Diff against target: 118 lines (+21/-36)
2 files modified
UpdateManager/Core/UpdateList.py (+5/-2)
UpdateManager/UpdatesAvailable.py (+16/-34)
To merge this branch: bzr merge lp:~mterry/update-manager/toggle-fix
Reviewer Review Type Date Requested Status
Martin Pitt Approve
Review via email: mp+149116@code.launchpad.net

Description of the change

-Refactors the toggle-an-item logic from two code paths down to one code path
-Introduce a convenience method is_selected() to cover a common question asked about a package
-Fixes bug 1129191 by dropping "auto_fix=False, auto_inst=False" when marking a package from install. These flags were inherited from the old "toggle_by_origin" method and seem to have been an optimization because we knew that all affected packages were from same PPA/origin and wouldn't need a fixer check. But we can no longer make that same assumption. Running the fixer makes the bug go away.

To post a comment you must log in.
Revision history for this message
Martin Pitt (pitti) wrote :

I can reproduce the bug and confirm that this branch fixes it, so I merged it. Thanks! However, see the bug for more details, I can't upload it just yet.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'UpdateManager/Core/UpdateList.py'
--- UpdateManager/Core/UpdateList.py 2013-01-23 15:46:52 +0000
+++ UpdateManager/Core/UpdateList.py 2013-02-18 17:55:25 +0000
@@ -50,6 +50,9 @@
50 self.name = name50 self.name = name
51 self.pkg = pkg51 self.pkg = pkg
5252
53 def is_selected(self):
54 return self.pkg.marked_install or self.pkg.marked_upgrade
55
5356
54class UpdateGroup(UpdateItem):57class UpdateGroup(UpdateItem):
55 def __init__(self, pkg, name, icon):58 def __init__(self, pkg, name, icon):
@@ -101,13 +104,13 @@
101104
102 def packages_are_selected(self):105 def packages_are_selected(self):
103 for item in self.items:106 for item in self.items:
104 if item.pkg.marked_install or item.pkg.marked_upgrade:107 if item.is_selected():
105 return True108 return True
106 return False109 return False
107110
108 def selection_is_inconsistent(self):111 def selection_is_inconsistent(self):
109 pkgs_installing = [item for item in self.items112 pkgs_installing = [item for item in self.items
110 if item.pkg.marked_install or item.pkg.marked_upgrade]113 if item.is_selected()]
111 return (len(pkgs_installing) > 0 and114 return (len(pkgs_installing) > 0 and
112 len(pkgs_installing) < len(self.items))115 len(pkgs_installing) < len(self.items))
113116
114117
=== modified file 'UpdateManager/UpdatesAvailable.py'
--- UpdateManager/UpdatesAvailable.py 2013-01-29 21:14:59 +0000
+++ UpdateManager/UpdatesAvailable.py 2013-02-18 17:55:25 +0000
@@ -420,7 +420,7 @@
420 for group in data.groups:420 for group in data.groups:
421 for item in group.items:421 for item in group.items:
422 pkg = item.pkg422 pkg = item.pkg
423 this_install = pkg.marked_install or pkg.marked_upgrade423 this_install = item.is_selected()
424 if saw_install is not None and saw_install != this_install:424 if saw_install is not None and saw_install != this_install:
425 inconsistent = True425 inconsistent = True
426 break426 break
@@ -658,8 +658,7 @@
658 data = model.get_value(iter, LIST_UPDATE_DATA)658 data = model.get_value(iter, LIST_UPDATE_DATA)
659 active = False659 active = False
660 if data.item:660 if data.item:
661 active = data.item.pkg.marked_install or \661 active = data.item.is_selected()
662 data.item.pkg.marked_upgrade
663 elif data.group:662 elif data.group:
664 active = data.group.packages_are_selected()663 active = data.group.packages_are_selected()
665 elif data.groups:664 elif data.groups:
@@ -871,32 +870,13 @@
871 data = self.store.get_value(iter, LIST_UPDATE_DATA)870 data = self.store.get_value(iter, LIST_UPDATE_DATA)
872 # make sure that we don't allow to toggle deactivated updates871 # make sure that we don't allow to toggle deactivated updates
873 # this is needed for the call by the row activation callback872 # this is needed for the call by the row activation callback
874 if data.groups or data.group:873 if data.groups:
875 if data.groups:874 self.toggle_from_items([item for group in data.groups
876 self.toggle_from_groups(data.groups)875 for item in group.items])
877 elif data.group:876 elif data.group:
878 self.toggle_from_groups([data.group])877 self.toggle_from_items(data.group.items)
879 self.updates_changed()
880 self.treeview_update.queue_draw()
881 return
882 if (data.item is None or data.item.pkg is None or
883 data.item.pkg.name in self.list.held_back):
884 return False
885 self.setBusy(True)
886 # update the cache
887 if data.item.pkg.marked_install or data.item.pkg.marked_upgrade:
888 data.item.pkg.mark_keep()
889 if self.cache._depcache.broken_count:
890 Fix = apt_pkg.ProblemResolver(self.cache._depcache)
891 Fix.resolve_by_keep()
892 else:878 else:
893 try:879 self.toggle_from_items([data.item])
894 data.item.pkg.mark_install()
895 except SystemError:
896 pass
897 self.updates_changed()
898 self.treeview_update.queue_draw()
899 self.setBusy(False)
900880
901 def on_treeview_update_row_activated(self, treeview, path, column, *args):881 def on_treeview_update_row_activated(self, treeview, path, column, *args):
902 """882 """
@@ -905,18 +885,20 @@
905 """885 """
906 self.on_update_toggled(None, path)886 self.on_update_toggled(None, path)
907887
908 def toggle_from_groups(self, groups):888 def toggle_from_items(self, items):
909 self.setBusy(True)889 self.setBusy(True)
910 actiongroup = apt_pkg.ActionGroup(self.cache._depcache)890 actiongroup = apt_pkg.ActionGroup(self.cache._depcache)
911891
912 # Deselect all updates if any in group are selected892 # Deselect all updates if any are selected
913 keep_packages = any([g.packages_are_selected() for g in groups])893 keep_packages = any([item.is_selected() for item in items])
914 for group in groups:894 for item in items:
915 for item in group.items:895 try:
916 if keep_packages:896 if keep_packages:
917 item.pkg.mark_keep()897 item.pkg.mark_keep()
918 elif not item.pkg.name in self.list.held_back:898 elif not item.pkg.name in self.list.held_back:
919 item.pkg.mark_install(auto_fix=False, auto_inst=False)899 item.pkg.mark_install()
900 except SystemError:
901 pass
920902
921 # check if we left breakage903 # check if we left breakage
922 if self.cache._depcache.broken_count:904 if self.cache._depcache.broken_count:

Subscribers

People subscribed via source and target branches

to status/vote changes: