storefactory.py
92 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
|
r29305 | # This software may be used and distributed according to the terms of the | ||
# GNU General Public License version 2 or any later version. | ||||
from __future__ import absolute_import | ||||
import re | ||||
from mercurial.i18n import _ | ||||
|
r43359 | from mercurial.pycompat import getattr | ||
|
r29305 | from mercurial import ( | ||
error, | ||||
hg, | ||||
util, | ||||
) | ||||
r47669 | from mercurial.utils import ( | |||
urlutil, | ||||
) | ||||
|
r29305 | |||
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. | ||||
|
r35580 | def openstore(repo=None, remote=None, put=False, ui=None): | ||
if ui is None: | ||||
ui = repo.ui | ||||
|
r29305 | |||
if not remote: | ||||
lfpullsource = getattr(repo, 'lfpullsource', None) | ||||
if lfpullsource: | ||||
path = ui.expandpath(lfpullsource) | ||||
elif put: | ||||
|
r43347 | path = ui.expandpath(b'default-push', b'default') | ||
|
r29305 | else: | ||
|
r43347 | path = ui.expandpath(b'default') | ||
|
r29305 | |||
# ui.expandpath() leaves 'default-push' and 'default' alone if | ||||
# they cannot be expanded: fallback to the empty string, | ||||
# meaning the current directory. | ||||
|
r35580 | if repo is None: | ||
|
r43347 | path = ui.expandpath(b'default') | ||
r47670 | path, _branches = urlutil.parseurl(path) | |||
|
r35580 | remote = hg.peer(repo or ui, {}, path) | ||
|
r43347 | elif path == b'default-push' or path == b'default': | ||
|
r29305 | remote = repo | ||
else: | ||||
r47670 | path, _branches = urlutil.parseurl(path) | |||
|
r35580 | remote = hg.peer(repo or ui, {}, path) | ||
|
r29305 | |||
# The path could be a scheme so use Mercurial's normal functionality | ||||
# to resolve the scheme to a repository and use its path | ||||
|
r43347 | path = util.safehasattr(remote, b'url') and remote.url() or remote.path | ||
|
r29305 | |||
match = _scheme_re.match(path) | ||||
|
r43346 | if not match: # regular filesystem path | ||
|
r43347 | scheme = b'file' | ||
|
r29305 | else: | ||
scheme = match.group(1) | ||||
try: | ||||
storeproviders = _storeprovider[scheme] | ||||
except KeyError: | ||||
|
r43347 | raise error.Abort(_(b'unsupported URL scheme %r') % scheme) | ||
|
r29305 | |||
for classobj in storeproviders: | ||||
try: | ||||
return classobj(ui, repo, remote) | ||||
except lfutil.storeprotonotcapable: | ||||
pass | ||||
|
r43346 | raise error.Abort( | ||
|
r43347 | _(b'%s does not appear to be a largefile store') | ||
r47669 | % urlutil.hidepassword(path) | |||
|
r43346 | ) | ||
|
r29305 | |||
_storeprovider = { | ||||
|
r43347 | b'file': [localstore.localstore], | ||
b'http': [wirestore.wirestore], | ||||
b'https': [wirestore.wirestore], | ||||
b'ssh': [wirestore.wirestore], | ||||
|
r43346 | } | ||
|
r29305 | |||
|
r36328 | _scheme_re = re.compile(br'^([a-zA-Z0-9+-.]+)://') | ||
|
r35580 | |||
|
r43346 | |||
|
r35580 | def getlfile(ui, hash): | ||
return util.chunkbuffer(openstore(ui=ui)._get(hash)) | ||||