# HG changeset patch # User liscju # Date 1465052024 -7200 # Node ID 814076f4ace37b456a32ae49d23540ce0d21c44d # Parent 5e32852fa4bd074d1e8bcee6f8be5818b5e95cd0 largefiles: move basestore._openstore into new module to remove cycle diff -r 5e32852fa4bd -r 814076f4ace3 hgext/largefiles/basestore.py --- a/hgext/largefiles/basestore.py Thu Jun 02 22:39:01 2016 +0100 +++ b/hgext/largefiles/basestore.py Sat Jun 04 16:53:44 2016 +0200 @@ -8,9 +8,7 @@ '''base class for store implementations and store-related utility code''' -import re - -from mercurial import util, node, hg, error +from mercurial import util, node from mercurial.i18n import _ import lfutil @@ -164,63 +162,3 @@ Returns _true_ if any problems are found! ''' raise NotImplementedError('abstract method') - -import localstore, wirestore - -_storeprovider = { - 'file': [localstore.localstore], - 'http': [wirestore.wirestore], - 'https': [wirestore.wirestore], - 'ssh': [wirestore.wirestore], - } - -_scheme_re = re.compile(r'^([a-zA-Z0-9+-.]+)://') - -# 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)) diff -r 5e32852fa4bd -r 814076f4ace3 hgext/largefiles/lfcommands.py --- a/hgext/largefiles/lfcommands.py Thu Jun 02 22:39:01 2016 +0100 +++ b/hgext/largefiles/lfcommands.py Sat Jun 04 16:53:44 2016 +0200 @@ -20,7 +20,7 @@ from hgext.convert import filemap import lfutil -import basestore +import storefactory # -- Commands ---------------------------------------------------------- @@ -337,7 +337,7 @@ if not files: return - store = basestore._openstore(rsrc, rdst, put=True) + store = storefactory._openstore(rsrc, rdst, put=True) at = 0 ui.debug("sending statlfile command for %d largefiles\n" % len(files)) @@ -368,7 +368,7 @@ else: revs = ['.'] - store = basestore._openstore(repo) + store = storefactory._openstore(repo) return store.verify(revs, contents=contents) def cachelfiles(ui, repo, node, filelist=None): @@ -394,7 +394,7 @@ toget.append((lfile, expectedhash)) if toget: - store = basestore._openstore(repo) + store = storefactory._openstore(repo) ret = store.get(toget) return ret diff -r 5e32852fa4bd -r 814076f4ace3 hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py Thu Jun 02 22:39:01 2016 +0100 +++ b/hgext/largefiles/overrides.py Sat Jun 04 16:53:44 2016 +0200 @@ -17,7 +17,7 @@ import lfutil import lfcommands -import basestore +import storefactory # -- Utility functions: commonly/repeatedly needed functionality --------------- @@ -1109,7 +1109,7 @@ lfhashes.add(lfhash) lfutil.getlfilestoupload(repo, missing, dedup) if lfhashes: - lfexists = basestore._openstore(repo, other).exists(lfhashes) + lfexists = storefactory._openstore(repo, other).exists(lfhashes) for fn, lfhash in knowns: if not lfexists[lfhash]: # lfhash doesn't exist on "other" addfunc(fn, lfhash) @@ -1338,7 +1338,7 @@ else: hash = lfutil.readstandin(repo, lf, ctx.rev()) if not lfutil.inusercache(repo.ui, hash): - store = basestore._openstore(repo) + store = storefactory._openstore(repo) success, missing = store.get([(lf, hash)]) if len(success) != 1: raise error.Abort( diff -r 5e32852fa4bd -r 814076f4ace3 hgext/largefiles/storefactory.py --- /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+-.]+)://') diff -r 5e32852fa4bd -r 814076f4ace3 tests/test-check-module-imports.t --- a/tests/test-check-module-imports.t Thu Jun 02 22:39:01 2016 +0100 +++ b/tests/test-check-module-imports.t Sat Jun 04 16:53:44 2016 +0200 @@ -179,5 +179,3 @@ > -X tests/test-hgweb-no-request-uri.t \ > -X tests/test-hgweb-non-interactive.t \ > | sed 's-\\-/-g' | python "$import_checker" - - Import cycle: hgext.largefiles.basestore -> hgext.largefiles.localstore -> hgext.largefiles.basestore - [1]