--- a/mercurial/httpconnection.py Thu Sep 22 01:51:36 2011 +0200
+++ b/mercurial/httpconnection.py Tue Sep 27 18:50:18 2011 -0500
@@ -22,8 +22,9 @@
class httpsendfile(object):
"""This is a wrapper around the objects returned by python's "open".
- Its purpose is to send file-like objects via HTTP and, to do so, it
- defines a __len__ attribute to feed the Content-Length header.
+ Its purpose is to send file-like objects via HTTP.
+ It do however not define a __len__ attribute because the length
+ might be more than Py_ssize_t can handle.
"""
def __init__(self, ui, *args, **kwargs):
@@ -35,9 +36,9 @@
self.seek = self._data.seek
self.close = self._data.close
self.write = self._data.write
- self._len = os.fstat(self._data.fileno()).st_size
+ self.length = os.fstat(self._data.fileno()).st_size
self._pos = 0
- self._total = self._len / 1024 * 2
+ self._total = self.length / 1024 * 2
def read(self, *args, **kwargs):
try:
@@ -54,9 +55,6 @@
unit=_('kb'), total=self._total)
return ret
- def __len__(self):
- return self._len
-
# moved here from url.py to avoid a cycle
def readauthforuri(ui, uri, user):
# Read configuration
--- a/mercurial/httprepo.py Thu Sep 22 01:51:36 2011 +0200
+++ b/mercurial/httprepo.py Tue Sep 27 18:50:18 2011 -0500
@@ -73,9 +73,14 @@
if cmd == 'pushkey':
args['data'] = ''
data = args.pop('data', None)
+ size = 0
+ if util.safehasattr(data, 'length'):
+ size = data.length
+ elif data is not None:
+ size = len(data)
headers = args.pop('headers', {})
- if data and self.ui.configbool('ui', 'usehttp2', False):
+ if size and self.ui.configbool('ui', 'usehttp2', False):
headers['Expect'] = '100-Continue'
headers['X-HgHttp2'] = '1'
@@ -104,9 +109,6 @@
cu = "%s%s" % (self._url, qs)
req = urllib2.Request(cu, data, headers)
if data is not None:
- # len(data) is broken if data doesn't fit into Py_ssize_t
- # add the header ourself to avoid OverflowError
- size = data.__len__()
self.ui.debug("sending %s bytes\n" % size)
req.add_unredirected_header('Content-Length', '%d' % size)
try:
--- a/mercurial/patch.py Thu Sep 22 01:51:36 2011 +0200
+++ b/mercurial/patch.py Tue Sep 27 18:50:18 2011 -0500
@@ -188,7 +188,7 @@
pend = subject.find(']')
if pend >= 0:
subject = subject[pend + 1:].lstrip()
- subject = subject.replace('\n\t', ' ')
+ subject = re.sub(r'\n[ \t]+', ' ', subject)
ui.debug('Subject: %s\n' % subject)
if user:
ui.debug('From: %s\n' % user)
--- a/mercurial/util.py Thu Sep 22 01:51:36 2011 +0200
+++ b/mercurial/util.py Tue Sep 27 18:50:18 2011 -0500
@@ -913,7 +913,12 @@
minutes = abs(tz) // 60
format = format.replace("%1", "%c%02d" % (sign, minutes // 60))
format = format.replace("%2", "%02d" % (minutes % 60))
- s = time.strftime(format, time.gmtime(float(t) - tz))
+ try:
+ t = time.gmtime(float(t) - tz)
+ except ValueError:
+ # time was out of range
+ t = time.gmtime(sys.maxint)
+ s = time.strftime(format, t)
return s
def shortdate(date=None):