[kupfer] data: Refactor source reloading with check
- From: Ulrik Sverdrup <usverdrup src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [kupfer] data: Refactor source reloading with check
- Date: Wed, 28 Oct 2009 18:04:36 +0000 (UTC)
commit 367e63b8028ce6ba3c6e98fd407dcaae5d938cfc
Author: Ulrik Sverdrup <ulrik sverdrup gmail com>
Date: Wed Oct 28 16:56:48 2009 +0100
data: Refactor source reloading with check
When ensuring sources are loaded, and when rescanning non-cached
sources, be on guard for exceptions, and throw out any sources that
raise on reload (so that the rest of Kupfer can work without
problems).
kupfer/data.py | 34 ++++++++++++++++++++++++----------
1 files changed, 24 insertions(+), 10 deletions(-)
---
diff --git a/kupfer/data.py b/kupfer/data.py
index d30cc91..f0961df 100644
--- a/kupfer/data.py
+++ b/kupfer/data.py
@@ -423,14 +423,7 @@ class SourceController (pretty.OutputMixin):
sources.remove(source)
sources.add(news)
elif rescan:
- # to "rescue the toplevel", we throw out sources that
- # raise exceptions on rescan
- try:
- self.rescanner.register_rescan(source, sync=True)
- except StandardError, exp:
- self.output_error("Loading %s: raised %s %s" % (
- source, type(exp).__name__, exp))
- sources.remove(source)
+ self._checked_rescan_source(source, force=True)
def _pickle_sources(self, sources):
if not self.pickle:
@@ -442,11 +435,32 @@ class SourceController (pretty.OutputMixin):
continue
sourcepickler.pickle_source(source)
+ def _checked_rescan_source(self, source, force=True):
+ """
+ Rescan @source and check for exceptions, if it
+ raises, we remove it from our source catalog
+ """
+ # to "rescue the toplevel", we throw out sources that
+ # raise exceptions on rescan
+ try:
+ if force:
+ self.rescanner.register_rescan(source, sync=True)
+ else:
+ source.get_leaves()
+ except Exception:
+ import traceback
+ self.output_error("Loading %s raised an exception:" % source)
+ traceback.print_exc()
+ self.output_error("This error is probably a bug in %s" % source)
+ self.output_error("Please file a bug report")
+ self.sources.discard(source)
+ self.toplevel_sources.discard(source)
+
def cache_toplevel_sources(self):
"""Ensure that all toplevel sources are cached"""
- for src in self.toplevel_sources:
+ for src in set(self.toplevel_sources):
if not src.is_dynamic():
- src.get_leaves()
+ self._checked_rescan_source(src, force=False)
_source_controller = None
def GetSourceController():
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]