comparison mercurial/statichttprepo.py @ 28883:032c4c2f802a

pycompat: switch to util.urlreq/util.urlerr for py3 compat
author timeless <timeless@mozdev.org>
date Wed, 06 Apr 2016 23:22:12 +0000
parents 2380889f8f52
children c1696430254f
comparison
equal deleted inserted replaced
28882:800ec7c048b0 28883:032c4c2f802a
9 9
10 from __future__ import absolute_import 10 from __future__ import absolute_import
11 11
12 import errno 12 import errno
13 import os 13 import os
14 import urllib
15 import urllib2
16 14
17 from .i18n import _ 15 from .i18n import _
18 from . import ( 16 from . import (
19 byterange, 17 byterange,
20 changelog, 18 changelog,
25 scmutil, 23 scmutil,
26 store, 24 store,
27 url, 25 url,
28 util, 26 util,
29 ) 27 )
28
29 urlerr = util.urlerr
30 urlreq = util.urlreq
30 31
31 class httprangereader(object): 32 class httprangereader(object):
32 def __init__(self, url, opener): 33 def __init__(self, url, opener):
33 # we assume opener has HTTPRangeHandler 34 # we assume opener has HTTPRangeHandler
34 self.url = url 35 self.url = url
43 self.close() 44 self.close()
44 45
45 def seek(self, pos): 46 def seek(self, pos):
46 self.pos = pos 47 self.pos = pos
47 def read(self, bytes=None): 48 def read(self, bytes=None):
48 req = urllib2.Request(self.url) 49 req = urlreq.request(self.url)
49 end = '' 50 end = ''
50 if bytes: 51 if bytes:
51 end = self.pos + bytes - 1 52 end = self.pos + bytes - 1
52 if self.pos or end: 53 if self.pos or end:
53 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end)) 54 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
54 55
55 try: 56 try:
56 f = self.opener.open(req) 57 f = self.opener.open(req)
57 data = f.read() 58 data = f.read()
58 code = f.code 59 code = f.code
59 except urllib2.HTTPError as inst: 60 except urlerr.httperror as inst:
60 num = inst.code == 404 and errno.ENOENT or None 61 num = inst.code == 404 and errno.ENOENT or None
61 raise IOError(num, inst) 62 raise IOError(num, inst)
62 except urllib2.URLError as inst: 63 except urlerr.urlerror as inst:
63 raise IOError(None, inst.reason[1]) 64 raise IOError(None, inst.reason[1])
64 65
65 if code == 200: 66 if code == 200:
66 # HTTPRangeHandler does nothing if remote does not support 67 # HTTPRangeHandler does nothing if remote does not support
67 # Range headers and returns the full entity. Let's slice it. 68 # Range headers and returns the full entity. Let's slice it.
90 self.base = base 91 self.base = base
91 92
92 def __call__(self, path, mode='r', *args, **kw): 93 def __call__(self, path, mode='r', *args, **kw):
93 if mode not in ('r', 'rb'): 94 if mode not in ('r', 'rb'):
94 raise IOError('Permission denied') 95 raise IOError('Permission denied')
95 f = "/".join((self.base, urllib.quote(path))) 96 f = "/".join((self.base, urlreq.quote(path)))
96 return httprangereader(f, urlopener) 97 return httprangereader(f, urlopener)
97 98
98 def join(self, path): 99 def join(self, path):
99 if path: 100 if path:
100 return os.path.join(self.base, path) 101 return os.path.join(self.base, path)