##// END OF EJS Templates
largefiles: delegate to the wrapped clone command...
largefiles: delegate to the wrapped clone command This allows the wrapped command's validation code to run (which is currently only to ensure 'noupdate' and 'updaterev' aren't both specified), the copy/pasted unpacking of hg.clone() args to be removed, and any future changes to the base command (however unlikely) to be inherited by largefiles. Unfortunately, the command override can't be swapped entirely for an hg.clone() override because the extra --all-largefiles arg needs to be injected. It also isn't enough to call the wrapped clone command and leave the caching code after it, because the file caching code needs access to the destination repo, which is only available from hg.clone(). An alternative would be to use the dest path in the clone command override to re-obtain a reference to the repo. A slight deviation from the regular hg.clone() function is that the repo is NOT deleted if the caching fails, but that was also the previous behavior. Maybe it should for consistency?

File last commit:

r17439:fbb732a8 merge default
r17601:6e2ab601 stable
Show More
localstore.py
86 lines | 2.9 KiB | text/x-python | PythonLexer
# Copyright 2009-2010 Gregory P. Ward
# Copyright 2009-2010 Intelerad Medical Systems Incorporated
# 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.
'''store class for local filesystem'''
import os
from mercurial import util
from mercurial.i18n import _
import lfutil
import basestore
class localstore(basestore.basestore):
'''localstore first attempts to grab files out of the store in the remote
Mercurial repository. Failling that, it attempts to grab the files from
the user cache.'''
def __init__(self, ui, repo, remote):
url = os.path.join(remote.local().path, '.hg', lfutil.longname)
super(localstore, self).__init__(ui, repo, util.expandpath(url))
self.remote = remote.local()
def put(self, source, hash):
util.makedirs(os.path.dirname(lfutil.storepath(self.remote, hash)))
if lfutil.instore(self.remote, hash):
return
lfutil.link(lfutil.storepath(self.repo, hash),
lfutil.storepath(self.remote, hash))
def exists(self, hashes):
retval = {}
for hash in hashes:
retval[hash] = lfutil.instore(self.remote, hash)
return retval
def _getfile(self, tmpfile, filename, hash):
if lfutil.instore(self.remote, hash):
path = lfutil.storepath(self.remote, hash)
elif lfutil.inusercache(self.ui, hash):
path = lfutil.usercachepath(self.ui, hash)
else:
raise basestore.StoreError(filename, hash, '',
_("can't get file locally"))
fd = open(path, 'rb')
try:
return lfutil.copyandhash(fd, tmpfile)
finally:
fd.close()
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
expecthash = fctx.data()[0:40]
verified.add(key)
if not lfutil.instore(self.remote, expecthash):
self.ui.warn(
_('changeset %s: %s missing\n'
' (looked for hash %s)\n')
% (cset, filename, expecthash))
return True # failed
if contents:
storepath = lfutil.storepath(self.remote, expecthash)
actualhash = lfutil.hashfile(storepath)
if actualhash != expecthash:
self.ui.warn(
_('changeset %s: %s: contents differ\n'
' (%s:\n'
' expected hash %s,\n'
' but got %s)\n')
% (cset, filename, storepath, expecthash, actualhash))
return True # failed
return False