[GNOME-ABRT PATCH 1/2] Do not remove invalid problems while sorting the list
Jakub Filak
jfilak at redhat.com
Tue Jul 9 11:15:26 UTC 2013
Please, ignore this patch set. I forgot to run make rpm :)
On Tue, 2013-07-09 at 12:49 +0200, Jakub Filak wrote:
> 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
>
More information about the Crash-catcher
mailing list