[GNOME-ABRT PATCH 1/2] Do not remove invalid problems while sorting the list

Jakub Filak jfilak at redhat.com
Tue Jul 9 10:49:25 UTC 2013


Closes rhbz#956912

Signed-off-by: Jakub Filak <jfilak at redhat.com>
---
 src/gnome_abrt/views.py | 39 +++++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/gnome_abrt/views.py b/src/gnome_abrt/views.py
index 34e1fab..73a8fa7 100644
--- a/src/gnome_abrt/views.py
+++ b/src/gnome_abrt/views.py
@@ -88,13 +88,18 @@ def problem_to_storage_values(problem):
             problem]
 
 #pylint: disable=W0613
-def time_sort_func(model, first, second, view):
+def time_sort_func(model, first, second, trash):
+    # skip invalid problems which were marked invalid while sorting
+    if (model[first][2].problem_id in trash or
+        model[second][2].problem_id in trash):
+        return 0
+
     try:
         lhs = model[first][2]['date_last'].timetuple()
         rhs = model[second][2]['date_last'].timetuple()
         return time.mktime(lhs) - time.mktime(rhs)
     except errors.InvalidProblem as ex:
-        view._remove_problem_from_storage(ex.problem_id)
+        trash.add(ex.problem_id)
         logging.debug(ex)
         return 0
 
@@ -279,7 +284,10 @@ class OopsWindow(Gtk.ApplicationWindow):
         self._set_button_toggled(self._source.button, True)
 
         self._builder.ls_problems.set_sort_column_id(0, Gtk.SortType.DESCENDING)
-        self._builder.ls_problems.set_sort_func(0, time_sort_func, self)
+        # a set where invalid problems found while sorting of the problem list
+        # are stored
+        self._trash = set()
+        self._builder.ls_problems.set_sort_func(0, time_sort_func, self._trash)
         self._filter = ProblemsFilter(self, self._builder.tv_problems)
 
         self._builder.tv_problems.grab_focus()
@@ -405,13 +413,27 @@ class OopsWindow(Gtk.ApplicationWindow):
         Returns True if the problem was successfully added to the storage;
         otherwise returns False
         """
+        problem_values = None
         try:
-            self._builder.ls_problems.append(problem_to_storage_values(problem))
-            return True
+            problem_values = problem_to_storage_values(problem)
         except errors.InvalidProblem as ex:
             logging.debug("Exception: {0}".format(traceback.format_exc()))
-            self._remove_problem_from_storage(ex.problem_id)
-            return False
+            return
+
+        self._append_problem_values_to_storage(problem_values)
+
+    def _append_problem_values_to_storage(self, problem_values):
+        self._builder.ls_problems.append(problem_values)
+        self._clear_invalid_problems_trash()
+
+    def _clear_invalid_problems_trash(self):
+        # GtkListStore.append()/set_value() methods trigger
+        # time_sort_func() where InvalidProblem exception can occur. In that
+        # case time_sort_func() pushes an invalid problem to the trash set
+        # because the invalid problem cannot be removed while executing the
+        # operation
+        while self._trash:
+            self._remove_problem_from_storage(self._trash.pop())
 
     def _remove_problem_from_storage(self, problem):
         if problem is None:
@@ -433,6 +455,7 @@ class OopsWindow(Gtk.ApplicationWindow):
 
             for i in xrange(0, len(values)-1):
                 self._builder.ls_problems.set_value(pit, i, values[i])
+                self._clear_invalid_problems_trash()
 
         if problem in self._get_selected(self._builder.tvs_problems):
             self._set_problem(problem)
@@ -461,7 +484,7 @@ class OopsWindow(Gtk.ApplicationWindow):
 
             if storage_problems:
                 for p in storage_problems:
-                    self._builder.ls_problems.append(p)
+                    self._append_problem_values_to_storage(p)
         finally:
             self._reloading = False
 
-- 
1.8.2.1



More information about the Crash-catcher mailing list