storefactory.py
96 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
liscju
|
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 _ | ||||
Gregory Szorc
|
r43359 | from mercurial.pycompat import getattr | ||
liscju
|
r29305 | from mercurial import ( | ||
error, | ||||
hg, | ||||
util, | ||||
) | ||||
r47669 | from mercurial.utils import ( | |||
urlutil, | ||||
) | ||||
liscju
|
r29305 | |||
from . import ( | ||||
lfutil, | ||||
localstore, | ||||
wirestore, | ||||
) | ||||
r47709 | ||||
liscju
|
r29305 | # 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. | ||||
Boris Feld
|
r35580 | def openstore(repo=None, remote=None, put=False, ui=None): | ||
if ui is None: | ||||
ui = repo.ui | ||||
liscju
|
r29305 | |||
if not remote: | ||||
lfpullsource = getattr(repo, 'lfpullsource', None) | ||||
r47709 | if put: | |||
path = urlutil.get_unique_push_path( | ||||
b'lfpullsource', repo, ui, lfpullsource | ||||
) | ||||
liscju
|
r29305 | else: | ||
r47709 | path, _branches = urlutil.get_unique_pull_path( | |||
b'lfpullsource', repo, ui, lfpullsource | ||||
) | ||||
liscju
|
r29305 | |||
r47709 | # 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. | ||||
Boris Feld
|
r35580 | if repo is None: | ||
r47709 | path, _branches = urlutil.get_unique_pull_path( | |||
b'lfs', repo, ui, b'default' | ||||
) | ||||
Boris Feld
|
r35580 | remote = hg.peer(repo or ui, {}, path) | ||
Augie Fackler
|
r43347 | elif path == b'default-push' or path == b'default': | ||
liscju
|
r29305 | remote = repo | ||
else: | ||||
r47670 | path, _branches = urlutil.parseurl(path) | |||
Boris Feld
|
r35580 | remote = hg.peer(repo or ui, {}, path) | ||
liscju
|
r29305 | |||
# The path could be a scheme so use Mercurial's normal functionality | ||||
# to resolve the scheme to a repository and use its path | ||||
Augie Fackler
|
r43347 | path = util.safehasattr(remote, b'url') and remote.url() or remote.path | ||
liscju
|
r29305 | |||
match = _scheme_re.match(path) | ||||
Augie Fackler
|
r43346 | if not match: # regular filesystem path | ||
Augie Fackler
|
r43347 | scheme = b'file' | ||
liscju
|
r29305 | else: | ||
scheme = match.group(1) | ||||
try: | ||||
storeproviders = _storeprovider[scheme] | ||||
except KeyError: | ||||
Augie Fackler
|
r43347 | raise error.Abort(_(b'unsupported URL scheme %r') % scheme) | ||
liscju
|
r29305 | |||
for classobj in storeproviders: | ||||
try: | ||||
return classobj(ui, repo, remote) | ||||
except lfutil.storeprotonotcapable: | ||||
pass | ||||
Augie Fackler
|
r43346 | raise error.Abort( | ||
Augie Fackler
|
r43347 | _(b'%s does not appear to be a largefile store') | ||
r47669 | % urlutil.hidepassword(path) | |||
Augie Fackler
|
r43346 | ) | ||
liscju
|
r29305 | |||
_storeprovider = { | ||||
Augie Fackler
|
r43347 | b'file': [localstore.localstore], | ||
b'http': [wirestore.wirestore], | ||||
b'https': [wirestore.wirestore], | ||||
b'ssh': [wirestore.wirestore], | ||||
Augie Fackler
|
r43346 | } | ||
liscju
|
r29305 | |||
Augie Fackler
|
r36328 | _scheme_re = re.compile(br'^([a-zA-Z0-9+-.]+)://') | ||
Boris Feld
|
r35580 | |||
Augie Fackler
|
r43346 | |||
Boris Feld
|
r35580 | def getlfile(ui, hash): | ||
return util.chunkbuffer(openstore(ui=ui)._get(hash)) | ||||