##// END OF EJS Templates
dirstate: pass the repo to the `changeparent` method...
dirstate: pass the repo to the `changeparent` method If we want the context to be responsible for writing (and we want it), we need to have access to a localrepository object. So we now requires a localrepository object as an argument to this context manager.

File last commit:

r50628:8d0a220c default
r50854:c166b212 default
Show More
storefactory.py
96 lines | 2.6 KiB | text/x-python | PythonLexer
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import re
from mercurial.i18n import _
from mercurial.pycompat import getattr
from mercurial import (
error,
hg,
util,
)
from mercurial.utils import (
urlutil,
)
from . import (
lfutil,
localstore,
wirestore,
)
# During clone this function is passed the src's ui object
# but it needs the dest's ui object so it can read out of
# the config file. Use repo.ui instead.
def openstore(repo=None, remote=None, put=False, ui=None):
if ui is None:
ui = repo.ui
if not remote:
lfpullsource = getattr(repo, 'lfpullsource', None)
if put:
path = urlutil.get_unique_push_path(
b'lfpullsource', repo, ui, lfpullsource
)
else:
path = urlutil.get_unique_pull_path_obj(
b'lfpullsource', ui, lfpullsource
)
# XXX we should not explicitly pass b'default', as this will result in
# b'default' being returned if no `paths.default` was defined. We
# should explicitely handle the lack of value instead.
if repo is None:
path = urlutil.get_unique_pull_path_obj(
b'lfs',
ui,
b'default',
)
remote = hg.peer(repo or ui, {}, path)
elif path.loc == b'default-push' or path.loc == b'default':
remote = repo
else:
remote = hg.peer(repo or ui, {}, path)
# The path could be a scheme so use Mercurial's normal functionality
# to resolve the scheme to a repository and use its path
path = util.safehasattr(remote, b'url') and remote.url() or remote.path
match = _scheme_re.match(path)
if not match: # regular filesystem path
scheme = b'file'
else:
scheme = match.group(1)
try:
storeproviders = _storeprovider[scheme]
except KeyError:
raise error.Abort(_(b'unsupported URL scheme %r') % scheme)
for classobj in storeproviders:
try:
return classobj(ui, repo, remote)
except lfutil.storeprotonotcapable:
pass
raise error.Abort(
_(b'%s does not appear to be a largefile store')
% urlutil.hidepassword(path)
)
_storeprovider = {
b'file': [localstore.localstore],
b'http': [wirestore.wirestore],
b'https': [wirestore.wirestore],
b'ssh': [wirestore.wirestore],
}
_scheme_re = re.compile(br'^([a-zA-Z0-9+-.]+)://')
def getlfile(ui, hash):
return util.chunkbuffer(openstore(ui=ui)._get(hash))