Mercurial > hg
annotate hgext/largefiles/wirestore.py @ 38707:6b5ca1d0aa1e
obsolete: store user name and note in UTF-8 (issue5754) (BC)
Before, user names were stored in local encoding and transferred across
repositories, which made it impossible to restore non-ASCII user names on
different platforms. This patch fixes new markers to be encoded in UTF-8
and decoded back to local encoding when displaying. Existing markers are
unfixable so they may result in mojibake.
I don't like the API that requires metadata dict to be UTF-8 encoded, which
is a source of bugs, but there's no abstraction layer to process the encoding
thingy efficiently. So we apply the same rule as extras dict to obsstore
metadata.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 15 Jul 2018 18:24:57 +0900 |
parents | 6c55ce51d6c3 |
children | 2372284d9457 |
rev | line source |
---|---|
15168 | 1 # Copyright 2010-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 | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15168
diff
changeset
|
6 '''largefile store working over Mercurial's wire protocol''' |
29316
28dfcf3d0ad3
py3: make largefiles/wirestore.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28439
diff
changeset
|
7 from __future__ import absolute_import |
15168 | 8 |
29316
28dfcf3d0ad3
py3: make largefiles/wirestore.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28439
diff
changeset
|
9 from . import ( |
28dfcf3d0ad3
py3: make largefiles/wirestore.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28439
diff
changeset
|
10 lfutil, |
28dfcf3d0ad3
py3: make largefiles/wirestore.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28439
diff
changeset
|
11 remotestore, |
28dfcf3d0ad3
py3: make largefiles/wirestore.py use absolute_import
liscju <piotr.listkiewicz@gmail.com>
parents:
28439
diff
changeset
|
12 ) |
15168 | 13 |
14 class wirestore(remotestore.remotestore): | |
15 def __init__(self, ui, repo, remote): | |
16 cap = remote.capable('largefiles') | |
17 if not cap: | |
18 raise lfutil.storeprotonotcapable([]) | |
19 storetypes = cap.split(',') | |
16686
67964cda8701
cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents:
15252
diff
changeset
|
20 if 'serve' not in storetypes: |
15168 | 21 raise lfutil.storeprotonotcapable(storetypes) |
22 self.remote = remote | |
23 super(wirestore, self).__init__(ui, repo, remote.url()) | |
24 | |
25 def _put(self, hash, fd): | |
26 return self.remote.putlfile(hash, fd) | |
27 | |
28 def _get(self, hash): | |
29 return self.remote.getlfile(hash) | |
30 | |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
16686
diff
changeset
|
31 def _stat(self, hashes): |
19008
9d33d6e0d442
largefiles: stat all largefiles in one batch before downloading
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
32 '''For each hash, return 0 if it is available, other values if not. |
9d33d6e0d442
largefiles: stat all largefiles in one batch before downloading
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
33 It is usually 2 if the largefile is missing, but might be 1 the server |
9d33d6e0d442
largefiles: stat all largefiles in one batch before downloading
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
34 has a corrupted copy.''' |
37632
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
35 |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
36 with self.remote.commandexecutor() as e: |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
37 fs = [] |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
38 for hash in hashes: |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
39 fs.append((hash, e.callcommand('statlfile', { |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
40 'sha': hash, |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
41 }))) |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
42 |
6c55ce51d6c3
largefiles: use command executor for batch operation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29316
diff
changeset
|
43 return {hash: f.result() for hash, f in fs} |