statichttprepo.py
86 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
/ mercurial / statichttprepo.py
|
r1101 | # statichttprepo.py - simple http repository class for mercurial | ||
# | ||||
# This provides read-only repo access to repositories exported via static http | ||||
# | ||||
|
r4635 | # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> | ||
|
r1101 | # | ||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
|
r3891 | from i18n import _ | ||
|
r6212 | import changelog, httprangereader | ||
|
r6028 | import repo, localrepo, manifest, util | ||
import urllib, urllib2, errno | ||||
|
r1325 | |||
class rangereader(httprangereader.httprangereader): | ||||
def read(self, size=None): | ||||
try: | ||||
return httprangereader.httprangereader.read(self, size) | ||||
|
r1821 | except urllib2.HTTPError, inst: | ||
|
r6028 | num = inst.code == 404 and errno.ENOENT or None | ||
raise IOError(num, inst) | ||||
|
r1325 | except urllib2.URLError, inst: | ||
|
r1821 | raise IOError(None, inst.reason[1]) | ||
|
r1101 | |||
def opener(base): | ||||
"""return a function that opens files over http""" | ||||
p = base | ||||
def o(path, mode="r"): | ||||
|
r3794 | f = "/".join((p, urllib.quote(path))) | ||
|
r1325 | return rangereader(f) | ||
|
r1101 | return o | ||
class statichttprepository(localrepo.localrepository): | ||||
def __init__(self, ui, path): | ||||
|
r2673 | self._url = path | ||
|
r1101 | self.ui = ui | ||
|
r3853 | |||
|
r5315 | self.path = path.rstrip('/') + "/.hg" | ||
|
r1101 | self.opener = opener(self.path) | ||
|
r6028 | |||
|
r3851 | # find requirements | ||
try: | ||||
requirements = self.opener("requires").read().splitlines() | ||||
|
r6028 | except IOError, inst: | ||
if inst.errno == errno.ENOENT: | ||||
msg = _("'%s' does not appear to be an hg repository") % path | ||||
raise repo.RepoError(msg) | ||||
else: | ||||
requirements = [] | ||||
|
r3851 | # check them | ||
for r in requirements: | ||||
if r not in self.supported: | ||||
raise repo.RepoError(_("requirement '%s' not supported") % r) | ||||
# setup store | ||||
|
r3853 | if "store" in requirements: | ||
self.encodefn = util.encodefilename | ||||
self.decodefn = util.decodefilename | ||||
self.spath = self.path + "/store" | ||||
else: | ||||
self.encodefn = lambda x: x | ||||
self.decodefn = lambda x: x | ||||
self.spath = self.path | ||||
self.sopener = util.encodedopener(opener(self.spath), self.encodefn) | ||||
|
r3851 | |||
|
r3791 | self.manifest = manifest.manifest(self.sopener) | ||
self.changelog = changelog.changelog(self.sopener) | ||||
|
r1101 | self.tagscache = None | ||
self.nodetagscache = None | ||||
|
r1598 | self.encodepats = None | ||
self.decodepats = None | ||||
|
r1101 | |||
|
r2673 | def url(self): | ||
return 'static-' + self._url | ||||
|
r1101 | def dev(self): | ||
return -1 | ||||
def local(self): | ||||
return False | ||||
|
r2740 | |||
def instance(ui, path, create): | ||||
if create: | ||||
raise util.Abort(_('cannot create new static-http repository')) | ||||
|
r4853 | return statichttprepository(ui, path[7:]) | ||