Mercurial > hg
annotate hgext/largefiles/remotestore.py @ 20858:bc56ec9e64df stable
hg: introduce "wirepeersetupfuncs" to setup wire peer by extensions (issue4109)
Since changeset 6f72e7d28b35, "reposetup()" of each extensions is
invoked only on repositories enabling corresponded extensions.
This causes that largefiles specific interactions between the
repository enabling largefiles locally and remote (wire) peer fail,
because there is no way to know whether largefiles is enabled on the
remote repository behind the wire peer, and largefiles specific
"wireproto functions" are not given to any wire peers.
To avoid this problem, largefiles should be enabled in wider scope
than each repositories (e.g. user-wide "${HOME}/.hgrc").
This patch introduces "wirepeersetupfuncs" to setup wire peer by
extensions already enabled. Functions registered into
"wirepeersetupfuncs" are invoked for all wire peers.
This patch uses plain list instead of "util.hooks" for
"wirepeersetupfuncs", because the former allows to control order of
function invocation by order of extension enabling: it may be useful
for workaround of problems with combination of enabled extensions
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Sat, 29 Mar 2014 01:20:07 +0900 |
parents | cce7ab960312 |
children | a61ed1c2d7a7 |
rev | line source |
---|---|
15168 | 1 # Copyright 2010-2011 Fog Creek Software |
2 # Copyright 2010-2011 Unity Technologies | |
3 # | |
4 # This software may be used and distributed according to the terms of the | |
5 # GNU General Public License version 2 or any later version. | |
6 | |
17425
e95ec38f86b0
fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents:
17127
diff
changeset
|
7 '''remote largefile store; the base class for wirestore''' |
15168 | 8 |
9 import urllib2 | |
10 | |
11 from mercurial import util | |
12 from mercurial.i18n import _ | |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
13 from mercurial.wireproto import remotebatch |
15168 | 14 |
15 import lfutil | |
16 import basestore | |
17 | |
18 class remotestore(basestore.basestore): | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15188
diff
changeset
|
19 '''a largefile store accessed over a network''' |
15168 | 20 def __init__(self, ui, repo, url): |
21 super(remotestore, self).__init__(ui, repo, url) | |
22 | |
23 def put(self, source, hash): | |
24 if self.sendfile(source, hash): | |
25 raise util.Abort( | |
26 _('remotestore: could not put %s to remote store %s') | |
19950
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
27 % (source, util.hidepassword(self.url))) |
15168 | 28 self.ui.debug( |
19950
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
29 _('remotestore: put %s to remote store %s\n') |
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
30 % (source, util.hidepassword(self.url))) |
15168 | 31 |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
32 def exists(self, hashes): |
18573
003730ca254d
largefiles: fold oddly named _verify into remotestore.exists
Mads Kiilerich <mads@kiilerich.com>
parents:
18484
diff
changeset
|
33 return dict((h, s == 0) for (h, s) in self._stat(hashes).iteritems()) |
15168 | 34 |
35 def sendfile(self, filename, hash): | |
36 self.ui.debug('remotestore: sendfile(%s, %s)\n' % (filename, hash)) | |
37 fd = None | |
38 try: | |
39 try: | |
40 fd = lfutil.httpsendfile(self.ui, filename) | |
41 except IOError, e: | |
42 raise util.Abort( | |
43 _('remotestore: could not open file %s: %s') | |
44 % (filename, str(e))) | |
45 return self._put(hash, fd) | |
46 finally: | |
47 if fd: | |
48 fd.close() | |
49 | |
50 def _getfile(self, tmpfile, filename, hash): | |
51 try: | |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
19003
diff
changeset
|
52 chunks = self._get(hash) |
15188
8e115063950d
largefiles: don't break existing tests (syntax error, bad imports)
Greg Ward <greg@gerg.ca>
parents:
15168
diff
changeset
|
53 except urllib2.HTTPError, e: |
15168 | 54 # 401s get converted to util.Aborts; everything else is fine being |
55 # turned into a StoreError | |
56 raise basestore.StoreError(filename, hash, self.url, str(e)) | |
57 except urllib2.URLError, e: | |
58 # This usually indicates a connection problem, so don't | |
59 # keep trying with the other files... they will probably | |
60 # all fail too. | |
19950
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
61 raise util.Abort('%s: %s' % |
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
62 (util.hidepassword(self.url), e.reason)) |
15168 | 63 except IOError, e: |
64 raise basestore.StoreError(filename, hash, self.url, str(e)) | |
65 | |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
19003
diff
changeset
|
66 return lfutil.copyandhash(chunks, tmpfile) |
15168 | 67 |
68 def _verifyfile(self, cctx, cset, contents, standin, verified): | |
69 filename = lfutil.splitstandin(standin) | |
70 if not filename: | |
71 return False | |
72 fctx = cctx[standin] | |
73 key = (filename, fctx.filenode()) | |
74 if key in verified: | |
75 return False | |
76 | |
77 verified.add(key) | |
78 | |
18482
6f219eb83435
largefiles: adapt verify to batched remote statlfile (issue3780)
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
79 expecthash = fctx.data()[0:40] |
6f219eb83435
largefiles: adapt verify to batched remote statlfile (issue3780)
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
80 stat = self._stat([expecthash])[expecthash] |
15168 | 81 if not stat: |
82 return False | |
83 elif stat == 1: | |
84 self.ui.warn( | |
85 _('changeset %s: %s: contents differ\n') | |
86 % (cset, filename)) | |
87 return True # failed | |
88 elif stat == 2: | |
89 self.ui.warn( | |
90 _('changeset %s: %s missing\n') | |
91 % (cset, filename)) | |
92 return True # failed | |
93 else: | |
15253
67d010779907
largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
94 raise RuntimeError('verify failed: unexpected response from ' |
67d010779907
largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
95 'statlfile (%r)' % stat) |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
96 |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
97 def batch(self): |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
98 '''Support for remote batching.''' |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
99 return remotebatch(self) |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
100 |