/usr/lib/python3/dist-packages/systemimage/image.py is in system-image-common 2.2-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # Copyright (C) 2013-2014 Canonical Ltd.
# Author: Barry Warsaw <barry@ubuntu.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Images are like Bags but are hashable and sortable."""
__all__ = [
'Image',
]
from systemimage.bag import Bag
COMMASPACE = ', '
class Image(Bag):
def __init__(self, **kws):
converters = {'phased-percentage': int}
super().__init__(converters=converters, **kws)
def __hash__(self):
# BAW 2013-04-30: We don't currently enforce immutability of attribute
# values. See Bag.__init__().
#
# Full images must be unique on the version, but delta images are
# unique on the version and base. We need to turn these two values
# into a hash of no more than 32 bits. This is because Python's
# built-in hash() method truncates __hash__()'s return value to
# Py_ssize_t which on the phone hardware (and i386 as in the buildds)
# is 32 bits.
#
# You can verifiy this with the following bit of Python:
#
# $ python3 -c "from ctypes import *; print(sizeof(c_ssize_t))"
#
# Use a base of 0 for full images.
base = self.base if self.type == 'delta' else 0
assert ((0 <= base < (1 << 16)) and (0 <= self.version < (1 << 16))), (
'16 bit unsigned version numbers only')
# LP: #1218612 introduces a new version number regime, starting
# sequentially at 1. We still have the 32 bit limit on hashes, but
# now we don't have to play games with the content, giving us 65k new
# versions before we have to worry about running out of bits. We
# still have to fit two version numbers (version and base for deltas)
# into those 32 bits, thus version numbers bigger than 16 bits are not
# supported. Still, even if we release 10 images every day, that
# gives us nearly 17 years of running room. I sure hope we'll have 64
# bit phones by then.
return (self.version << 16) + base
def __eq__(self, other):
return hash(self) == hash(other)
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return '<Image: {}>'.format(COMMASPACE.join(sorted(
key for key in self.__dict__ if not key.startswith('_'))))
@property
def phased_percentage(self):
return self.__untranslated__.get('phased-percentage', 100)
|