Mercurial > hg
annotate hgext/largefiles/proto.py @ 36067:caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
The "pushres" and "pusherr" response types currently call
proto.restore() in the HTTP protocol. This completes the pairing
with proto.redirect() that occurs in the @wireprotocommand
functions. (But since the SSH protocol has a no-op redirect(),
it doesn't bother calling restore() because it would also be
a no-op.)
Having the disconnect between these paired calls is very confusing.
Knowing that you must use proto.redirect() if returning a "pushres"
or a "pusherr" is even wonkier.
We replace this confusing code with our new context manager for
[maybe] capturing output.
The "pushres" and "pusherr" types have gained an "output" argument
to their constructor and an attribute to hold captured data. The
HTTP protocol now retrieves output from these objects.
.. api::
``wireproto.pushres`` and ``wireproto.pusherr`` now explicitly
track stdio output.
Differential Revision: https://phab.mercurial-scm.org/D2082
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 07 Feb 2018 20:19:06 -0800 |
parents | a39a9df7ecca |
children | 90ca4986616c |
rev | line source |
---|---|
15168 | 1 # Copyright 2011 Fog Creek Software |
2 # | |
3 # This software may be used and distributed according to the terms of the | |
4 # GNU General Public License version 2 or any later version. | |
29312
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
5 from __future__ import absolute_import |
15168 | 6 |
7 import os | |
19917
cff331cbb5ee
largefiles: make the protocol hack for replacing heads with lheads more precise
Mads Kiilerich <madski@unity3d.com>
parents:
19009
diff
changeset
|
8 import re |
15168 | 9 |
10 from mercurial.i18n import _ | |
11 | |
29312
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
12 from mercurial import ( |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
13 error, |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
14 httppeer, |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
15 util, |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
16 wireproto, |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
17 ) |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
18 |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
19 from . import ( |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
20 lfutil, |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
21 ) |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
22 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28576
diff
changeset
|
23 urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28576
diff
changeset
|
24 urlreq = util.urlreq |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28576
diff
changeset
|
25 |
15255
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
26 LARGEFILES_REQUIRED_MSG = ('\nThis repository uses the largefiles extension.' |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
27 '\n\nPlease enable it in your Mercurial config ' |
7ab05d752405
largefiles: cosmetics, whitespace, code style
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
28 'file.\n') |
15168 | 29 |
18922
d2c4d37f7db5
largefiles: quiet (and document) undefined name errors (issue3886)
Bryan O'Sullivan <bryano@fb.com>
parents:
18488
diff
changeset
|
30 # these will all be replaced by largefiles.uisetup |
d2c4d37f7db5
largefiles: quiet (and document) undefined name errors (issue3886)
Bryan O'Sullivan <bryano@fb.com>
parents:
18488
diff
changeset
|
31 ssholdcallstream = None |
d2c4d37f7db5
largefiles: quiet (and document) undefined name errors (issue3886)
Bryan O'Sullivan <bryano@fb.com>
parents:
18488
diff
changeset
|
32 httpoldcallstream = None |
d2c4d37f7db5
largefiles: quiet (and document) undefined name errors (issue3886)
Bryan O'Sullivan <bryano@fb.com>
parents:
18488
diff
changeset
|
33 |
15168 | 34 def putlfile(repo, proto, sha): |
28576
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
35 '''Server command for putting a largefile into a repository's local store |
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
36 and into the user cache.''' |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
37 with proto.mayberedirectstdio() as output: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
38 path = lfutil.storepath(repo, sha) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
39 util.makedirs(os.path.dirname(path)) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
40 tmpfp = util.atomictempfile(path, createmode=repo.store.createmode) |
16594
5516fdf3fe24
largefiles: in putlfile, ensure tempfile's directory exists prior to creation
hlian
parents:
16247
diff
changeset
|
41 |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
42 try: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
43 proto.getfile(tmpfp) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
44 tmpfp._fp.seek(0) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
45 if sha != lfutil.hexsha1(tmpfp._fp): |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
46 raise IOError(0, _('largefile contents do not match hash')) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
47 tmpfp.close() |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
48 lfutil.linktousercache(repo, sha) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
49 except IOError as e: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
50 repo.ui.warn(_('largefiles: failed to put %s into store: %s\n') % |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
51 (sha, e.strerror)) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
52 return wireproto.pushres(1, output.getvalue() if output else '') |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
53 finally: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
54 tmpfp.discard() |
15168 | 55 |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
56 return wireproto.pushres(0, output.getvalue() if output else '') |
15168 | 57 |
58 def getlfile(repo, proto, sha): | |
28576
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
59 '''Server command for retrieving a largefile from the repository-local |
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
60 cache or user cache.''' |
15168 | 61 filename = lfutil.findfile(repo, sha) |
62 if not filename: | |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
63 raise error.Abort(_('requested largefile %s not present in cache') |
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
64 % sha) |
15168 | 65 f = open(filename, 'rb') |
66 length = os.fstat(f.fileno())[6] | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
67 |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
68 # Since we can't set an HTTP content-length header here, and |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
69 # Mercurial core provides no way to give the length of a streamres |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
70 # (and reading the entire file into RAM would be ill-advised), we |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
71 # just send the length on the first line of the response, like the |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
72 # ssh proto does for string responses. |
15168 | 73 def generator(): |
74 yield '%d\n' % length | |
19009
07e40d589b64
largefiles: use filechunkiter for iterating largefile when serving getlfile
Mads Kiilerich <madski@unity3d.com>
parents:
19006
diff
changeset
|
75 for chunk in util.filechunkiter(f): |
15168 | 76 yield chunk |
35750
a39a9df7ecca
wireproto: split streamres into legacy and modern case
Joerg Sonnenberger <joerg@bec.de>
parents:
35507
diff
changeset
|
77 return wireproto.streamres_legacy(gen=generator()) |
15168 | 78 |
79 def statlfile(repo, proto, sha): | |
28576
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
80 '''Server command for checking if a largefile is present - returns '2\n' if |
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
81 the largefile is missing, '0\n' if it seems to be in good condition. |
18488
a977b42df8b3
largefiles: don't verify largefile hashes on servers when processing statlfile
Mads Kiilerich <madski@unity3d.com>
parents:
18298
diff
changeset
|
82 |
a977b42df8b3
largefiles: don't verify largefile hashes on servers when processing statlfile
Mads Kiilerich <madski@unity3d.com>
parents:
18298
diff
changeset
|
83 The value 1 is reserved for mismatched checksum, but that is too expensive |
a977b42df8b3
largefiles: don't verify largefile hashes on servers when processing statlfile
Mads Kiilerich <madski@unity3d.com>
parents:
18298
diff
changeset
|
84 to be verified on every stat and must be caught be running 'hg verify' |
a977b42df8b3
largefiles: don't verify largefile hashes on servers when processing statlfile
Mads Kiilerich <madski@unity3d.com>
parents:
18298
diff
changeset
|
85 server side.''' |
15168 | 86 filename = lfutil.findfile(repo, sha) |
87 if not filename: | |
88 return '2\n' | |
18488
a977b42df8b3
largefiles: don't verify largefile hashes on servers when processing statlfile
Mads Kiilerich <madski@unity3d.com>
parents:
18298
diff
changeset
|
89 return '0\n' |
15168 | 90 |
91 def wirereposetup(ui, repo): | |
92 class lfileswirerepository(repo.__class__): | |
93 def putlfile(self, sha, fd): | |
94 # unfortunately, httprepository._callpush tries to convert its | |
95 # input file-like into a bundle before sending it, so we can't use | |
96 # it ... | |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17127
diff
changeset
|
97 if issubclass(self.__class__, httppeer.httppeer): |
26825
78539633acf3
largefiles: don't mute and obfuscate http errors when putlfile fails
Mads Kiilerich <madski@unity3d.com>
parents:
26587
diff
changeset
|
98 res = self._call('putlfile', data=fd, sha=sha, |
78539633acf3
largefiles: don't mute and obfuscate http errors when putlfile fails
Mads Kiilerich <madski@unity3d.com>
parents:
26587
diff
changeset
|
99 headers={'content-type':'application/mercurial-0.1'}) |
15168 | 100 try: |
15778
f15c646bffc7
largefiles: display remote errors from putlfile (issue3123) (issue3149)
Kevin Gessner <kevin@fogcreek.com>
parents:
15391
diff
changeset
|
101 d, output = res.split('\n', 1) |
f15c646bffc7
largefiles: display remote errors from putlfile (issue3123) (issue3149)
Kevin Gessner <kevin@fogcreek.com>
parents:
15391
diff
changeset
|
102 for l in output.splitlines(True): |
19949
29f12a7a03ee
largefiles: don't add extra \n when displaying remote messages in putlfile
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
103 self.ui.warn(_('remote: '), l) # assume l ends with \n |
15778
f15c646bffc7
largefiles: display remote errors from putlfile (issue3123) (issue3149)
Kevin Gessner <kevin@fogcreek.com>
parents:
15391
diff
changeset
|
104 return int(d) |
26825
78539633acf3
largefiles: don't mute and obfuscate http errors when putlfile fails
Mads Kiilerich <madski@unity3d.com>
parents:
26587
diff
changeset
|
105 except ValueError: |
19947
2a03faf8b5fe
largefiles: fix 'unexpected response' warning newlines
Mads Kiilerich <madski@unity3d.com>
parents:
19917
diff
changeset
|
106 self.ui.warn(_('unexpected putlfile response: %r\n') % res) |
15168 | 107 return 1 |
108 # ... but we can't use sshrepository._call because the data= | |
109 # argument won't get sent, and _callpush does exactly what we want | |
110 # in this case: send the data straight through | |
111 else: | |
112 try: | |
113 ret, output = self._callpush("putlfile", fd, sha=sha) | |
114 if ret == "": | |
115 raise error.ResponseError(_('putlfile failed:'), | |
116 output) | |
117 return int(ret) | |
118 except IOError: | |
119 return 1 | |
120 except ValueError: | |
121 raise error.ResponseError( | |
122 _('putlfile failed (unexpected response):'), ret) | |
123 | |
124 def getlfile(self, sha): | |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
18922
diff
changeset
|
125 """returns an iterable with the chunks of the file with sha sha""" |
15168 | 126 stream = self._callstream("getlfile", sha=sha) |
127 length = stream.readline() | |
128 try: | |
129 length = int(length) | |
130 except ValueError: | |
15170
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15168
diff
changeset
|
131 self._abort(error.ResponseError(_("unexpected response:"), |
c1a4a3220711
largefiles: fix over-long lines
Matt Mackall <mpm@selenic.com>
parents:
15168
diff
changeset
|
132 length)) |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
18922
diff
changeset
|
133 |
19005
1b84047e7d16
largefiles: drop limitreader, use filechunkiter limit
Mads Kiilerich <madski@unity3d.com>
parents:
19004
diff
changeset
|
134 # SSH streams will block if reading more than length |
30181
7356e6b1f5b8
util: increase filechunkiter size to 128k
Mads Kiilerich <madski@unity3d.com>
parents:
29312
diff
changeset
|
135 for chunk in util.filechunkiter(stream, limit=length): |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
18922
diff
changeset
|
136 yield chunk |
19006
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
137 # HTTP streams must hit the end to process the last empty |
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
138 # chunk of Chunked-Encoding so the connection can be reused. |
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
139 if issubclass(self.__class__, httppeer.httppeer): |
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
140 chunk = stream.read(1) |
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
141 if chunk: |
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
142 self._abort(error.ResponseError(_("unexpected response:"), |
0b3b84222a2d
largefiles: getlfile must hit end of HTTP chunked streams to reuse connections
Mads Kiilerich <madski@unity3d.com>
parents:
19005
diff
changeset
|
143 chunk)) |
15168 | 144 |
21084
70252bdfd39c
largefiles: import whole modules instead of importing parts of them
Mads Kiilerich <madski@unity3d.com>
parents:
19949
diff
changeset
|
145 @wireproto.batchable |
15168 | 146 def statlfile(self, sha): |
21084
70252bdfd39c
largefiles: import whole modules instead of importing parts of them
Mads Kiilerich <madski@unity3d.com>
parents:
19949
diff
changeset
|
147 f = wireproto.future() |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16594
diff
changeset
|
148 result = {'sha': sha} |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16594
diff
changeset
|
149 yield result, f |
15168 | 150 try: |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16594
diff
changeset
|
151 yield int(f.value) |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28576
diff
changeset
|
152 except (ValueError, urlerr.httperror): |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
153 # If the server returns anything but an integer followed by a |
15168 | 154 # newline, newline, it's not speaking our language; if we get |
155 # an HTTP error, we can't be sure the largefile is present; | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
156 # either way, consider it missing. |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16594
diff
changeset
|
157 yield 2 |
15168 | 158 |
159 repo.__class__ = lfileswirerepository | |
160 | |
161 # advertise the largefiles=serve capability | |
35507
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
162 def _capabilities(orig, repo, proto): |
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
163 '''announce largefile server capability''' |
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
164 caps = orig(repo, proto) |
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
165 caps.append('largefiles=serve') |
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
166 return caps |
15168 | 167 |
168 def heads(repo, proto): | |
28576
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
169 '''Wrap server command - largefile capable clients will know to call |
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
170 lheads instead''' |
15168 | 171 if lfutil.islfilesrepo(repo): |
15224
7c604d8c7e83
largefiles: remove pre-1.9 code from extension first bundled with 1.9
Na'Tosha Bard <natosha@unity3d.com>
parents:
15170
diff
changeset
|
172 return wireproto.ooberror(LARGEFILES_REQUIRED_MSG) |
15168 | 173 return wireproto.heads(repo, proto) |
174 | |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16155
diff
changeset
|
175 def sshrepocallstream(self, cmd, **args): |
15168 | 176 if cmd == 'heads' and self.capable('largefiles'): |
177 cmd = 'lheads' | |
178 if cmd == 'batch' and self.capable('largefiles'): | |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30466
diff
changeset
|
179 args[r'cmds'] = args[r'cmds'].replace('heads ', 'lheads ') |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16155
diff
changeset
|
180 return ssholdcallstream(self, cmd, **args) |
15168 | 181 |
19917
cff331cbb5ee
largefiles: make the protocol hack for replacing heads with lheads more precise
Mads Kiilerich <madski@unity3d.com>
parents:
19009
diff
changeset
|
182 headsre = re.compile(r'(^|;)heads\b') |
cff331cbb5ee
largefiles: make the protocol hack for replacing heads with lheads more precise
Mads Kiilerich <madski@unity3d.com>
parents:
19009
diff
changeset
|
183 |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16155
diff
changeset
|
184 def httprepocallstream(self, cmd, **args): |
15168 | 185 if cmd == 'heads' and self.capable('largefiles'): |
186 cmd = 'lheads' | |
187 if cmd == 'batch' and self.capable('largefiles'): | |
35348
576ba8194fa8
py3: handle keyword arguments correctly in hgext/largefiles/
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30466
diff
changeset
|
188 args[r'cmds'] = headsre.sub('lheads', args[r'cmds']) |
16247
d87d9d8a8e03
largefiles: remove use of underscores that breaks coding convention
Na'Tosha Bard <natosha@unity3d.com>
parents:
16155
diff
changeset
|
189 return httpoldcallstream(self, cmd, **args) |