[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