##// END OF EJS Templates
factotum: use try/except/finally
factotum: use try/except/finally

File last commit:

r21084:70252bdf default
r25078:e8348f1c default
Show More
remotestore.py
99 lines | 3.4 KiB | text/x-python | PythonLexer
various
hgext: add largefiles extension...
r15168 # Copyright 2010-2011 Fog Creek Software
# Copyright 2010-2011 Unity Technologies
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Mads Kiilerich
fix wording and not-completely-trivial spelling errors and bad docstrings
r17425 '''remote largefile store; the base class for wirestore'''
various
hgext: add largefiles extension...
r15168
import urllib2
Mads Kiilerich
largefiles: import whole modules instead of importing parts of them...
r21084 from mercurial import util, wireproto
various
hgext: add largefiles extension...
r15168 from mercurial.i18n import _
import lfutil
import basestore
class remotestore(basestore.basestore):
Greg Ward
largefiles: improve comments, internal docstrings...
r15252 '''a largefile store accessed over a network'''
various
hgext: add largefiles extension...
r15168 def __init__(self, ui, repo, url):
super(remotestore, self).__init__(ui, repo, url)
def put(self, source, hash):
if self.sendfile(source, hash):
raise util.Abort(
_('remotestore: could not put %s to remote store %s')
Mads Kiilerich
largefiles: hide passwords in URLs in ui messages
r19950 % (source, util.hidepassword(self.url)))
various
hgext: add largefiles extension...
r15168 self.ui.debug(
Mads Kiilerich
largefiles: hide passwords in URLs in ui messages
r19950 _('remotestore: put %s to remote store %s\n')
% (source, util.hidepassword(self.url)))
various
hgext: add largefiles extension...
r15168
Na'Tosha Bard
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)...
r17127 def exists(self, hashes):
Augie Fackler
check-code: disallow use of dict(key=value) construction...
r20688 return dict((h, s == 0) for (h, s) in # dict-from-generator
self._stat(hashes).iteritems())
various
hgext: add largefiles extension...
r15168
def sendfile(self, filename, hash):
self.ui.debug('remotestore: sendfile(%s, %s)\n' % (filename, hash))
fd = None
try:
try:
fd = lfutil.httpsendfile(self.ui, filename)
except IOError, e:
raise util.Abort(
_('remotestore: could not open file %s: %s')
% (filename, str(e)))
return self._put(hash, fd)
finally:
if fd:
fd.close()
def _getfile(self, tmpfile, filename, hash):
try:
Mads Kiilerich
largefiles: move protocol conversion into getlfile and make it an iterable...
r19004 chunks = self._get(hash)
Greg Ward
largefiles: don't break existing tests (syntax error, bad imports)
r15188 except urllib2.HTTPError, e:
various
hgext: add largefiles extension...
r15168 # 401s get converted to util.Aborts; everything else is fine being
# turned into a StoreError
raise basestore.StoreError(filename, hash, self.url, str(e))
except urllib2.URLError, e:
# This usually indicates a connection problem, so don't
# keep trying with the other files... they will probably
# all fail too.
Mads Kiilerich
largefiles: hide passwords in URLs in ui messages
r19950 raise util.Abort('%s: %s' %
(util.hidepassword(self.url), e.reason))
various
hgext: add largefiles extension...
r15168 except IOError, e:
raise basestore.StoreError(filename, hash, self.url, str(e))
Mads Kiilerich
largefiles: move protocol conversion into getlfile and make it an iterable...
r19004 return lfutil.copyandhash(chunks, tmpfile)
various
hgext: add largefiles extension...
r15168
def _verifyfile(self, cctx, cset, contents, standin, verified):
filename = lfutil.splitstandin(standin)
if not filename:
return False
fctx = cctx[standin]
key = (filename, fctx.filenode())
if key in verified:
return False
verified.add(key)
Mads Kiilerich
largefiles: adapt verify to batched remote statlfile (issue3780)...
r18482 expecthash = fctx.data()[0:40]
stat = self._stat([expecthash])[expecthash]
various
hgext: add largefiles extension...
r15168 if not stat:
return False
elif stat == 1:
self.ui.warn(
_('changeset %s: %s: contents differ\n')
% (cset, filename))
return True # failed
elif stat == 2:
self.ui.warn(
_('changeset %s: %s missing\n')
% (cset, filename))
return True # failed
else:
Greg Ward
largefiles: improve error reporting...
r15253 raise RuntimeError('verify failed: unexpected response from '
'statlfile (%r)' % stat)
Na'Tosha Bard
largefiles: batch statlfile requests when pushing a largefiles repo (issue3386)...
r17127
def batch(self):
'''Support for remote batching.'''
Mads Kiilerich
largefiles: import whole modules instead of importing parts of them...
r21084 return wireproto.remotebatch(self)