summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDasIch <dasdasich@gmail.com>2010-08-15 21:25:31 +0200
committerDasIch <dasdasich@gmail.com>2010-08-15 21:25:31 +0200
commit3542ae7553f8fb767de577cf0456291da8ac84e9 (patch)
treeb9cfc949f23612da0d725efdc5413edf047bd96e
parent209553e565d38503bc0264682ad13ed8435acf52 (diff)
downloadsphinx-3542ae7553f8fb767de577cf0456291da8ac84e9.tar.gz
Optimized merging algorithm
-rw-r--r--sphinx/versioning.py12
-rw-r--r--tests/test_versioning.py14
2 files changed, 10 insertions, 16 deletions
diff --git a/sphinx/versioning.py b/sphinx/versioning.py
index 75362904..5f325455 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)
+ seen = set()
for old_node, new_node in product(old_nodes, new_nodes):
- ratios[old_node, new_node] = get_ratio(old_node.rawsource,
- new_node.rawsource)
+ 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))
- seen = set()
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 5c31f0c3..06c4ff2f 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'