##// END OF EJS Templates
prevent transient leaks of file handle by using new helper functions...
prevent transient leaks of file handle by using new helper functions These leaks may occur in environments that don't employ a reference counting GC, i.e. PyPy. This implies: - changing opener(...).read() calls to opener.read(...) - changing opener(...).write() calls to opener.write(...) - changing open(...).read(...) to util.readfile(...) - changing open(...).write(...) to util.writefile(...)

File last commit:

r14168:135e2447 default
r14168:135e2447 default
Show More
statichttprepo.py
147 lines | 4.8 KiB | text/x-python | PythonLexer
mpm@selenic.com
Separate out old-http support...
r1101 # statichttprepo.py - simple http repository class for mercurial
#
# This provides read-only repo access to repositories exported via static http
#
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
mpm@selenic.com
Separate out old-http support...
r1101 #
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
mpm@selenic.com
Separate out old-http support...
r1101
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Matt Mackall
error: move repo errors...
r7637 import changelog, byterange, url, error
Dan Villiom Podlaski Christiansen
statichttprepo: make the opener a subclass of abstractopener
r14091 import localrepo, manifest, util, scmutil, store
Dirkjan Ochtman
make static-http work with empty repos (issue965)
r6028 import urllib, urllib2, errno
Bryan O'Sullivan
Move urllib error handling from revlog into statichttprepo, where it belongs.
r1325
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274 class httprangereader(object):
def __init__(self, url, opener):
# we assume opener has HTTPRangeHandler
self.url = url
self.pos = 0
self.opener = opener
Nicolas Dumazet
static-http: mimic more closely localrepo (issue2164: allow clone -r )...
r11066 self.name = url
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274 def seek(self, pos):
self.pos = pos
def read(self, bytes=None):
req = urllib2.Request(self.url)
end = ''
if bytes:
end = self.pos + bytes - 1
req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
Bryan O'Sullivan
Move urllib error handling from revlog into statichttprepo, where it belongs.
r1325 try:
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274 f = self.opener.open(req)
data = f.read()
Patrick Mezard
statichttprepo: handle remote not supporting Range headers...
r8612 if hasattr(f, 'getcode'):
# python 2.6+
code = f.getcode()
elif hasattr(f, 'code'):
# undocumented attribute, seems to be set in 2.4 and 2.5
code = f.code
else:
# Don't know how to check, hope for the best.
code = 206
Thomas Arendsen Hein
Catch urllib errors for old-http in a nicer way.
r1821 except urllib2.HTTPError, inst:
Dirkjan Ochtman
make static-http work with empty repos (issue965)
r6028 num = inst.code == 404 and errno.ENOENT or None
raise IOError(num, inst)
Bryan O'Sullivan
Move urllib error handling from revlog into statichttprepo, where it belongs.
r1325 except urllib2.URLError, inst:
Thomas Arendsen Hein
Catch urllib errors for old-http in a nicer way.
r1821 raise IOError(None, inst.reason[1])
mpm@selenic.com
Separate out old-http support...
r1101
Patrick Mezard
statichttprepo: handle remote not supporting Range headers...
r8612 if code == 200:
# HTTPRangeHandler does nothing if remote does not support
# Range headers and returns the full entity. Let's slice it.
if bytes:
data = data[self.pos:self.pos + bytes]
else:
data = data[self.pos:]
elif bytes:
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274 data = data[:bytes]
Patrick Mezard
statichttprepo: handle remote not supporting Range headers...
r8612 self.pos += len(data)
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274 return data
Nicolas Dumazet
static-http: mimic more closely localrepo (issue2164: allow clone -r )...
r11066 def __iter__(self):
return iter(self.read().splitlines(1))
def close(self):
pass
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274
def build_opener(ui, authinfo):
# urllib cannot handle URLs with embedded user or passwd
urlopener = url.opener(ui, authinfo)
urlopener.add_handler(byterange.HTTPRangeHandler())
Dan Villiom Podlaski Christiansen
statichttprepo: make the opener a subclass of abstractopener
r14091 class statichttpopener(scmutil.abstractopener):
def __init__(self, base):
self.base = base
def __call__(self, path, mode="r", atomictemp=None):
Adrian Buehlmann
statichttprepo: abort if opener mode is 'r+' or 'rb+'...
r13533 if mode not in ('r', 'rb'):
Nicolas Dumazet
static-http: mimic more closely localrepo (issue2164: allow clone -r )...
r11066 raise IOError('Permission denied')
Dan Villiom Podlaski Christiansen
statichttprepo: make the opener a subclass of abstractopener
r14091 f = "/".join((self.base, urllib.quote(path)))
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274 return httprangereader(f, urlopener)
Dan Villiom Podlaski Christiansen
statichttprepo: make the opener a subclass of abstractopener
r14091 return statichttpopener
mpm@selenic.com
Separate out old-http support...
r1101
class statichttprepository(localrepo.localrepository):
def __init__(self, ui, path):
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673 self._url = path
mpm@selenic.com
Separate out old-http support...
r1101 self.ui = ui
Benoit Boissinot
switch to the .hg/store layout, fix the tests
r3853
Nicolas Dumazet
static-http: mimic more closely localrepo (issue2164: allow clone -r )...
r11066 self.root = path
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 u = util.url(path.rstrip('/') + "/.hg")
Brodie Rao
httprepo/sshrepo: use url.url...
r13819 self.path, authinfo = u.authinfo()
Benoit Boissinot
statichttprepo: cleanups, use url.py (proxy, password support)...
r7274
opener = build_opener(ui, authinfo)
mpm@selenic.com
Separate out old-http support...
r1101 self.opener = opener(self.path)
Dirkjan Ochtman
make static-http work with empty repos (issue965)
r6028
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851 # find requirements
try:
Dan Villiom Podlaski Christiansen
prevent transient leaks of file handle by using new helper functions...
r14168 requirements = self.opener.read("requires").splitlines()
Dirkjan Ochtman
make static-http work with empty repos (issue965)
r6028 except IOError, inst:
Thomas Arendsen Hein
Fix Debian bug #494889 (fetching from static-http://... broken)...
r7178 if inst.errno != errno.ENOENT:
raise
# check if it is a non-empty old-style repository
try:
Dan Villiom Podlaski Christiansen
explicitly close files...
r13400 fp = self.opener("00changelog.i")
fp.read(1)
fp.close()
Thomas Arendsen Hein
Fix Debian bug #494889 (fetching from static-http://... broken)...
r7178 except IOError, inst:
if inst.errno != errno.ENOENT:
raise
# we do not care about empty old-style repositories here
Dirkjan Ochtman
make static-http work with empty repos (issue965)
r6028 msg = _("'%s' does not appear to be an hg repository") % path
Matt Mackall
error: move repo errors...
r7637 raise error.RepoError(msg)
Thomas Arendsen Hein
Fix Debian bug #494889 (fetching from static-http://... broken)...
r7178 requirements = []
Dirkjan Ochtman
make static-http work with empty repos (issue965)
r6028
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851 # check them
for r in requirements:
if r not in self.supported:
Adrian Buehlmann
introduce new RequirementError (issue2649)...
r13447 raise error.RequirementError(
_("requirement '%s' not supported") % r)
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851
# setup store
Adrian Buehlmann
store: remove pointless pathjoiner parameter...
r13426 self.store = store.store(requirements, self.path, opener)
Matt Mackall
statichttp: use store class...
r6897 self.spath = self.store.path
self.sopener = self.store.opener
self.sjoin = self.store.join
Benoit Boissinot
add "requires" file to the repo, specifying the requirements
r3851
Benoit Boissinot
introduce localrepo.spath for the store path, sopener fixes
r3791 self.manifest = manifest.manifest(self.sopener)
self.changelog = changelog.changelog(self.sopener)
Greg Ward
localrepo: rename in-memory tag cache instance attributes (issue548)....
r9146 self._tags = None
mpm@selenic.com
Separate out old-http support...
r1101 self.nodetagscache = None
Nicolas Dumazet
static-http: mimic more closely localrepo (issue2164: allow clone -r )...
r11066 self._branchcache = None
self._branchcachetip = None
Benoit Boissinot
cleanup of revlog.group when repository is local...
r1598 self.encodepats = None
self.decodepats = None
Mads Kiilerich
statichttprepo: don't modify localrepo class variables...
r13440 self.capabilities = self.capabilities.difference(["pushkey"])
mpm@selenic.com
Separate out old-http support...
r1101
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673 def url(self):
Matt Mackall
Autodetect static-http
r7211 return self._url
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673
mpm@selenic.com
Separate out old-http support...
r1101 def local(self):
return False
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740
Martin Geisler
do not pretend to lock static-http repositories (issue994)
r7005 def lock(self, wait=True):
raise util.Abort(_('cannot lock static-http repository'))
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 def instance(ui, path, create):
if create:
raise util.Abort(_('cannot create new static-http repository'))
Thomas Arendsen Hein
Removed deprecated hg:// and old-http:// protocols (issue406)
r4853 return statichttprepository(ui, path[7:])