mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
91 lines
2.8 KiB
Python
91 lines
2.8 KiB
Python
# misc.py -- For dealing with python2.4 oddness
|
|
# Copyright (C) 2008 Canonical Ltd.
|
|
#
|
|
# 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 2
|
|
# of the License or (at your option) a later version.
|
|
#
|
|
# 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, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
# MA 02110-1301, USA.
|
|
"""Misc utilities to work with python2.4.
|
|
|
|
These utilities can all be deleted when dulwich decides it wants to stop
|
|
support for python 2.4.
|
|
"""
|
|
try:
|
|
import hashlib
|
|
except ImportError:
|
|
import sha
|
|
import struct
|
|
|
|
|
|
class defaultdict(dict):
|
|
"""A python 2.4 equivalent of collections.defaultdict."""
|
|
|
|
def __init__(self, default_factory=None, *a, **kw):
|
|
if (default_factory is not None and
|
|
not hasattr(default_factory, '__call__')):
|
|
raise TypeError('first argument must be callable')
|
|
dict.__init__(self, *a, **kw)
|
|
self.default_factory = default_factory
|
|
|
|
def __getitem__(self, key):
|
|
try:
|
|
return dict.__getitem__(self, key)
|
|
except KeyError:
|
|
return self.__missing__(key)
|
|
|
|
def __missing__(self, key):
|
|
if self.default_factory is None:
|
|
raise KeyError(key)
|
|
self[key] = value = self.default_factory()
|
|
return value
|
|
|
|
def __reduce__(self):
|
|
if self.default_factory is None:
|
|
args = tuple()
|
|
else:
|
|
args = self.default_factory,
|
|
return type(self), args, None, None, self.items()
|
|
|
|
def copy(self):
|
|
return self.__copy__()
|
|
|
|
def __copy__(self):
|
|
return type(self)(self.default_factory, self)
|
|
|
|
def __deepcopy__(self, memo):
|
|
import copy
|
|
return type(self)(self.default_factory,
|
|
copy.deepcopy(self.items()))
|
|
def __repr__(self):
|
|
return 'defaultdict(%s, %s)' % (self.default_factory,
|
|
dict.__repr__(self))
|
|
|
|
|
|
def make_sha(source=''):
|
|
"""A python2.4 workaround for the sha/hashlib module fiasco."""
|
|
try:
|
|
return hashlib.sha1(source)
|
|
except NameError:
|
|
sha1 = sha.sha(source)
|
|
return sha1
|
|
|
|
|
|
def unpack_from(fmt, buf, offset=0):
|
|
"""A python2.4 workaround for struct missing unpack_from."""
|
|
try:
|
|
return struct.unpack_from(fmt, buf, offset)
|
|
except AttributeError:
|
|
b = buf[offset:offset+struct.calcsize(fmt)]
|
|
return struct.unpack(fmt, b)
|
|
|