Signed-off-by: Jesus Rivero <neurog...@gentoo.org>
---
 pym/portage/tests/util/make.conf.example.source_test |  6 ++++++
 .../tests/util/make.conf.example.source_test_after   |  7 +++++++
 pym/portage/tests/util/test_getconfig.py             | 20 ++++++++++++++++++++
 pym/portage/util/__init__.py                         |  7 ++++++-
 4 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 pym/portage/tests/util/make.conf.example.source_test
 create mode 100644 pym/portage/tests/util/make.conf.example.source_test_after

diff --git a/pym/portage/tests/util/make.conf.example.source_test 
b/pym/portage/tests/util/make.conf.example.source_test
new file mode 100644
index 0000000..c0b1c16
--- /dev/null
+++ b/pym/portage/tests/util/make.conf.example.source_test
@@ -0,0 +1,6 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# Contains local system settings for Portage system
+
+# Test make.conf for variable expansion in source tokens.
+source "$PORTAGE_BASE_PATH/make.conf.example.source_test_after"
diff --git a/pym/portage/tests/util/make.conf.example.source_test_after 
b/pym/portage/tests/util/make.conf.example.source_test_after
new file mode 100644
index 0000000..e41913e
--- /dev/null
+++ b/pym/portage/tests/util/make.conf.example.source_test_after
@@ -0,0 +1,7 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# Contains local system settings for Portage system
+
+# Test make.conf for variable expansion in source tokens.
+# We should see this variable in getconfig result
+PASSES_SOURCING_TEST="True"
diff --git a/pym/portage/tests/util/test_getconfig.py 
b/pym/portage/tests/util/test_getconfig.py
index c7ab360..bffbc4f 100644
--- a/pym/portage/tests/util/test_getconfig.py
+++ b/pym/portage/tests/util/test_getconfig.py
@@ -8,6 +8,7 @@ from portage import _unicode_encode
 from portage.const import PORTAGE_BASE_PATH
 from portage.tests import TestCase
 from portage.util import getconfig
+from portage.exception import ParseError
 
 class GetConfigTestCase(TestCase):
        """
@@ -31,6 +32,25 @@ class GetConfigTestCase(TestCase):
                for k, v in self._cases.items():
                        self.assertEqual(d[k], v)
 
+       def testGetConfigSourceLex(self):
+
+               base = os.path.dirname(__file__)
+               make_conf_file = os.path.join(base,
+                       'make.conf.example.source_test')
+
+               d = getconfig(make_conf_file,
+                       allow_sourcing=True, expand={"PORTAGE_BASE_PATH" : 
base})
+
+               # PASSES_SOURCING_TEST should exist in getconfig result
+               self.assertIsNotNone(d)
+               self.assertEqual("True", d['PASSES_SOURCING_TEST'])
+
+               # With allow_sourcing : True and empty expand map, this should
+               # Throw a FileNotFound exception
+               self.assertRaisesMsg("An empty expand map should throw an 
exception",
+                       ParseError, getconfig, *(make_conf_file,),
+                       **{'allow_sourcing' : True, 'expand' : {}})
+
        def testGetConfigProfileEnv(self):
                # Test the mode which is used to parse /etc/env.d and 
/etc/profile.env.
 
diff --git a/pym/portage/util/__init__.py b/pym/portage/util/__init__.py
index 24553da..0799487 100644
--- a/pym/portage/util/__init__.py
+++ b/pym/portage/util/__init__.py
@@ -593,8 +593,13 @@ class _getconfig_shlex(shlex.shlex):
                shlex.shlex.__init__(self, **kwargs)
                self.__portage_tolerant = portage_tolerant
 
+       def allow_sourcing(self, var_expand_map):
+               self.source = portage._native_string("source")
+               self.var_expand_map = var_expand_map
+
        def sourcehook(self, newfile):
                try:
+                       newfile = varexpand(newfile, self.var_expand_map)
                        return shlex.shlex.sourcehook(self, newfile)
                except EnvironmentError as e:
                        if e.errno == PermissionDenied.errno:
@@ -694,7 +699,7 @@ def getconfig(mycfg, tolerant=False, allow_sourcing=False, 
expand=True,
                        string.ascii_letters + "~!@#$%*_\:;?,./-+{}")
                lex.quotes = portage._native_string("\"'")
                if allow_sourcing:
-                       lex.source = portage._native_string("source")
+                       lex.allow_sourcing(expand_map)
 
                while True:
                        key = _unicode_decode(lex.get_token())
-- 
1.8.3.2


Reply via email to