[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