diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py --- a/hgext/largefiles/uisetup.py +++ b/hgext/largefiles/uisetup.py @@ -153,7 +153,7 @@ def uisetup(ui): httppeer.httppeer._callstream = proto.httprepocallstream # don't die on seeing a repo with the largefiles requirement - localrepo.localrepository.supported |= set(['largefiles']) + localrepo.localrepository._basesupported |= set(['largefiles']) # override some extensions' stuff as well for name, module in extensions.extensions(): diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -146,12 +146,14 @@ class locallegacypeer(localpeer): class localrepository(object): supportedformats = set(('revlogv1', 'generaldelta')) - supported = supportedformats | set(('store', 'fncache', 'shared', - 'dotencode')) + _basesupported = supportedformats | set(('store', 'fncache', 'shared', + 'dotencode')) openerreqs = set(('revlogv1', 'generaldelta')) requirements = ['revlogv1'] filtername = None + featuresetupfuncs = set() + def _baserequirements(self, create): return self.requirements[:] @@ -176,6 +178,13 @@ class localrepository(object): except IOError: pass + if self.featuresetupfuncs: + self.supported = set(self._basesupported) # use private copy + for setupfunc in self.featuresetupfuncs: + setupfunc(self.ui, self.supported) + else: + self.supported = self._basesupported + if not self.vfs.isdir(): if create: if not self.wvfs.exists(): @@ -1649,6 +1658,14 @@ class localrepository(object): return r def pull(self, remote, heads=None, force=False): + if remote.local(): + missing = set(remote.requirements) - self.supported + if missing: + msg = _("required features are not" + " supported in the destination:" + " %s") % (', '.join(sorted(missing))) + raise util.Abort(msg) + # don't open transaction for nothing or you break future useful # rollback call tr = None @@ -1749,6 +1766,14 @@ class localrepository(object): we have outgoing changesets but refused to push - other values as described by addchangegroup() ''' + 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) + # there are two ways to push to remote repo: # # addchangegroup assumes local user can lock remote diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py --- a/mercurial/statichttprepo.py +++ b/mercurial/statichttprepo.py @@ -89,6 +89,8 @@ class statichttppeer(localrepo.localpeer return False class statichttprepository(localrepo.localrepository): + supported = localrepo.localrepository._basesupported + def __init__(self, ui, path): self._url = path self.ui = ui diff --git a/tests/test-requires.t b/tests/test-requires.t --- a/tests/test-requires.t +++ b/tests/test-requires.t @@ -15,5 +15,55 @@ $ hg tip abort: unknown repository format: requires features 'indoor-pool', 'outdoor-pool' (upgrade Mercurial)! [255] + $ cd .. + +Test checking between features supported locally and ones required in +another repository of push/pull/clone on localhost: + + $ mkdir supported-locally + $ cd supported-locally + + $ hg init supported + $ echo a > supported/a + $ hg -R supported commit -Am '#0 at supported' + adding a + + $ echo 'featuresetup-test' >> supported/.hg/requires + $ cat > $TESTTMP/supported-locally/supportlocally.py < from mercurial import localrepo, extensions + > def featuresetup(ui, supported): + > for name, module in extensions.extensions(ui): + > if __name__ == module.__name__: + > # support specific feature locally + > supported |= set(['featuresetup-test']) + > return + > def uisetup(ui): + > localrepo.localrepository.featuresetupfuncs.add(featuresetup) + > EOF + $ cat > supported/.hg/hgrc < [extensions] + > # enable extension locally + > supportlocally = $TESTTMP/supported-locally/supportlocally.py + > EOF + $ hg -R supported status + + $ hg init push-dst + $ hg -R supported push push-dst + pushing to push-dst + abort: required features are not supported in the destination: featuresetup-test + [255] + + $ hg init pull-src + $ hg -R pull-src pull supported + pulling from supported + abort: required features are not supported in the destination: featuresetup-test + [255] + + $ hg clone supported clone-dst + abort: unknown repository format: requires features 'featuresetup-test' (upgrade Mercurial)! + [255] + $ hg clone --pull supported clone-dst + abort: required features are not supported in the destination: featuresetup-test + [255] $ cd ..