diff --git a/hgext/largefiles/__init__.py b/hgext/largefiles/__init__.py --- a/hgext/largefiles/__init__.py +++ b/hgext/largefiles/__init__.py @@ -105,16 +105,26 @@ explicitly do so with the --large flag p command. ''' -from mercurial import commands +from mercurial import commands, localrepo, extensions import lfcommands import reposetup -import uisetup +import uisetup as uisetupmod testedwith = 'internal' reposetup = reposetup.reposetup -uisetup = uisetup.uisetup + +def featuresetup(ui, supported): + for name, module in extensions.extensions(ui): + if __name__ == module.__name__: + # don't die on seeing a repo with the largefiles requirement + supported |= set(['largefiles']) + return + +def uisetup(ui): + localrepo.localrepository.featuresetupfuncs.add(featuresetup) + uisetupmod.uisetup(ui) commands.norepo += " lfconvert" diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py --- a/hgext/largefiles/reposetup.py +++ b/hgext/largefiles/reposetup.py @@ -407,6 +407,14 @@ def reposetup(ui, repo): wlock.release() def push(self, remote, force=False, revs=None, newbranch=False): + if remote.local(): + missing = set(self.requirements) - remote.local().supported + if missing: + msg = _("required features are not" + " supported in the destination:" + " %s") % (', '.join(sorted(missing))) + raise util.Abort(msg) + outgoing = discovery.findcommonoutgoing(repo, remote.peer(), force=force) if outgoing.missing: diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py --- a/hgext/largefiles/uisetup.py +++ b/hgext/largefiles/uisetup.py @@ -9,7 +9,7 @@ '''setup for largefiles extension: uisetup''' from mercurial import archival, cmdutil, commands, extensions, filemerge, hg, \ - httppeer, localrepo, merge, scmutil, sshpeer, wireproto, revset + httppeer, merge, scmutil, sshpeer, wireproto, revset from mercurial.i18n import _ from mercurial.hgweb import hgweb_mod, webcommands from mercurial.subrepo import hgsubrepo @@ -152,9 +152,6 @@ def uisetup(ui): sshpeer.sshpeer._callstream = proto.sshrepocallstream httppeer.httppeer._callstream = proto.httprepocallstream - # don't die on seeing a repo with the largefiles requirement - localrepo.localrepository._basesupported |= set(['largefiles']) - # override some extensions' stuff as well for name, module in extensions.extensions(): if name == 'fetch': diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t --- a/tests/test-largefiles.t +++ b/tests/test-largefiles.t @@ -2191,3 +2191,64 @@ check messages when there are files to u $ cd .. + +Check whether "largefiles" feature is supported only in repositories +enabling largefiles extension. + + $ mkdir individualenabling + $ cd individualenabling + + $ hg init enabledlocally + $ echo large > enabledlocally/large + $ hg -R enabledlocally add --large enabledlocally/large + $ hg -R enabledlocally commit -m '#0' + Invoking status precommit hook + A large + + $ hg init notenabledlocally + $ echo large > notenabledlocally/large + $ hg -R notenabledlocally add --large notenabledlocally/large + $ hg -R notenabledlocally commit -m '#0' + Invoking status precommit hook + A large + + $ cat >> $HGRCPATH < [extensions] + > # disable globally + > largefiles=! + > EOF + $ cat >> enabledlocally/.hg/hgrc < [extensions] + > # enable locally + > largefiles= + > EOF + $ hg -R enabledlocally root + $TESTTMP/individualenabling/enabledlocally + $ hg -R notenabledlocally root + abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)! + [255] + + $ hg init push-dst + $ hg -R enabledlocally push push-dst + pushing to push-dst + abort: required features are not supported in the destination: largefiles + [255] + + $ hg init pull-src + $ hg -R pull-src pull enabledlocally + pulling from enabledlocally + abort: required features are not supported in the destination: largefiles + [255] + + $ hg clone enabledlocally clone-dst + abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)! + [255] + $ test -d clone-dst + [1] + $ hg clone --pull enabledlocally clone-pull-dst + abort: required features are not supported in the destination: largefiles + [255] + $ test -d clone-pull-dst + [1] + + $ cd ..