##// END OF EJS Templates
merge with crew-stable
Thomas Arendsen Hein -
r7179:3d080733 merge default
parent child Browse files
Show More
@@ -1,83 +1,90 b''
1 # statichttprepo.py - simple http repository class for mercurial
1 # statichttprepo.py - simple http repository class for mercurial
2 #
2 #
3 # This provides read-only repo access to repositories exported via static http
3 # This provides read-only repo access to repositories exported via static http
4 #
4 #
5 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
5 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
6 #
6 #
7 # This software may be used and distributed according to the terms
7 # This software may be used and distributed according to the terms
8 # of the GNU General Public License, incorporated herein by reference.
8 # of the GNU General Public License, incorporated herein by reference.
9
9
10 from i18n import _
10 from i18n import _
11 import changelog, httprangereader
11 import changelog, httprangereader
12 import repo, localrepo, manifest, util, store
12 import repo, localrepo, manifest, util, store
13 import urllib, urllib2, errno
13 import urllib, urllib2, errno
14
14
15 class rangereader(httprangereader.httprangereader):
15 class rangereader(httprangereader.httprangereader):
16 def read(self, size=None):
16 def read(self, size=None):
17 try:
17 try:
18 return httprangereader.httprangereader.read(self, size)
18 return httprangereader.httprangereader.read(self, size)
19 except urllib2.HTTPError, inst:
19 except urllib2.HTTPError, inst:
20 num = inst.code == 404 and errno.ENOENT or None
20 num = inst.code == 404 and errno.ENOENT or None
21 raise IOError(num, inst)
21 raise IOError(num, inst)
22 except urllib2.URLError, inst:
22 except urllib2.URLError, inst:
23 raise IOError(None, inst.reason[1])
23 raise IOError(None, inst.reason[1])
24
24
25 def opener(base):
25 def opener(base):
26 """return a function that opens files over http"""
26 """return a function that opens files over http"""
27 p = base
27 p = base
28 def o(path, mode="r"):
28 def o(path, mode="r"):
29 f = "/".join((p, urllib.quote(path)))
29 f = "/".join((p, urllib.quote(path)))
30 return rangereader(f)
30 return rangereader(f)
31 return o
31 return o
32
32
33 class statichttprepository(localrepo.localrepository):
33 class statichttprepository(localrepo.localrepository):
34 def __init__(self, ui, path):
34 def __init__(self, ui, path):
35 self._url = path
35 self._url = path
36 self.ui = ui
36 self.ui = ui
37
37
38 self.path = path.rstrip('/') + "/.hg"
38 self.path = path.rstrip('/') + "/.hg"
39 self.opener = opener(self.path)
39 self.opener = opener(self.path)
40
40
41 # find requirements
41 # find requirements
42 try:
42 try:
43 requirements = self.opener("requires").read().splitlines()
43 requirements = self.opener("requires").read().splitlines()
44 except IOError, inst:
44 except IOError, inst:
45 if inst.errno == errno.ENOENT:
45 if inst.errno != errno.ENOENT:
46 raise
47 # check if it is a non-empty old-style repository
48 try:
49 self.opener("00changelog.i").read(1)
50 except IOError, inst:
51 if inst.errno != errno.ENOENT:
52 raise
53 # we do not care about empty old-style repositories here
46 msg = _("'%s' does not appear to be an hg repository") % path
54 msg = _("'%s' does not appear to be an hg repository") % path
47 raise repo.RepoError(msg)
55 raise repo.RepoError(msg)
48 else:
56 requirements = []
49 requirements = []
50
57
51 # check them
58 # check them
52 for r in requirements:
59 for r in requirements:
53 if r not in self.supported:
60 if r not in self.supported:
54 raise repo.RepoError(_("requirement '%s' not supported") % r)
61 raise repo.RepoError(_("requirement '%s' not supported") % r)
55
62
56 # setup store
63 # setup store
57 def pjoin(a, b):
64 def pjoin(a, b):
58 return a + '/' + b
65 return a + '/' + b
59 self.store = store.store(requirements, self.path, opener, pjoin)
66 self.store = store.store(requirements, self.path, opener, pjoin)
60 self.spath = self.store.path
67 self.spath = self.store.path
61 self.sopener = self.store.opener
68 self.sopener = self.store.opener
62 self.sjoin = self.store.join
69 self.sjoin = self.store.join
63
70
64 self.manifest = manifest.manifest(self.sopener)
71 self.manifest = manifest.manifest(self.sopener)
65 self.changelog = changelog.changelog(self.sopener)
72 self.changelog = changelog.changelog(self.sopener)
66 self.tagscache = None
73 self.tagscache = None
67 self.nodetagscache = None
74 self.nodetagscache = None
68 self.encodepats = None
75 self.encodepats = None
69 self.decodepats = None
76 self.decodepats = None
70
77
71 def url(self):
78 def url(self):
72 return 'static-' + self._url
79 return 'static-' + self._url
73
80
74 def local(self):
81 def local(self):
75 return False
82 return False
76
83
77 def lock(self, wait=True):
84 def lock(self, wait=True):
78 raise util.Abort(_('cannot lock static-http repository'))
85 raise util.Abort(_('cannot lock static-http repository'))
79
86
80 def instance(ui, path, create):
87 def instance(ui, path, create):
81 if create:
88 if create:
82 raise util.Abort(_('cannot create new static-http repository'))
89 raise util.Abort(_('cannot create new static-http repository'))
83 return statichttprepository(ui, path[7:])
90 return statichttprepository(ui, path[7:])
General Comments 0
You need to be logged in to leave comments. Login now