# HG changeset patch # User Vitaliy Filippov # Date 1327702705 -14400 # Node ID 0de18c5c2e3589215225ef6304f482d07e741986 # Parent 7ca3d1b08d676c2dbbb8bb27d8e5a4d94ff4a1c3 Respect filemap rule order (rules that come first are overridden by rules that come later) diff --git a/hgsubversion/maps.py b/hgsubversion/maps.py --- 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') diff --git a/tests/test_fetch_mappings.py b/tests/test_fetch_mappings.py --- a/tests/test_fetch_mappings.py +++ b/tests/test_fetch_mappings.py @@ -131,6 +131,19 @@ class MapTests(test_util.TestBase): # TODO: re-enable test if we ever reinstate this feature self.assertRaises(hgutil.Abort, self.test_file_map_exclude, True) + def test_file_map_rule_order(self): + test_util.load_svndump_fixture(self.repo_path, 'replace_trunk_with_branch.svndump') + filemap = open(self.filemap, 'w') + filemap.write("exclude alpha\n") + filemap.write("include .\n") + filemap.close() + ui = self.ui(False) + ui.setconfig('hgsubversion', 'filemap', self.filemap) + commands.clone(ui, test_util.fileurl(self.repo_path), + self.wc_path, filemap=self.filemap) + self.assertEqual(node.hex(self.repo[0].node()), '2cd09772e0f6ddf2d13c60ef3c1be11ad5a7dfae') + self.assertEqual(node.hex(self.repo['default'].node()), '8a525ca0671f456e6b1417187bf86c6115d2cb78') + def test_branchmap(self, stupid=False): test_util.load_svndump_fixture(self.repo_path, 'branchmap.svndump') branchmap = open(self.branchmap, 'w')