Handle missing $PORTDIR/metadata/herds.xml. Thanks to Arfrever for reporting.
authorZac Medico <zmedico@gentoo.org>
Fri, 2 Apr 2010 17:22:38 +0000 (10:22 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 2 Apr 2010 17:22:38 +0000 (10:22 -0700)
bin/repoman
pym/repoman/herdbase.py
pym/repoman/utilities.py

index ffc4c948bbea6c7f521258c8e8a7af99c0c911e6..a76bc8de50955be43f6d1a25c1758dc668bfc0e0 100755 (executable)
@@ -68,10 +68,9 @@ import portage.checksum
 import portage.const
 import portage.dep
 portage.dep._dep_check_strict = True
-import portage.exception
 from portage import cvstree, normalize_path
 from portage import util
-from portage.exception import ParseError
+from portage.exception import FileNotFound, ParseError, PermissionDenied
 from portage.manifest import Manifest
 from portage.process import find_binary, spawn
 from portage.output import bold, create_color_func, darkgreen, \
@@ -984,8 +983,12 @@ thirdpartymirrors = portage.flatten(list(repoman_settings.thirdpartymirrors().va
 
 try:
        herd_base = make_herd_base(os.path.join(repoman_settings["PORTDIR"], "metadata/herds.xml"))
-except (EnvironmentError, ParseError) as e:
+except (EnvironmentError, ParseError, PermissionDenied) as e:
        err(str(e))
+except FileNotFound:
+       # TODO: Download as we do for metadata.dtd, but add a way to
+       # disable for non-gentoo repoman users who may not have herds.
+       herd_base = None
 
 for x in scanlist:
        #ebuilds and digests added to cvs respectively.
index 924839a617c41c5d73664f108188ae0236517f8d..6f92abfb8575f0c215de271121c14f1472bb4156 100644 (file)
@@ -3,9 +3,10 @@
 # Copyright 2010 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
+import errno
 import xml.etree.ElementTree as ET
 from xml.parsers.expat import ExpatError
-from portage.exception import ParseError
+from portage.exception import FileNotFound, ParseError, PermissionDenied
 
 __all__ = [
        "make_herd_base"
@@ -44,7 +45,14 @@ def make_herd_base(filename):
                xml_tree = ET.parse(filename)
        except ExpatError as e:
                raise ParseError("metadata.xml: " + str(e))
-       
+       except EnvironmentError as e:
+               func_call = "open('%s')" % filename
+               if e.errno == errno.EACCES:
+                       raise PermissionDenied(func_call)
+               elif e.errno == errno.ENOENT:
+                       raise FileNotFound(filename)
+               raise
+
        herds = xml_tree.findall('herd')
        for h in herds:
                _herd_name = h.find('name')
index cd7f5ea8773e9fcd3447480ba18d926fa10ff9b5..719e910d7fa5bfc8faed4bf93f62dc2969644264 100644 (file)
@@ -176,7 +176,8 @@ def check_metadata(metadata_xml_content, herd_base):
        except (ExpatError, ) as e:
                raise exception.ParseError("metadata.xml: " + str(e))
 
-       check_metadata_herds(xml_tree, herd_base)
+       if herd_base is not None:
+               check_metadata_herds(xml_tree, herd_base)
 
 
 def FindPackagesToScan(settings, startdir, reposplit):