summaryrefslogtreecommitdiffstats
path: root/layman/dbbase.py
diff options
context:
space:
mode:
authorSebastian Pipping <sebastian@pipping.org>2010-02-18 06:27:01 +0100
committerSebastian Pipping <sebastian@pipping.org>2010-02-18 06:27:01 +0100
commit15607e2a960e046a9d1cf23bbc04f30c505c5600 (patch)
tree4f762884d6f33871bf9be61483812c6391842dbb /layman/dbbase.py
parentb3c281c1c5060f4d28e83680dbbc3f2819f0bd42 (diff)
downloadlayman-15607e2a960e046a9d1cf23bbc04f30c505c5600.tar.gz
layman-15607e2a960e046a9d1cf23bbc04f30c505c5600.tar.bz2
layman-15607e2a960e046a9d1cf23bbc04f30c505c5600.zip
Hint about broken overlay catalog
Diffstat (limited to 'layman/dbbase.py')
-rw-r--r--layman/dbbase.py42
1 files changed, 37 insertions, 5 deletions
diff --git a/layman/dbbase.py b/layman/dbbase.py
index d8aa401..88916ae 100644
--- a/layman/dbbase.py
+++ b/layman/dbbase.py
@@ -29,6 +29,7 @@ __version__ = "$Id: overlay.py 273 2006-12-30 15:54:50Z wrobel $"
#-------------------------------------------------------------------------------
import sys, os, os.path
+import xml
import xml.etree.ElementTree as ET # Python 2.5
from layman.debug import OUT
@@ -46,6 +47,23 @@ class UnknownOverlayException(Exception):
message = 'Overlay "%s" does not exist.' % repo_name
super(UnknownOverlayException, self).__init__(message)
+#===============================================================================
+#
+# Class BrokenOverlayCatalog
+#
+#-------------------------------------------------------------------------------
+
+class BrokenOverlayCatalog(ValueError):
+ def __init__(self, origin, expat_error, hint=None):
+ if hint == None:
+ hint = ''
+ else:
+ hint = '\nHint: %s' % hint
+
+ super(BrokenOverlayCatalog, self).__init__(
+ 'XML parsing failed for "%(origin)s" (line %(line)d, column %(column)d)%(hint)s' % \
+ {'line':expat_error.lineno, 'column':expat_error.offset + 1, 'origin':origin, 'hint':hint})
+
#===============================================================================
#
@@ -56,7 +74,7 @@ class UnknownOverlayException(Exception):
class DbBase:
''' Handle a list of overlays.'''
- def __init__(self, paths, config, ignore = 0, quiet = False):
+ def __init__(self, paths, config, ignore = 0, quiet = False, ignore_init_read_errors=False):
self.config = config
self.quiet = quiet
@@ -68,8 +86,13 @@ class DbBase:
OUT.debug('Initializing overlay list handler', 8)
for path in self.paths:
- if os.path.exists(path):
+ if not os.path.exists(path):
+ continue
+
+ try:
self.read_file(path)
+ except Exception, error:
+ if not ignore_init_read_errors: raise error
def __eq__(self, other):
for key in set(self.overlays.keys() + other.overlays.keys()):
@@ -90,9 +113,14 @@ class DbBase:
raise IOError('Failed to read the overlay list at ("'
+ path + '")!\nError was:\n' + str(error))
- self.read(document)
+ self.read(document, origin=path)
- def read(self, text):
+ def _broken_catalog_hint(self):
+ this_function_name = sys._getframe().f_code.co_name
+ raise NotImplementedError('Method "%s.%s" not implemented' % \
+ (self.__class__.__name__, this_function_name))
+
+ def read(self, text, origin):
'''
Read an xml list of overlays (adding to and potentially overwriting existing entries)
@@ -105,7 +133,11 @@ class DbBase:
>>> list(a.overlays['wrobel-stable'].source_uris())
[u'rsync://gunnarwrobel.de/wrobel-stable']
'''
- document = ET.fromstring(text)
+ try:
+ document = ET.fromstring(text)
+ except xml.parsers.expat.ExpatError, error:
+ raise BrokenOverlayCatalog(origin, error, self._broken_catalog_hint())
+
overlays = document.findall('overlay') + \
document.findall('repo')