Mercurial > hg
annotate hgext/largefiles/remotestore.py @ 27171:3028ea0aff46
histedit: mention histedit-last-edit.txt on abort
Users may spend a lot of effort writing histedit rules,
getting an abort without being told they can recover their work
is very frustrating.
Avoid that by telling them where to find their work.
author | timeless <timeless@mozdev.org> |
---|---|
date | Wed, 02 Dec 2015 08:07:36 +0000 |
parents | 56b2bcea2529 |
children | 3be2e89c5d9f |
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 | |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
11 from mercurial import util, wireproto, error |
15168 | 12 from mercurial.i18n import _ |
13 | |
14 import lfutil | |
15 import basestore | |
16 | |
17 class remotestore(basestore.basestore): | |
15252
6e809bb4f969
largefiles: improve comments, internal docstrings
Greg Ward <greg@gerg.ca>
parents:
15188
diff
changeset
|
18 '''a largefile store accessed over a network''' |
15168 | 19 def __init__(self, ui, repo, url): |
20 super(remotestore, self).__init__(ui, repo, url) | |
21 | |
22 def put(self, source, hash): | |
23 if self.sendfile(source, hash): | |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
24 raise error.Abort( |
15168 | 25 _('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
|
26 % (source, util.hidepassword(self.url))) |
15168 | 27 self.ui.debug( |
19950
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
28 _('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
|
29 % (source, util.hidepassword(self.url))) |
15168 | 30 |
17127
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
31 def exists(self, hashes): |
20688
a61ed1c2d7a7
check-code: disallow use of dict(key=value) construction
Augie Fackler <raf@durin42.com>
parents:
19950
diff
changeset
|
32 return dict((h, s == 0) for (h, s) in # dict-from-generator |
a61ed1c2d7a7
check-code: disallow use of dict(key=value) construction
Augie Fackler <raf@durin42.com>
parents:
19950
diff
changeset
|
33 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: | |
25079
bee00e0c2e45
largefiles: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
21084
diff
changeset
|
39 fd = lfutil.httpsendfile(self.ui, filename) |
15168 | 40 return self._put(hash, fd) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25079
diff
changeset
|
41 except IOError as e: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
42 raise error.Abort( |
25079
bee00e0c2e45
largefiles: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
21084
diff
changeset
|
43 _('remotestore: could not open file %s: %s') |
bee00e0c2e45
largefiles: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
21084
diff
changeset
|
44 % (filename, str(e))) |
15168 | 45 finally: |
46 if fd: | |
47 fd.close() | |
48 | |
49 def _getfile(self, tmpfile, filename, hash): | |
50 try: | |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
19003
diff
changeset
|
51 chunks = self._get(hash) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25079
diff
changeset
|
52 except urllib2.HTTPError as e: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
53 # 401s get converted to error.Aborts; everything else is fine being |
15168 | 54 # turned into a StoreError |
55 raise basestore.StoreError(filename, hash, self.url, str(e)) | |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25079
diff
changeset
|
56 except urllib2.URLError as e: |
15168 | 57 # This usually indicates a connection problem, so don't |
58 # keep trying with the other files... they will probably | |
59 # all fail too. | |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
60 raise error.Abort('%s: %s' % |
19950
cce7ab960312
largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents:
19948
diff
changeset
|
61 (util.hidepassword(self.url), e.reason)) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25079
diff
changeset
|
62 except IOError as e: |
15168 | 63 raise basestore.StoreError(filename, hash, self.url, str(e)) |
64 | |
19004
6614e5e24e66
largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents:
19003
diff
changeset
|
65 return lfutil.copyandhash(chunks, tmpfile) |
15168 | 66 |
67 def _verifyfile(self, cctx, cset, contents, standin, verified): | |
68 filename = lfutil.splitstandin(standin) | |
69 if not filename: | |
70 return False | |
71 fctx = cctx[standin] | |
72 key = (filename, fctx.filenode()) | |
73 if key in verified: | |
74 return False | |
75 | |
76 verified.add(key) | |
77 | |
18482
6f219eb83435
largefiles: adapt verify to batched remote statlfile (issue3780)
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
78 expecthash = fctx.data()[0:40] |
6f219eb83435
largefiles: adapt verify to batched remote statlfile (issue3780)
Mads Kiilerich <madski@unity3d.com>
parents:
18481
diff
changeset
|
79 stat = self._stat([expecthash])[expecthash] |
15168 | 80 if not stat: |
81 return False | |
82 elif stat == 1: | |
83 self.ui.warn( | |
84 _('changeset %s: %s: contents differ\n') | |
85 % (cset, filename)) | |
86 return True # failed | |
87 elif stat == 2: | |
88 self.ui.warn( | |
89 _('changeset %s: %s missing\n') | |
90 % (cset, filename)) | |
91 return True # failed | |
92 else: | |
15253
67d010779907
largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
93 raise RuntimeError('verify failed: unexpected response from ' |
67d010779907
largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents:
15252
diff
changeset
|
94 '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
|
95 |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
96 def batch(self): |
9e1616307c4c
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents:
15253
diff
changeset
|
97 '''Support for remote batching.''' |
21084
70252bdfd39c
largefiles: import whole modules instead of importing parts of them
Mads Kiilerich <madski@unity3d.com>
parents:
20688
diff
changeset
|
98 return wireproto.remotebatch(self) |