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 = []