[PATCH 2/4] Switch internal metadata to key=value format

Michał Górny <[email protected]> Fri, 3 Sep 2021 18:35:30 +0200
Newsgroups gmane.linux.gentoo.portage.devel
Message-ID <[email protected]>
Signed-off-by: Michał Górny <[email protected]>
---
 bin/ebuild.sh                      | 13 +++++++------
 lib/_emerge/EbuildMetadataPhase.py | 15 +++++++++------
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/bin/ebuild.sh b/bin/ebuild.sh
index 32995d95b..381bcb5c8 100755
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@ -754,10 +754,11 @@ if [[ $EBUILD_PHASE = depend ]] ; then
 	export SANDBOX_ON="0"
 	set -f
 
-	auxdbkeys="DEPEND RDEPEND SLOT SRC_URI RESTRICT HOMEPAGE LICENSE
+	metadata_keys=(
+		DEPEND RDEPEND SLOT SRC_URI RESTRICT HOMEPAGE LICENSE
 		DESCRIPTION KEYWORDS INHERITED IUSE REQUIRED_USE PDEPEND BDEPEND
-		EAPI PROPERTIES DEFINED_PHASES IDEPEND UNUSED_04
-		UNUSED_03 UNUSED_02 UNUSED_01"
+		EAPI PROPERTIES DEFINED_PHASES IDEPEND
+	)
 
 	if ! ___eapi_has_BDEPEND; then
 		unset BDEPEND
@@ -767,10 +768,10 @@ if [[ $EBUILD_PHASE = depend ]] ; then
 	fi
 
 	# The extra $(echo) commands remove newlines.
-	for f in ${auxdbkeys} ; do
-		eval "echo \$(echo \${!f}) 1>&${PORTAGE_PIPE_FD}" || exit $?
+	for f in "${metadata_keys[@]}" ; do
+		echo "${f}=$(echo ${!f})" >&${PORTAGE_PIPE_FD} || exit $?
 	done
-	eval "exec ${PORTAGE_PIPE_FD}>&-"
+	exec {PORTAGE_PIPE_FD}>&-
 	set +f
 else
 	# Note: readonly variables interfere with __preprocess_ebuild_env(), so
diff --git a/lib/_emerge/EbuildMetadataPhase.py b/lib/_emerge/EbuildMetadataPhase.py
index d00f194c2..5fd0e8a4d 100644
--- a/lib/_emerge/EbuildMetadataPhase.py
+++ b/lib/_emerge/EbuildMetadataPhase.py
@@ -151,13 +151,16 @@ class EbuildMetadataPhase(SubProcess):
 			metadata_lines = _unicode_decode(b''.join(self._raw_metadata),
 				encoding=_encodings['repo.content'],
 				errors='replace').splitlines()
+			metadata = {}
 			metadata_valid = True
-			if len(portage.auxdbkeys) != len(metadata_lines):
-				# Don't trust bash's returncode if the
-				# number of lines is incorrect.
-				metadata_valid = False
-			else:
-				metadata = dict(zip(portage.auxdbkeys, metadata_lines))
+			for l in metadata_lines:
+				if '=' not in l:
+					metadata_valid = False
+					break
+				key, value = l.split('=', 1)
+				metadata[key] = value
+
+			if metadata_valid:
 				parsed_eapi = self._eapi
 				if parsed_eapi is None:
 					parsed_eapi = "0"
-- 
2.33.0