commit:     db0dddfda68fbeed2dc6c48d9f8168fc2b42b8da
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sun Nov  6 20:16:52 2016 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Nov  7 21:13:02 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=db0dddfd

parse_metadata_use: apply English language preference (bug 599060)

Descriptions may exist for multiple languages, so prefer English
language descriptions for use.local.desc content.

X-Gentoo-Bug: 599060
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=599060
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org>

 pym/portage/xml/metadata.py | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/pym/portage/xml/metadata.py b/pym/portage/xml/metadata.py
index 4940bfb..39aa738 100644
--- a/pym/portage/xml/metadata.py
+++ b/pym/portage/xml/metadata.py
@@ -61,7 +61,7 @@ except (ImportError, SystemError, RuntimeError, Exception):
 import re
 import xml.etree.ElementTree
 from portage import _encodings, _unicode_encode
-from portage.util import unique_everseen
+from portage.util import cmp_sort_key, unique_everseen
 
 if sys.hexversion >= 0x3000000:
        # pylint: disable=W0622
@@ -430,6 +430,19 @@ class MetaDataXML(object):
                maint_str = " ".join(maintainers)
                return maint_str
 
+# lang with higher value is preferred
+_lang_pref = {
+       ""  :  0,
+       "en":  1,
+}
+
+
+def _cmp_lang(a, b):
+       a_score = _lang_pref.get(a.get("lang", ""), -1)
+       b_score = _lang_pref.get(b.get("lang", ""), -1)
+
+       return a_score - b_score
+
 
 def parse_metadata_use(xml_tree):
        """
@@ -443,6 +456,9 @@ def parse_metadata_use(xml_tree):
        if not usetags:
                return uselist
 
+       # Sort by language preference in descending order.
+       usetags.sort(key=cmp_sort_key(_cmp_lang), reverse=True)
+
        # It's possible to have multiple 'use' elements.
        for usetag in usetags:
                flags = usetag.findall("flag")
@@ -455,6 +471,16 @@ def parse_metadata_use(xml_tree):
                        if pkg_flag is not None:
                                flag_restrict = flag.get("restrict")
 
+                               # Descriptions may exist for multiple 
languages, so
+                               # ignore all except the first description found 
for a
+                               # particular value of restrict (see bug 599060).
+                               try:
+                                       uselist[pkg_flag][flag_restrict]
+                               except KeyError:
+                                       pass
+                               else:
+                                       continue
+
                                # emulate the Element.itertext() method from 
python-2.7
                                inner_text = []
                                stack = []

Reply via email to