annotate mercurial/statichttprepo.py @ 46202:5135b393884b

statichttprepo: explicitly convert error message to str (issue6247) For Python 2.7, the implicit conversion of the HTTPError instance to str was good enough. For Python 3.x, this fails later when hitting the str to bytes conversion logic. Differential Revision: https://phab.mercurial-scm.org/D9661
author Joerg Sonnenberger <joerg@bec.de>
date Mon, 28 Dec 2020 01:21:58 +0100
parents 5523e3e1bc71
children bc2519513ae0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
1 # statichttprepo.py - simple http repository class for mercurial
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
2 #
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
3 # This provides read-only repo access to repositories exported via static http
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
4 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4258
diff changeset
5 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
6 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7873
diff changeset
7 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9146
diff changeset
8 # GNU General Public License version 2 or any later version.
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
9
25978
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
10 from __future__ import absolute_import
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
11
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
12 import errno
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
13
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
14 from .i18n import _
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
15 from . import (
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41407
diff changeset
16 branchmap,
25978
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
17 changelog,
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
18 error,
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
19 localrepo,
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
20 manifest,
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
21 namespaces,
34943
3423f7e2d287 statichttprepo: do not use platform path separator to build a URL
Yuya Nishihara <yuya@tcha.org>
parents: 33604
diff changeset
22 pathutil,
41407
6e9bebb65ce7 statichttprepo: use str to appease Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41406
diff changeset
23 pycompat,
25978
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
24 url,
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
25 util,
31241
591fda751c6b vfs: use 'vfs' module directly in 'mercurial.statichttprepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31148
diff changeset
26 vfs as vfsmod,
25978
762f4c6df6b1 statichttprepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25670
diff changeset
27 )
1325
57220daf40e9 Move urllib error handling from revlog into statichttprepo, where it belongs.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1101
diff changeset
28
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 27705
diff changeset
29 urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 27705
diff changeset
30 urlreq = util.urlreq
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 27705
diff changeset
31
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
32
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
33 class httprangereader(object):
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
34 def __init__(self, url, opener):
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
35 # we assume opener has HTTPRangeHandler
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
36 self.url = url
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
37 self.pos = 0
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
38 self.opener = opener
11066
26abd91d9e84 static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10263
diff changeset
39 self.name = url
27705
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
40
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
41 def __enter__(self):
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
42 return self
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
43
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
44 def __exit__(self, exc_type, exc_value, traceback):
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
45 self.close()
2380889f8f52 statichttprepo: implement __enter__ and __exit__ on httprangeheader
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26587
diff changeset
46
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
47 def seek(self, pos):
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
48 self.pos = pos
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
49
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
50 def read(self, bytes=None):
41407
6e9bebb65ce7 statichttprepo: use str to appease Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41406
diff changeset
51 req = urlreq.request(pycompat.strurl(self.url))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
52 end = b''
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
53 if bytes:
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
54 end = self.pos + bytes - 1
16882
a2d6e336e9cc statichttprepo: don't send Range header when requesting entire file
Alexander Boyd <alex@opengroove.org>
parents: 16115
diff changeset
55 if self.pos or end:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
56 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
57
1325
57220daf40e9 Move urllib error handling from revlog into statichttprepo, where it belongs.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1101
diff changeset
58 try:
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
59 f = self.opener.open(req)
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
60 data = f.read()
25196
7a1af58ab242 statichttprepo: remove wrong getattr ladder
Augie Fackler <raf@durin42.com>
parents: 24377
diff changeset
61 code = f.code
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 27705
diff changeset
62 except urlerr.httperror as inst:
6028
6605a03cbf87 make static-http work with empty repos (issue965)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5321
diff changeset
63 num = inst.code == 404 and errno.ENOENT or None
46202
5135b393884b statichttprepo: explicitly convert error message to str (issue6247)
Joerg Sonnenberger <joerg@bec.de>
parents: 45434
diff changeset
64 # Explicitly convert the exception to str as Py3 will try
5135b393884b statichttprepo: explicitly convert error message to str (issue6247)
Joerg Sonnenberger <joerg@bec.de>
parents: 45434
diff changeset
65 # convert it to local encoding and with as the HTTPResponse
5135b393884b statichttprepo: explicitly convert error message to str (issue6247)
Joerg Sonnenberger <joerg@bec.de>
parents: 45434
diff changeset
66 # instance doesn't support encode.
5135b393884b statichttprepo: explicitly convert error message to str (issue6247)
Joerg Sonnenberger <joerg@bec.de>
parents: 45434
diff changeset
67 raise IOError(num, str(inst))
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 27705
diff changeset
68 except urlerr.urlerror as inst:
41406
2bf689b13a17 statichttprepo: use URLError.reason directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41038
diff changeset
69 raise IOError(None, inst.reason)
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
70
8612
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
71 if code == 200:
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
72 # HTTPRangeHandler does nothing if remote does not support
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
73 # Range headers and returns the full entity. Let's slice it.
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
74 if bytes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
75 data = data[self.pos : self.pos + bytes]
8612
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
76 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
77 data = data[self.pos :]
8612
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
78 elif bytes:
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
79 data = data[:bytes]
8612
e10e984bea46 statichttprepo: handle remote not supporting Range headers
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
80 self.pos += len(data)
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
81 return data
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
82
20055
6bb9de1e4d16 statichttprepo.httprangeheader: implement readlines
Siddharth Agarwal <sid0@fb.com>
parents: 20054
diff changeset
83 def readlines(self):
6bb9de1e4d16 statichttprepo.httprangeheader: implement readlines
Siddharth Agarwal <sid0@fb.com>
parents: 20054
diff changeset
84 return self.read().splitlines(True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
85
11066
26abd91d9e84 static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10263
diff changeset
86 def __iter__(self):
20055
6bb9de1e4d16 statichttprepo.httprangeheader: implement readlines
Siddharth Agarwal <sid0@fb.com>
parents: 20054
diff changeset
87 return iter(self.readlines())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
88
11066
26abd91d9e84 static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10263
diff changeset
89 def close(self):
26abd91d9e84 static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10263
diff changeset
90 pass
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
91
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
92
36425
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
93 # _RangeError and _HTTPRangeHandler were originally in byterange.py,
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
94 # which was itself extracted from urlgrabber. See the last version of
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
95 # byterange.py from history if you need more information.
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
96 class _RangeError(IOError):
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
97 """Error raised when an unsatisfiable range is requested."""
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
98
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
99
36425
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
100 class _HTTPRangeHandler(urlreq.basehandler):
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
101 """Handler that enables HTTP Range headers.
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
102
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
103 This was extremely simple. The Range header is a HTTP feature to
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
104 begin with so all this class does is tell urllib2 that the
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
105 "206 Partial Content" response from the HTTP server is what we
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
106 expected.
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
107 """
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
108
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
109 def http_error_206(self, req, fp, code, msg, hdrs):
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
110 # 206 Partial Content Response
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
111 r = urlreq.addinfourl(fp, hdrs, req.get_full_url())
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
112 r.code = code
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
113 r.msg = msg
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
114 return r
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
115
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
116 def http_error_416(self, req, fp, code, msg, hdrs):
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
117 # HTTP's Range Not Satisfiable error
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
118 raise _RangeError(b'Requested Range Not Satisfiable')
36425
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
119
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
120
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
121 def build_opener(ui, authinfo):
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
122 # urllib cannot handle URLs with embedded user or passwd
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
123 urlopener = url.opener(ui, authinfo)
36425
24c2c760c1cb statichttprepo: move HTTPRangeHandler from byterange and delete the latter
Augie Fackler <augie@google.com>
parents: 35248
diff changeset
124 urlopener.add_handler(_HTTPRangeHandler())
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
125
31241
591fda751c6b vfs: use 'vfs' module directly in 'mercurial.statichttprepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31148
diff changeset
126 class statichttpvfs(vfsmod.abstractvfs):
14091
0aa60e4e0b76 statichttprepo: make the opener a subclass of abstractopener
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14076
diff changeset
127 def __init__(self, base):
0aa60e4e0b76 statichttprepo: make the opener a subclass of abstractopener
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14076
diff changeset
128 self.base = base
43025
3518da504303 vfs: give all vfs an options attribute by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42231
diff changeset
129 self.options = {}
14091
0aa60e4e0b76 statichttprepo: make the opener a subclass of abstractopener
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14076
diff changeset
130
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
131 def __call__(self, path, mode=b'r', *args, **kw):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
132 if mode not in (b'r', b'rb'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
133 raise IOError(b'Permission denied')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
134 f = b"/".join((self.base, urlreq.quote(path)))
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
135 return httprangereader(f, urlopener)
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
136
17725
ffd589d4b785 vfs: define "join()" in each classes derived from "abstractvfs"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17649
diff changeset
137 def join(self, path):
ffd589d4b785 vfs: define "join()" in each classes derived from "abstractvfs"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17649
diff changeset
138 if path:
34943
3423f7e2d287 statichttprepo: do not use platform path separator to build a URL
Yuya Nishihara <yuya@tcha.org>
parents: 33604
diff changeset
139 return pathutil.join(self.base, path)
17725
ffd589d4b785 vfs: define "join()" in each classes derived from "abstractvfs"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17649
diff changeset
140 else:
ffd589d4b785 vfs: define "join()" in each classes derived from "abstractvfs"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17649
diff changeset
141 return self.base
ffd589d4b785 vfs: define "join()" in each classes derived from "abstractvfs"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17649
diff changeset
142
17649
f65c6a5f256c scmutil: rename classes from "opener" to "vfs"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17193
diff changeset
143 return statichttpvfs
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
144
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
145
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
146 class statichttppeer(localrepo.localpeer):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
147 def local(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
148 return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
149
17193
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17192
diff changeset
150 def canpush(self):
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17192
diff changeset
151 return False
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
152
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
153
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
154 class statichttprepository(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
155 localrepo.localrepository, localrepo.revlogfilestorage
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
156 ):
19778
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18915
diff changeset
157 supported = localrepo.localrepository._basesupported
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18915
diff changeset
158
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
159 def __init__(self, ui, path):
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2072
diff changeset
160 self._url = path
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
161 self.ui = ui
3853
c0b449154a90 switch to the .hg/store layout, fix the tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3851
diff changeset
162
11066
26abd91d9e84 static-http: mimic more closely localrepo (issue2164: allow clone -r )
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10263
diff changeset
163 self.root = path
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
164 u = util.url(path.rstrip(b'/') + b"/.hg")
13819
d16894e29f91 httprepo/sshrepo: use url.url
Brodie Rao <brodie@bitheap.org>
parents: 13533
diff changeset
165 self.path, authinfo = u.authinfo()
7274
95f3694cc5a4 statichttprepo: cleanups, use url.py (proxy, password support)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7211
diff changeset
166
31147
e04ab2a5bf90 statichttp: use 'repo.vfs' as the main attribute
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30219
diff changeset
167 vfsclass = build_opener(ui, authinfo)
e04ab2a5bf90 statichttp: use 'repo.vfs' as the main attribute
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30219
diff changeset
168 self.vfs = vfsclass(self.path)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
169 self.cachevfs = vfsclass(self.vfs.join(b'cache'))
15922
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 14962
diff changeset
170 self._phasedefaults = []
6028
6605a03cbf87 make static-http work with empty repos (issue965)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5321
diff changeset
171
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23558
diff changeset
172 self.names = namespaces.namespaces()
32730
b8ff7d0ff361 localrepo: move filtername to __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31241
diff changeset
173 self.filtername = None
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41615
diff changeset
174 self._extrafilterid = None
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23552
diff changeset
175
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3794
diff changeset
176 try:
39694
6192980553b4 statichttprepo: use new functions for requirements validation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
177 requirements = set(self.vfs.read(b'requires').splitlines())
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25196
diff changeset
178 except IOError as inst:
7178
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
179 if inst.errno != errno.ENOENT:
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
180 raise
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14168
diff changeset
181 requirements = set()
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14168
diff changeset
182
7178
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
183 # check if it is a non-empty old-style repository
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
184 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
185 fp = self.vfs(b"00changelog.i")
13400
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13253
diff changeset
186 fp.read(1)
14f3795a5ed7 explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13253
diff changeset
187 fp.close()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25196
diff changeset
188 except IOError as inst:
7178
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
189 if inst.errno != errno.ENOENT:
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
190 raise
98b6c3dde237 Fix Debian bug #494889 (fetching from static-http://... broken)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6312
diff changeset
191 # we do not care about empty old-style repositories here
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 msg = _(b"'%s' does not appear to be an hg repository") % path
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7274
diff changeset
193 raise error.RepoError(msg)
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3794
diff changeset
194
39694
6192980553b4 statichttprepo: use new functions for requirements validation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
195 supportedrequirements = localrepo.gathersupportedrequirements(ui)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
196 localrepo.ensurerequirementsrecognized(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
197 requirements, supportedrequirements
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
198 )
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39694
diff changeset
199 localrepo.ensurerequirementscompatible(ui, requirements)
39694
6192980553b4 statichttprepo: use new functions for requirements validation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
200
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3794
diff changeset
201 # setup store
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
202 self.store = localrepo.makestore(requirements, self.path, vfsclass)
6897
faea0d27e38f statichttp: use store class
Matt Mackall <mpm@selenic.com>
parents: 6840
diff changeset
203 self.spath = self.store.path
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23877
diff changeset
204 self.svfs = self.store.opener
6897
faea0d27e38f statichttp: use store class
Matt Mackall <mpm@selenic.com>
parents: 6840
diff changeset
205 self.sjoin = self.store.join
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 15922
diff changeset
206 self._filecache = {}
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
207 self.requirements = requirements
3851
8f18e31c4441 add "requires" file to the repo, specifying the requirements
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3794
diff changeset
208
39763
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39698
diff changeset
209 rootmanifest = manifest.manifestrevlog(self.svfs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
210 self.manifestlog = manifest.manifestlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
211 self.svfs, self, rootmanifest, self.narrowmatch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
212 )
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23877
diff changeset
213 self.changelog = changelog.changelog(self.svfs)
9146
5614a628d173 localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 8612
diff changeset
214 self._tags = None
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
215 self.nodetagscache = None
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41407
diff changeset
216 self._branchcaches = branchmap.BranchMapCache()
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 23878
diff changeset
217 self._revbranchcache = None
1598
14d1f1868bf6 cleanup of revlog.group when repository is local
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1325
diff changeset
218 self.encodepats = None
14d1f1868bf6 cleanup of revlog.group when repository is local
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1325
diff changeset
219 self.decodepats = None
24377
656f93ce66d5 revbranchcache: move cache writing to the transaction finalizer
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
220 self._transref = None
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
221
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
222 def _restrictcapabilities(self, caps):
20962
af4158b8876b statichttp: respect localrepo _restrictcapabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20055
diff changeset
223 caps = super(statichttprepository, self)._restrictcapabilities(caps)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 return caps.difference([b"pushkey"])
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
225
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2072
diff changeset
226 def url(self):
7211
25c0dee16ee0 Autodetect static-http
Matt Mackall <mpm@selenic.com>
parents: 7179
diff changeset
227 return self._url
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2072
diff changeset
228
1101
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
229 def local(self):
2cf5c8a4eae5 Separate out old-http support
mpm@selenic.com
parents:
diff changeset
230 return False
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
231
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
232 def peer(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
233 return statichttppeer(self)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17156
diff changeset
234
33604
8b00c723cee1 statichttprepo: implement wlock() (issue5613)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33533
diff changeset
235 def wlock(self, wait=True):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
236 raise error.LockUnavailable(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
237 0,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
238 _(b'lock not available'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
239 b'lock',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
240 _(b'cannot lock static-http repository'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
241 )
33604
8b00c723cee1 statichttprepo: implement wlock() (issue5613)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33533
diff changeset
242
7005
7739b61897df do not pretend to lock static-http repositories (issue994)
Martin Geisler <mg@daimi.au.dk>
parents: 6988
diff changeset
243 def lock(self, wait=True):
45434
5523e3e1bc71 statichttprepo: use LockUnavailable() instead of Abort() for lock (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
244 raise error.LockUnavailable(
5523e3e1bc71 statichttprepo: use LockUnavailable() instead of Abort() for lock (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
245 0,
5523e3e1bc71 statichttprepo: use LockUnavailable() instead of Abort() for lock (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
246 _(b'lock not available'),
5523e3e1bc71 statichttprepo: use LockUnavailable() instead of Abort() for lock (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
247 b'lock',
5523e3e1bc71 statichttprepo: use LockUnavailable() instead of Abort() for lock (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
248 _(b'cannot lock static-http repository'),
5523e3e1bc71 statichttprepo: use LockUnavailable() instead of Abort() for lock (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 43506
diff changeset
249 )
7005
7739b61897df do not pretend to lock static-http repositories (issue994)
Martin Geisler <mg@daimi.au.dk>
parents: 6988
diff changeset
250
29738
c1696430254f statichttprepo: do not try to write caches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28883
diff changeset
251 def _writecaches(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
252 pass # statichttprepository are read only
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
253
29738
c1696430254f statichttprepo: do not try to write caches
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28883
diff changeset
254
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37717
diff changeset
255 def instance(ui, path, create, intents=None, createopts=None):
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
256 if create:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
257 raise error.Abort(_(b'cannot create new static-http repository'))
4853
bf10a03a6b24 Removed deprecated hg:// and old-http:// protocols (issue406)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4635
diff changeset
258 return statichttprepository(ui, path[7:])