summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
Diffstat (limited to 'pym')
-rw-r--r--pym/portage/__init__.py11
-rw-r--r--pym/portage/util.py20
2 files changed, 28 insertions, 3 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index e8a8f4f25..dfbe70fc2 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -969,7 +969,11 @@ class config(object):
@type local_config: Boolean
"""
- debug = os.environ.get("PORTAGE_DEBUG") == "1"
+ # When initializing the global portage.settings instance, avoid
+ # raising exceptions whenever possible since exceptions thrown
+ # from 'import portage' or 'import portage.exceptions' statements
+ # can practically render the api unusable for api consumers.
+ tolerant = "_initializing_globals" in globals()
self.already_in_regenerate = 0
@@ -1244,7 +1248,7 @@ class config(object):
self.mygcfg = getconfig(
os.path.join(config_root, MAKE_CONF_FILE.lstrip(os.path.sep)),
- allow_sourcing=True)
+ tolerant=tolerant, allow_sourcing=True)
if self.mygcfg is None:
self.mygcfg = {}
@@ -6284,7 +6288,10 @@ def init_legacy_globals():
for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"), ("target_root", "ROOT")):
kwargs[k] = os.environ.get(envvar, "/")
+ global _initializing_globals
+ _initializing_globals = True
db = create_trees(**kwargs)
+ del _initializing_globals
settings = db["/"]["vartree"].settings
portdb = db["/"]["porttree"].dbapi
diff --git a/pym/portage/util.py b/pym/portage/util.py
index 97c785c06..155a787f5 100644
--- a/pym/portage/util.py
+++ b/pym/portage/util.py
@@ -21,6 +21,11 @@ try:
except ImportError:
import pickle as cPickle
+try:
+ import cStringIO as StringIO
+except ImportError:
+ import StringIO
+
noiselimit = 0
def initialize_logger(level=logging.WARN):
@@ -305,6 +310,15 @@ def writedict(mydict,myfilename,writekey=True):
return 0
return 1
+class _tolerant_shlex(shlex.shlex):
+ def sourcehook(self, newfile):
+ try:
+ return shlex.shlex.sourcehook(self, newfile)
+ except EnvironmentError, e:
+ writemsg("!!! Parse error in '%s': source command failed: %s\n" % \
+ (self.infile, str(e)), noiselevel=-1)
+ return (newfile, StringIO.StringIO())
+
def getconfig(mycfg, tolerant=0, allow_sourcing=False, expand=True):
mykeys={}
try:
@@ -316,10 +330,14 @@ def getconfig(mycfg, tolerant=0, allow_sourcing=False, expand=True):
raise
return None
try:
+ if tolerant:
+ shlex_class = _tolerant_shlex
+ else:
+ shlex_class = shlex.shlex
# The default shlex.sourcehook() implementation
# only joins relative paths when the infile
# attribute is properly set.
- lex = shlex.shlex(f, infile=mycfg, posix=True)
+ lex = shlex_class(f, infile=mycfg, posix=True)
lex.wordchars=string.digits+string.letters+"~!@#$%*_\:;?,./-+{}"
lex.quotes="\"'"
if allow_sourcing: