Mercurial > hg
annotate hgext/largefiles/proto.py @ 50256:a6e0b7d4ae9d
dirstate: write the `branch` as part of the transaction if any
Bypassing the transaction means we could get out of sync with the dirstatemap
content.
The branch is stil written right away if no transaction is around, but at least
it no longer bypass the transaction.
Actual caller of this still need to be updated.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 02 Mar 2023 11:47:18 +0100 |
parents | 6000f5b25c9b |
children | bf92386f76fd |
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. | |
5 | |
6 import os | |
7 | |
8 from mercurial.i18n import _ | |
43085
eef9a2d67051
py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
9 from mercurial.pycompat import open |
15168 | 10 |
29312
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
11 from mercurial import ( |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
12 error, |
41062
0a7f582f6f1f
largefiles: port wrapped functions to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents:
37614
diff
changeset
|
13 exthelper, |
29312
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, |
36074
2f7290555c96
wireproto: introduce type for raw byte responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36070
diff
changeset
|
16 wireprototypes, |
37614
a81d02ea65db
wireproto: move version 1 peer functionality to standalone module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37484
diff
changeset
|
17 wireprotov1peer, |
41062
0a7f582f6f1f
largefiles: port wrapped functions to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents:
37614
diff
changeset
|
18 wireprotov1server, |
29312
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
19 ) |
29139be0ccc7
py3: make largefiles/proto.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28883
diff
changeset
|
20 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
21 from . import lfutil |
29312
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 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
26 LARGEFILES_REQUIRED_MSG = ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
27 b'\nThis repository uses the largefiles extension.' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
28 b'\n\nPlease enable it in your Mercurial config ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
29 b'file.\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
30 ) |
15168 | 31 |
41062
0a7f582f6f1f
largefiles: port wrapped functions to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents:
37614
diff
changeset
|
32 eh = exthelper.exthelper() |
0a7f582f6f1f
largefiles: port wrapped functions to exthelper
Matt Harbison <matt_harbison@yahoo.com>
parents:
37614
diff
changeset
|
33 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
34 |
15168 | 35 def putlfile(repo, proto, sha): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
36 """Server command for putting a largefile into a repository's local store |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
37 and into the user cache.""" |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
38 with proto.mayberedirectstdio() as output: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
39 path = lfutil.storepath(repo, sha) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
40 util.makedirs(os.path.dirname(path)) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
41 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
|
42 |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
43 try: |
37414
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37293
diff
changeset
|
44 for p in proto.getpayload(): |
2d965bfeb8f6
wireproto: allow direct stream processing for unbundle
Joerg Sonnenberger <joerg@bec.de>
parents:
37293
diff
changeset
|
45 tmpfp.write(p) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
46 tmpfp._fp.seek(0) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
47 if sha != lfutil.hexsha1(tmpfp._fp): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
48 raise IOError(0, _(b'largefile contents do not match hash')) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
49 tmpfp.close() |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
50 lfutil.linktousercache(repo, sha) |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
51 except IOError as e: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
52 repo.ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
53 _(b'largefiles: failed to put %s into store: %s\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
54 % (sha, e.strerror) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
55 ) |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36656
diff
changeset
|
56 return wireprototypes.pushres( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
57 1, output.getvalue() if output else b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
58 ) |
36067
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
59 finally: |
caca3ac2ac04
wireproto: use maybecapturestdio() for push responses (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35750
diff
changeset
|
60 tmpfp.discard() |
15168 | 61 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
62 return wireprototypes.pushres(0, output.getvalue() if output else b'') |
15168 | 63 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
64 |
15168 | 65 def getlfile(repo, proto, sha): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
66 """Server command for retrieving a largefile from the repository-local |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
67 cache or user cache.""" |
15168 | 68 filename = lfutil.findfile(repo, sha) |
69 if not filename: | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
70 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
71 _(b'requested largefile %s not present in cache') % sha |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
72 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
73 f = open(filename, b'rb') |
15168 | 74 length = os.fstat(f.fileno())[6] |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
75 |
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15224
diff
changeset
|
76 # 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
|
77 # 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
|
78 # (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
|
79 # 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
|
80 # ssh proto does for string responses. |
15168 | 81 def generator(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
82 yield b'%d\n' % length |
19009
07e40d589b64
largefiles: use filechunkiter for iterating largefile when serving getlfile
Mads Kiilerich <madski@unity3d.com>
parents:
19006
diff
changeset
|
83 for chunk in util.filechunkiter(f): |
15168 | 84 yield chunk |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
85 |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36656
diff
changeset
|
86 return wireprototypes.streamreslegacy(gen=generator()) |
15168 | 87 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
88 |
15168 | 89 def statlfile(repo, proto, sha): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
90 """Server command for checking if a largefile is present - returns '2\n' if |
28576
33bd95443e7f
largefiles: add some docstrings
Mads Kiilerich <madski@unity3d.com>
parents:
26825
diff
changeset
|
91 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
|
92 |
a977b42df8b3
largefiles: don't verify largefile hashes on servers when processing statlfile
Mads Kiilerich <madski@unity3d.com>
parents:
18298
diff
changeset
|
93 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
|
94 to be verified on every stat and must be caught be running 'hg verify' |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
95 server side.""" |
15168 | 96 filename = lfutil.findfile(repo, sha) |
97 if not filename: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
98 return wireprototypes.bytesresponse(b'2\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
99 return wireprototypes.bytesresponse(b'0\n') |
15168 | 100 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
101 |
15168 | 102 def wirereposetup(ui, repo): |
46200
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
103 orig_commandexecutor = repo.commandexecutor |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
104 |
15168 | 105 class lfileswirerepository(repo.__class__): |
46200
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
106 def commandexecutor(self): |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
107 executor = orig_commandexecutor() |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
108 if self.capable(b'largefiles'): |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
109 orig_callcommand = executor.callcommand |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
110 |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
111 class lfscommandexecutor(executor.__class__): |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
112 def callcommand(self, command, args): |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
113 if command == b'heads': |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
114 command = b'lheads' |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
115 return orig_callcommand(command, args) |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
116 |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
117 executor.__class__ = lfscommandexecutor |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
118 return executor |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
119 |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
120 @wireprotov1peer.batchable |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
121 def lheads(self): |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
122 return self.heads.batchable(self) |
bd31462a86a2
largefiles: redo heads interception
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
123 |
15168 | 124 def putlfile(self, sha, fd): |
125 # unfortunately, httprepository._callpush tries to convert its | |
126 # input file-like into a bundle before sending it, so we can't use | |
127 # it ... | |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17127
diff
changeset
|
128 if issubclass(self.__class__, httppeer.httppeer): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
129 res = self._call( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
130 b'putlfile', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
131 data=fd, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
132 sha=sha, |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43085
diff
changeset
|
133 headers={'content-type': 'application/mercurial-0.1'}, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
134 ) |
15168 | 135 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
136 d, output = res.split(b'\n', 1) |
15778
f15c646bffc7
largefiles: display remote errors from putlfile (issue3123) (issue3149)
Kevin Gessner <kevin@fogcreek.com>
parents:
15391
diff
changeset
|
137 for l in output.splitlines(True): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
138 self.ui.warn(_(b'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
|
139 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
|
140 except ValueError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
141 self.ui.warn(_(b'unexpected putlfile response: %r\n') % res) |
15168 | 142 return 1 |
143 # ... but we can't use sshrepository._call because the data= | |
144 # argument won't get sent, and _callpush does exactly what we want | |
145 # in this case: send the data straight through | |
146 else: | |
147 try: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
148 ret, output = self._callpush(b"putlfile", fd, sha=sha) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
149 if ret == b"": |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
150 raise error.ResponseError( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
151 _(b'putlfile failed:'), output |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
152 ) |
15168 | 153 return int(ret) |
154 except IOError: | |
155 return 1 | |
156 except ValueError: | |
157 raise error.ResponseError( | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
158 _(b'putlfile failed (unexpected response):'), ret |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
159 ) |
15168 | 160 |
161 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
|
162 """returns an iterable with the chunks of the file with sha sha""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
163 stream = self._callstream(b"getlfile", sha=sha) |
15168 | 164 length = stream.readline() |
165 try: | |
166 length = int(length) | |
167 except ValueError: | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
168 self._abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 error.ResponseError(_(b"unexpected response:"), length) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
170 ) |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
18922
diff
changeset
|
171 |
19005
1b84047e7d16
largefiles: drop limitreader, use filechunkiter limit
Mads Kiilerich <madski@unity3d.com>
parents:
19004
diff
changeset
|
172 # 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
|
173 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
|
174 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
|
175 # 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
|
176 # 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
|
177 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
|
178 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
|
179 if chunk: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
180 self._abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
181 error.ResponseError(_(b"unexpected response:"), chunk) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
182 ) |
15168 | 183 |
37614
a81d02ea65db
wireproto: move version 1 peer functionality to standalone module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37484
diff
changeset
|
184 @wireprotov1peer.batchable |
15168 | 185 def statlfile(self, sha): |
47873
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
186 def decode(d): |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
187 try: |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
188 return int(d) |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
189 except (ValueError, urlerr.httperror): |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
190 # If the server returns anything but an integer followed by a |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
191 # newline, newline, it's not speaking our language; if we get |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
192 # an HTTP error, we can't be sure the largefile is present; |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
193 # either way, consider it missing. |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
194 return 2 |
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
195 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 result = {b'sha': sha} |
47873
c424ff4807e6
wireprotov1peer: update all rpcs to use the new batchable scheme
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
46232
diff
changeset
|
197 return result, decode |
15168 | 198 |
199 repo.__class__ = lfileswirerepository | |
200 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
201 |
15168 | 202 # advertise the largefiles=serve capability |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 @eh.wrapfunction(wireprotov1server, b'_capabilities') |
35507
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
204 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
|
205 '''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
|
206 caps = orig(repo, proto) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
207 caps.append(b'largefiles=serve') |
35507
95a9be56c3bb
largefiles: modernize how capabilities are added to the wire protocol
Matt Harbison <matt_harbison@yahoo.com>
parents:
35348
diff
changeset
|
208 return caps |
15168 | 209 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41062
diff
changeset
|
210 |
37484
c22fd3c4c23e
largefiles: wrap heads command handler more directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37414
diff
changeset
|
211 def heads(orig, repo, proto): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
212 """Wrap server command - largefile capable clients will know to call |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43506
diff
changeset
|
213 lheads instead""" |
15168 | 214 if lfutil.islfilesrepo(repo): |
37293
d5d665f6615a
wireproto: stop aliasing wire protocol types (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36656
diff
changeset
|
215 return wireprototypes.ooberror(LARGEFILES_REQUIRED_MSG) |
37484
c22fd3c4c23e
largefiles: wrap heads command handler more directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37414
diff
changeset
|
216 |
c22fd3c4c23e
largefiles: wrap heads command handler more directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37414
diff
changeset
|
217 return orig(repo, proto) |