diff hgsubversion/maps.py @ 847:0de18c5c2e35

Respect filemap rule order (rules that come first are overridden by rules that come later)
author Vitaliy Filippov <vitalif@yourcmc.ru>
date Sat, 28 Jan 2012 02:18:25 +0400
parents 7ca3d1b08d67
children 7a98fbadcae9
line wrap: on
line diff
--- a/hgsubversion/maps.py
+++ b/hgsubversion/maps.py
@@ -272,32 +272,34 @@ class FileMap(object):
             self._write()
 
     def _rpairs(self, name):
-        yield '.', name
         e = len(name)
         while e != -1:
             yield name[:e], name[e+1:]
             e = name.rfind('/', 0, e)
+        yield '.', name
 
     def check(self, m, path):
         m = getattr(self, m)
         for pre, _suf in self._rpairs(path):
-            if pre not in m:
-                continue
-            return m[pre]
-        return None
+            if pre in m:
+                return m[pre]
+        return -1
 
     def __contains__(self, path):
-        if len(self.include) and len(path):
+        if not len(path):
+            return True
+        if len(self.include):
             inc = self.check('include', path)
+        elif not len(self.exclude):
+            return True
         else:
-            inc = path
-        if len(self.exclude) and len(path):
+            inc = 0
+        if len(self.exclude):
             exc = self.check('exclude', path)
         else:
-            exc = None
-        if inc is None or exc is not None:
-            return False
-        return True
+            exc = -1
+        # respect rule order: newer rules override older
+        return inc > exc
 
     # Needed so empty filemaps are false
     def __len__(self):
@@ -311,7 +313,8 @@ class FileMap(object):
             return
         bits = m.strip('e'), path
         self.ui.debug('%sing %s\n' % bits)
-        mapping[path] = path
+        # respect rule order
+        mapping[path] = len(self)
         if fn != self.path:
             f = open(self.path, 'a')
             f.write(m + ' ' + path + '\n')