Mercurial > hg
diff hgext/largefiles/storefactory.py @ 29305:814076f4ace3
largefiles: move basestore._openstore into new module to remove cycle
author | liscju <piotr.listkiewicz@gmail.com> |
---|---|
date | Sat, 04 Jun 2016 16:53:44 +0200 |
parents | hgext/largefiles/basestore.py@207c0db08953 |
children | 85868ecf2c0d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext/largefiles/storefactory.py Sat Jun 04 16:53:44 2016 +0200 @@ -0,0 +1,78 @@ +# 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 _ + +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. +def _openstore(repo, remote=None, put=False): + ui = repo.ui + + if not remote: + lfpullsource = getattr(repo, 'lfpullsource', None) + if lfpullsource: + path = ui.expandpath(lfpullsource) + elif put: + path = ui.expandpath('default-push', 'default') + else: + path = ui.expandpath('default') + + # ui.expandpath() leaves 'default-push' and 'default' alone if + # they cannot be expanded: fallback to the empty string, + # meaning the current directory. + if path == 'default-push' or path == 'default': + path = '' + remote = repo + else: + path, _branches = hg.parseurl(path) + remote = hg.peer(repo, {}, 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, 'url') and remote.url() or remote.path + + match = _scheme_re.match(path) + if not match: # regular filesystem path + scheme = 'file' + else: + scheme = match.group(1) + + try: + storeproviders = _storeprovider[scheme] + except KeyError: + raise error.Abort(_('unsupported URL scheme %r') % scheme) + + for classobj in storeproviders: + try: + return classobj(ui, repo, remote) + except lfutil.storeprotonotcapable: + pass + + raise error.Abort(_('%s does not appear to be a largefile store') % + util.hidepassword(path)) + +_storeprovider = { + 'file': [localstore.localstore], + 'http': [wirestore.wirestore], + 'https': [wirestore.wirestore], + 'ssh': [wirestore.wirestore], + } + +_scheme_re = re.compile(r'^([a-zA-Z0-9+-.]+)://')