Comments
Patch
@@ -153,7 +153,7 @@
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():
@@ -146,12 +146,14 @@
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 @@
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 @@
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 @@
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
@@ -89,6 +89,8 @@
return False
class statichttprepository(localrepo.localrepository):
+ supported = localrepo.localrepository._basesupported
+
def __init__(self, ui, path):
self._url = path
self.ui = ui
@@ -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 <<EOF
+ > 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 <<EOF
+ > [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 ..