commit: e7d95cbf1e0f8a209ac1417ae2ae89ef331becfc Author: Arfrever Frehtes Taifersar Arahesis <Arfrever <AT> Apache <DOT> Org> AuthorDate: Wed Dec 9 08:34:26 2015 +0000 Commit: Arfrever Frehtes Taifersar Arahesis <arfrever <AT> apache <DOT> org> CommitDate: Wed Dec 9 08:34:26 2015 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=e7d95cbf
portage.repository.config.RepoConfig: Support location with trailing whitespace by using quoting. configparser.ConfigParser strips initial and trailing whitespace. bin/ebuild | 2 +- bin/isolated-functions.sh | 20 +++++++++++++------- man/portage.5 | 1 + pym/portage/repository/config.py | 14 +++++++++----- pym/portage/tests/dbapi/test_fakedbapi.py | 2 +- pym/portage/tests/resolver/ResolverPlayground.py | 2 +- pym/portage/tests/sync/test_sync_local.py | 2 +- pym/repoman/repos.py | 2 +- 8 files changed, 28 insertions(+), 17 deletions(-) diff --git a/bin/ebuild b/bin/ebuild index 1afad25..a696adf 100755 --- a/bin/ebuild +++ b/bin/ebuild @@ -158,7 +158,7 @@ if repo_location != vdb_path: print("Appending repository '%s' located in '%s' to configuration of repositories" % (repo_name, repo_location)) tmp_conf_file = io.StringIO(textwrap.dedent(""" [%s] - location = %s + location = "%s" """ % (repo_name, repo_location))) repositories = portage.repository.config.load_repository_config(portage.settings, extra_files=[tmp_conf_file]) os.environ["PORTAGE_REPOSITORIES"] = repositories.config_string() diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh index 5766921..a55d4a3 100644 --- a/bin/isolated-functions.sh +++ b/bin/isolated-functions.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 1999-2014 Gentoo Foundation +# Copyright 1999-2015 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 source "${PORTAGE_BIN_PATH}/eapi.sh" || exit 1 @@ -473,17 +473,23 @@ has() { } __repo_attr() { - local appropriate_section=0 exit_status=1 line saved_extglob_shopt=$(shopt -p extglob) + local appropriate_section=0 attribute=$2 exit_status=1 line repo_name=$1 saved_extglob_shopt=$(shopt -p extglob) value shopt -s extglob while read line; do - [[ ${appropriate_section} == 0 && ${line} == "[$1]" ]] && appropriate_section=1 && continue + [[ ${appropriate_section} == 0 && ${line} == "[${repo_name}]" ]] && appropriate_section=1 && continue [[ ${appropriate_section} == 1 && ${line} == "["*"]" ]] && appropriate_section=0 && continue - # If a conditional expression like [[ ${line} == $2*( )=* ]] is used - # then bash-3.2 produces an error like the following when the file is + # If a conditional expression like [[ ${line} == ${attribute}*( )=* ]] is used + # then bash <4.1 produces an error like the following when the file is # sourced: syntax error in conditional expression: unexpected token `(' # Therefore, use a regular expression for compatibility. - if [[ ${appropriate_section} == 1 && ${line} =~ ^${2}[[:space:]]*= ]]; then - echo "${line##$2*( )=*( )}" + if [[ ${appropriate_section} == 1 && ${line} =~ ^${attribute}[[:space:]]*= ]]; then + value="${line##${attribute}*( )=*( )}" + if [[ ${attribute} =~ ^(location)$ && (${value} == "'"*"'" || ${value} == '"'*'"') ]]; then + # bash >=4.2: + # value=${value:1:-1} + value=${value:1:$((${#value} - 2))} + fi + echo "${value}" exit_status=0 break fi diff --git a/man/portage.5 b/man/portage.5 index 6c41332..aa87e8f 100644 --- a/man/portage.5 +++ b/man/portage.5 @@ -956,6 +956,7 @@ Valid values: aliases, eclass\-overrides, masters .TP .B location Specifies location of given repository. +If location of repository ends with whitespace, then value of this attribute must be quoted. .TP .B masters Specifies master repositories of given repository. diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py index fff619f..54d7688 100644 --- a/pym/portage/repository/config.py +++ b/pym/portage/repository/config.py @@ -143,6 +143,8 @@ class RepoConfig(object): name, level=logging.ERROR, noiselevel=-1) self._invalid_config = True else: + if (location.startswith("'") and location.endswith("'")) or (location.startswith('"') and location.endswith('"')): + location = location[1:-1] if not os.path.isabs(location): writemsg_level("!!! %s\n" % _("Section %r in repos.conf has 'location' attribute set to " "relative path: %r") % (name, location), level=logging.ERROR, noiselevel=-1) @@ -420,7 +422,7 @@ class RepoConfig(object): if self.format: repo_msg.append(indent + "format: " + self.format) if self.location: - repo_msg.append(indent + "location: " + self.location) + repo_msg.append(indent + "location: \"" + self.location + "\"") if self.sync_type: repo_msg.append(indent + "sync-type: " + self.sync_type) if self.sync_umask: @@ -957,12 +959,12 @@ class RepoConfigLoader(object): return repo_name in self.prepos def config_string(self): - str_or_int_keys = ("auto_sync", "format", "location", - "main_repo", "priority", + quoted_str_keys = ("location",) + str_or_int_keys = ("auto_sync", "format", "main_repo", "priority", "sync_type", "sync_umask", "sync_uri", 'sync_user') str_tuple_keys = ("aliases", "eclass_overrides", "force") repo_config_tuple_keys = ("masters",) - keys = str_or_int_keys + str_tuple_keys + repo_config_tuple_keys + keys = quoted_str_keys + str_or_int_keys + str_tuple_keys + repo_config_tuple_keys config_string = "" for repo_name, repo in sorted(self.prepos.items(), key=lambda x: (x[0] != "DEFAULT", x[0])): config_string += "\n[%s]\n" % repo_name @@ -970,7 +972,9 @@ class RepoConfigLoader(object): if key == "main_repo" and repo_name != "DEFAULT": continue if getattr(repo, key) is not None: - if key in str_or_int_keys: + if key in quoted_str_keys: + config_string += "%s = \"%s\"\n" % (key.replace("_", "-"), getattr(repo, key)) + elif key in str_or_int_keys: config_string += "%s = %s\n" % (key.replace("_", "-"), getattr(repo, key)) elif key in str_tuple_keys: config_string += "%s = %s\n" % (key.replace("_", "-"), " ".join(getattr(repo, key))) diff --git a/pym/portage/tests/dbapi/test_fakedbapi.py b/pym/portage/tests/dbapi/test_fakedbapi.py index e4f5dd7..1a1e4b3 100644 --- a/pym/portage/tests/dbapi/test_fakedbapi.py +++ b/pym/portage/tests/dbapi/test_fakedbapi.py @@ -48,7 +48,7 @@ class TestFakedbapi(TestCase): with open(os.path.join(test_repo, "profiles", "repo_name"), "w") as f: f.write("test_repo") env = { - "PORTAGE_REPOSITORIES": "[DEFAULT]\nmain-repo = test_repo\n[test_repo]\nlocation = %s" % test_repo + "PORTAGE_REPOSITORIES": "[DEFAULT]\nmain-repo = test_repo\n[test_repo]\nlocation = '%s'" % test_repo } # Tests may override portage.const.EPREFIX in order to diff --git a/pym/portage/tests/resolver/ResolverPlayground.py b/pym/portage/tests/resolver/ResolverPlayground.py index 6bdf2c7..6622685 100644 --- a/pym/portage/tests/resolver/ResolverPlayground.py +++ b/pym/portage/tests/resolver/ResolverPlayground.py @@ -502,7 +502,7 @@ class ResolverPlayground(object): create_trees_kwargs["target_root"] = self.target_root env = { - "PORTAGE_REPOSITORIES": "\n".join("[%s]\n%s" % (repo_name, "\n".join("%s = %s" % (k, v) for k, v in repo_config.items())) for repo_name, repo_config in self._repositories.items()) + "PORTAGE_REPOSITORIES": "\n".join("[%s]\n%s" % (repo_name, "\n".join("%s = %s" % ((k, "'%s'" % v) if k == "location" else (k, v)) for k, v in repo_config.items())) for repo_name, repo_config in self._repositories.items()) } trees = portage.create_trees(env=env, eprefix=self.eprefix, diff --git a/pym/portage/tests/sync/test_sync_local.py b/pym/portage/tests/sync/test_sync_local.py index b57bdba..6911898 100644 --- a/pym/portage/tests/sync/test_sync_local.py +++ b/pym/portage/tests/sync/test_sync_local.py @@ -39,7 +39,7 @@ class SyncLocalTestCase(TestCase): [DEFAULT] %(default_keys)s [test_repo] - location = %(EPREFIX)s/var/repositories/test_repo + location = "%(EPREFIX)s/var/repositories/test_repo" sync-type = %(sync-type)s sync-uri = file:/%(EPREFIX)s/var/repositories/test_repo_sync auto-sync = yes diff --git a/pym/repoman/repos.py b/pym/repoman/repos.py index e7b8463..dd50663 100644 --- a/pym/repoman/repos.py +++ b/pym/repoman/repos.py @@ -133,7 +133,7 @@ class RepoSettings(object): self.repo_name = self.repo_conf._read_repo_name(portdir_overlay, quiet=True) tmp_conf_file = io.StringIO(textwrap.dedent(""" [%s] - location = %s + location = "%s" """) % (self.repo_name, portdir_overlay)) # Ensure that the repository corresponding to $PWD overrides a # repository of the same name referenced by the existing PORTDIR