On 12/27/2016 03:39 PM, Brian Dolbec wrote:
> On Tue, 27 Dec 2016 13:33:55 -0800
> Zac Medico <zmed...@gentoo.org> wrote:
> 
>> Fix the binarytree._read_metadata method to return empty strings for
>> undefined metadata values, in order to fulfill a contract with the
>> _pkg_str class. This prevents an AttributeError triggered by old
>> binary packages which have undefined repository metadata, as reported
>> in bug 603826.
>>
>> X-Gentoo-bug: 603826
>> X-Gentoo-bug-url: https://bugs.gentoo.org/603826
>> ---
>>  pym/portage/dbapi/bintree.py | 31 +++++++++++++++++++++++++------
>>  pym/portage/versions.py      |  8 +++++++-
>>  2 files changed, 32 insertions(+), 7 deletions(-)
>>
>> diff --git a/pym/portage/dbapi/bintree.py
>> b/pym/portage/dbapi/bintree.py index f483059..3341889 100644
>> --- a/pym/portage/dbapi/bintree.py
>> +++ b/pym/portage/dbapi/bintree.py
>> @@ -1,4 +1,4 @@
>> -# Copyright 1998-2014 Gentoo Foundation
>> +# Copyright 1998-2016 Gentoo Foundation
>>  # Distributed under the terms of the GNU General Public License v2
>>  
>>  from __future__ import unicode_literals
>> @@ -1041,12 +1041,12 @@ class binarytree(object):
>>                              noiselevel=-1)
>>                      return
>>              metadata = self._read_metadata(full_path, s)
>> -            slot = metadata.get("SLOT")
>> +            invalid_depend = False
>>              try:
>>                      self._eval_use_flags(cpv, metadata)
>>              except portage.exception.InvalidDependString:
>> -                    slot = None
>> -            if slot is None:
>> +                    invalid_depend = True
>> +            if invalid_depend or not metadata.get("SLOT"):
>>                      writemsg(_("!!! Invalid binary package:
>> '%s'\n") % full_path, noiselevel=-1)
>>                      return
>> @@ -1126,6 +1126,21 @@ class binarytree(object):
>>              return cpv
>>  
>>      def _read_metadata(self, filename, st, keys=None):
>> +            """
>> +            Read metadata from a binary package. The returned
>> metadata
>> +            dictionary will contain empty strings for any values
>> that
>> +            are undefined (this is important because the
>> _pkg_str class
>> +            distinguishes between missing and undefined values).
>> +
>> +            @param filename: File path of the binary package
>> +            @type filename: string
>> +            @param st: stat result for the binary package
>> +            @type st: os.stat_result
>> +            @param keys: optional list of specific metadata keys
>> to retrieve
>> +            @type keys: iterable
>> +            @rtype: dict
>> +            @return: package metadata
>> +            """
>>              if keys is None:
>>                      keys = self.dbapi._aux_cache_keys
>>                      metadata = self.dbapi._aux_cache_slot_dict()
>> @@ -1139,10 +1154,14 @@ class binarytree(object):
>>                              metadata[k] = _unicode(st.st_size)
>>                      else:
>>                              v =
>> binary_metadata.get(_unicode_encode(k))
>> -                            if v is not None:
>> +                            if v is None:
>> +                                    if k == "EAPI":
>> +                                            metadata[k] = "0"
>> +                                    else:
>> +                                            metadata[k] = ""
>> +                            else:
>>                                      v = _unicode_decode(v)
>>                                      metadata[k] = "
>> ".join(v.split())
>> -            metadata.setdefault("EAPI", "0")
>>              return metadata
>>  
>>      def _inject_file(self, pkgindex, cpv, filename):
>> diff --git a/pym/portage/versions.py b/pym/portage/versions.py
>> index a028d93..adfb1c3 100644
>> --- a/pym/portage/versions.py
>> +++ b/pym/portage/versions.py
>> @@ -1,5 +1,5 @@
>>  # versions.py -- core Portage functionality
>> -# Copyright 1998-2014 Gentoo Foundation
>> +# Copyright 1998-2016 Gentoo Foundation
>>  # Distributed under the terms of the GNU General Public License v2
>>  
>>  from __future__ import unicode_literals
>> @@ -359,6 +359,12 @@ class _pkg_str(_unicode):
>>      Instances are typically created in dbapi.cp_list() or the
>> Atom contructor, and propagate from there. Generally, code that
>> pickles these objects will manually convert them to a plain unicode
>> object first. +
>> +    Instances of this class will have missing attributes for
>> metadata that
>> +    has not been passed into the constructor. The missing
>> attributes are
>> +    used to distinguish missing metadata values from undefined
>> metadata values.
>> +    For example, the repo attribute will be missing if the
>> 'repository' key
>> +    is missing from the metadata dictionary.
>>      """
>>  
>>      def __new__(cls, cpv, metadata=None, settings=None,
>> eapi=None,
> 
> LGTM
> 

Thanks, pushed:

https://gitweb.gentoo.org/proj/portage.git/commit/?id=67109fe41df07c9fa0e588b81f37ff61a71470f6

-- 
Thanks,
Zac

Reply via email to