From e68b1cacd077f49bafa84b95103945b19910993c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Neuh=C3=A4user?= Date: Sun, 15 Aug 2010 21:25:31 +0200 Subject: [PATCH] Optimized merging algorithm --- sphinx/versioning.py | 14 ++++++++++---- tests/test_versioning.py | 14 +------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/sphinx/versioning.py b/sphinx/versioning.py index 753629042..5f3254554 100644 --- a/sphinx/versioning.py +++ b/sphinx/versioning.py @@ -45,11 +45,17 @@ def merge_doctrees(old, new, condition): old_nodes = old.traverse(condition) new_nodes = new.traverse(condition) ratios = defaultdict(list) - for old_node, new_node in product(old_nodes, new_nodes): - ratios[old_node, new_node] = get_ratio(old_node.rawsource, - new_node.rawsource) - ratios = sorted(ratios.iteritems(), key=itemgetter(1)) seen = set() + for old_node, new_node in product(old_nodes, new_nodes): + if new_node in seen: + continue + ratio = get_ratio(old_node.rawsource, new_node.rawsource) + if ratio == 0: + new_node.uid = old_node.uid + seen.add(new_node) + else: + ratios[old_node, new_node] = ratio + ratios = sorted(ratios.iteritems(), key=itemgetter(1)) for (old_node, new_node), ratio in ratios: if new_node in seen: continue diff --git a/tests/test_versioning.py b/tests/test_versioning.py index 5c31f0c32..06c4ff2f1 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -16,7 +16,7 @@ from docutils.statemachine import ViewList from docutils.parsers.rst.directives.html import MetaBody from sphinx import addnodes -from sphinx.versioning import make_diff, add_uids, merge_doctrees +from sphinx.versioning import add_uids, merge_doctrees def setup_module(): global app, original, original_uids @@ -36,18 +36,6 @@ doctrees = {} def on_doctree_resolved(app, doctree, docname): doctrees[docname] = doctree -def test_make_diff(): - tests = [ - (('aaa', 'aaa'), (True, False, False)), - (('aaa', 'aab'), (False, True, False)), - (('aaa', 'abb'), (False, True, False)), - (('aaa', 'aba'), (False, True, False)), - (('aaa', 'baa'), (False, True, False)), - (('aaa', 'bbb'), (False, False, True)) - ] - for args, result in tests: - assert make_diff(*args) == result - def is_paragraph(node): return node.__class__.__name__ == 'paragraph'