annotate hgext/largefiles/remotestore.py @ 21042:32b3331f18eb

largefiles: centralize the logic to get outgoing largefiles Before this patch, "overrides.getoutgoinglfiles()" (called by "overrideoutgoing()" and "overridesummary()") and "lfilesrepo.push()" implement similar logic to get outgoing largefiles separately. This patch centralizes the logic to get outgoing largefiles in "lfutil.getlfilestoupload()". "lfutil.getlfilestoupload()" takes "addfunc" argument, because each callers need different information (and it is useful for enhancement in the future). - "overrides.getoutgoinglfiles()" needs only filenames - "lfilesrepo.push()" needs only hashes of largefiles
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Wed, 16 Apr 2014 00:37:24 +0900
parents a61ed1c2d7a7
children 70252bdfd39c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
1 # Copyright 2010-2011 Fog Creek Software
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
2 # Copyright 2010-2011 Unity Technologies
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
3 #
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
4 # This software may be used and distributed according to the terms of the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
5 # GNU General Public License version 2 or any later version.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
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
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
8
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
9 import urllib2
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
10
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
11 from mercurial import util
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
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
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
14
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
15 import lfutil
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
16 import basestore
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
17
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
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
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
20 def __init__(self, ui, repo, url):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
21 super(remotestore, self).__init__(ui, repo, url)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
22
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
23 def put(self, source, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
24 if self.sendfile(source, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
25 raise util.Abort(
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
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
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
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
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
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):
20688
a61ed1c2d7a7 check-code: disallow use of dict(key=value) construction
Augie Fackler <raf@durin42.com>
parents: 19950
diff changeset
33 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
34 self._stat(hashes).iteritems())
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
35
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
36 def sendfile(self, filename, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
37 self.ui.debug('remotestore: sendfile(%s, %s)\n' % (filename, hash))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
38 fd = None
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
39 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
40 try:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
41 fd = lfutil.httpsendfile(self.ui, filename)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
42 except IOError, e:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
43 raise util.Abort(
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
44 _('remotestore: could not open file %s: %s')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
45 % (filename, str(e)))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
46 return self._put(hash, fd)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
47 finally:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
48 if fd:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
49 fd.close()
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
50
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
51 def _getfile(self, tmpfile, filename, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
52 try:
19004
6614e5e24e66 largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents: 19003
diff changeset
53 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
54 except urllib2.HTTPError, e:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
55 # 401s get converted to util.Aborts; everything else is fine being
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
56 # turned into a StoreError
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
57 raise basestore.StoreError(filename, hash, self.url, str(e))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
58 except urllib2.URLError, e:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
59 # This usually indicates a connection problem, so don't
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
60 # keep trying with the other files... they will probably
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
61 # all fail too.
19950
cce7ab960312 largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents: 19948
diff changeset
62 raise util.Abort('%s: %s' %
cce7ab960312 largefiles: hide passwords in URLs in ui messages
Mads Kiilerich <madski@unity3d.com>
parents: 19948
diff changeset
63 (util.hidepassword(self.url), e.reason))
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
64 except IOError, e:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
65 raise basestore.StoreError(filename, hash, self.url, str(e))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
66
19004
6614e5e24e66 largefiles: move protocol conversion into getlfile and make it an iterable
Mads Kiilerich <madski@unity3d.com>
parents: 19003
diff changeset
67 return lfutil.copyandhash(chunks, tmpfile)
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
68
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
69 def _verifyfile(self, cctx, cset, contents, standin, verified):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
70 filename = lfutil.splitstandin(standin)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
71 if not filename:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
72 return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
73 fctx = cctx[standin]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
74 key = (filename, fctx.filenode())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
75 if key in verified:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
76 return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
77
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
78 verified.add(key)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
79
18482
6f219eb83435 largefiles: adapt verify to batched remote statlfile (issue3780)
Mads Kiilerich <madski@unity3d.com>
parents: 18481
diff changeset
80 expecthash = fctx.data()[0:40]
6f219eb83435 largefiles: adapt verify to batched remote statlfile (issue3780)
Mads Kiilerich <madski@unity3d.com>
parents: 18481
diff changeset
81 stat = self._stat([expecthash])[expecthash]
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
82 if not stat:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
83 return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
84 elif stat == 1:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
85 self.ui.warn(
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
86 _('changeset %s: %s: contents differ\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
87 % (cset, filename))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
88 return True # failed
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
89 elif stat == 2:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
90 self.ui.warn(
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
91 _('changeset %s: %s missing\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
92 % (cset, filename))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
93 return True # failed
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
94 else:
15253
67d010779907 largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
95 raise RuntimeError('verify failed: unexpected response from '
67d010779907 largefiles: improve error reporting
Greg Ward <greg@gerg.ca>
parents: 15252
diff changeset
96 '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
97
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15253
diff changeset
98 def batch(self):
9e1616307c4c largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)
Na'Tosha Bard <natosha@unity3d.com>
parents: 15253
diff changeset
99 '''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
100 return remotebatch(self)