mercurial/localrepo.py
changeset 19778 55ef79031009
parent 19650 36f48c7d5944
child 19852 57479e0d203d
--- a/mercurial/localrepo.py	Sat Sep 21 21:33:29 2013 +0900
+++ b/mercurial/localrepo.py	Sat Sep 21 21:33:29 2013 +0900
@@ -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