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