##// END OF EJS Templates
wrapfunction: use sysstr instead of bytes as argument in "clonebundles"...
wrapfunction: use sysstr instead of bytes as argument in "clonebundles" This is as valid and simpler, it will help us to eventually get ride of `safehasattr`.

File last commit:

r50628:8d0a220c default
r51669:335aeb3d default
Show More
storefactory.py
96 lines | 2.6 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.
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,
)
urlutil: extract `url` related code from `util` into the new module...
r47669 from mercurial.utils import (
urlutil,
)
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
from . import (
lfutil,
localstore,
wirestore,
)
lfs: use the new APIs...
r47709
liscju
largefiles: move basestore._openstore into new module to remove cycle
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
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)
lfs: use the new APIs...
r47709 if put:
path = urlutil.get_unique_push_path(
b'lfpullsource', repo, ui, lfpullsource
)
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305 else:
path: pass `path` to `peer` in largefiles...
r50628 path = urlutil.get_unique_pull_path_obj(
b'lfpullsource', ui, lfpullsource
lfs: use the new APIs...
r47709 )
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305
lfs: use the new APIs...
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
largefiles: add support for 'largefiles://' url scheme...
r35580 if repo is None:
path: pass `path` to `peer` in largefiles...
r50628 path = urlutil.get_unique_pull_path_obj(
b'lfs',
ui,
b'default',
lfs: use the new APIs...
r47709 )
Boris Feld
largefiles: add support for 'largefiles://' url scheme...
r35580 remote = hg.peer(repo or ui, {}, path)
path: pass `path` to `peer` in largefiles...
r50628 elif path.loc == b'default-push' or path.loc == b'default':
liscju
largefiles: move basestore._openstore into new module to remove cycle
r29305 remote = repo
else:
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')
urlutil: extract `url` related code from `util` into the new module...
r47669 % urlutil.hidepassword(path)
Augie Fackler
formatting: blacken the codebase...
r43346 )
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))