##// END OF EJS Templates
Added signature for changeset a50fecefa691
Added signature for changeset a50fecefa691

File last commit:

r43359:c59eb156 default
r44231:743c69b3 stable
Show More
storefactory.py
89 lines | 2.5 KiB | text/x-python | PythonLexer
liscju
largefiles: move basestore._openstore into new module to remove cycle
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
py3: manually import getattr where it is needed...
r43359 from mercurial.pycompat import getattr
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305 from mercurial import (
error,
hg,
util,
)
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.
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 def openstore(repo=None, remote=None, put=False, ui=None):
if ui is None:
ui = repo.ui
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
if not remote:
lfpullsource = getattr(repo, 'lfpullsource', None)
if lfpullsource:
path = ui.expandpath(lfpullsource)
elif put:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 path = ui.expandpath(b'default-push', b'default')
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 path = ui.expandpath(b'default')
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
# ui.expandpath() leaves 'default-push' and 'default' alone if
# they cannot be expanded: fallback to the empty string,
# meaning the current directory.
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 if repo is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 path = ui.expandpath(b'default')
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 path, _branches = hg.parseurl(path)
remote = hg.peer(repo or ui, {}, path)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif path == b'default-push' or path == b'default':
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305 remote = repo
else:
path, _branches = hg.parseurl(path)
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 remote = hg.peer(repo or ui, {}, path)
liscju
largefiles: move basestore._openstore into new module to remove cycle
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
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 path = util.safehasattr(remote, b'url') and remote.url() or remote.path
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
match = _scheme_re.match(path)
Augie Fackler
formatting: blacken the codebase...
r43346 if not match: # regular filesystem path
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 scheme = b'file'
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305 else:
scheme = match.group(1)
try:
storeproviders = _storeprovider[scheme]
except KeyError:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'unsupported URL scheme %r') % scheme)
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
for classobj in storeproviders:
try:
return classobj(ui, repo, remote)
except lfutil.storeprotonotcapable:
pass
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'%s does not appear to be a largefile store')
Augie Fackler
formatting: blacken the codebase...
r43346 % util.hidepassword(path)
)
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
_storeprovider = {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'file': [localstore.localstore],
b'http': [wirestore.wirestore],
b'https': [wirestore.wirestore],
b'ssh': [wirestore.wirestore],
Augie Fackler
formatting: blacken the codebase...
r43346 }
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
Augie Fackler
largefiles: make scheme regex a bytes regex...
r36328 _scheme_re = re.compile(br'^([a-zA-Z0-9+-.]+)://')
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580
Augie Fackler
formatting: blacken the codebase...
r43346
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 def getlfile(ui, hash):
return util.chunkbuffer(openstore(ui=ui)._get(hash))