Rev 3505: Promote 'VF.get_line_list', using it to extract texts, it is fast, but it doesn't seem to address the core problem yet. in http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/merge3_per_file
John Arbash Meinel
john at arbash-meinel.com
Fri Jun 20 22:08:50 BST 2008
At http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/merge3_per_file
------------------------------------------------------------
revno: 3505
revision-id: john at arbash-meinel.com-20080620210820-bcsuribdjm6bu6m2
parent: john at arbash-meinel.com-20080620200726-eusock9id21ey4a7
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: merge3_per_file
timestamp: Fri 2008-06-20 16:08:20 -0500
message:
Promote 'VF.get_line_list', using it to extract texts, it is fast, but it doesn't seem to address the core problem yet.
-------------- next part --------------
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py 2008-06-20 20:07:26 +0000
+++ b/bzrlib/merge.py 2008-06-20 21:08:20 +0000
@@ -1259,7 +1259,7 @@
self.vf = vf
self._last_lines = None
self._last_lines_revision_id = None
- self._line_cache = {} # Map from revision_id => lines
+ self._cached_lines = {} # Map from revision_id => lines
self._cached_matching_blocks = {}
def plan_merge(self):
@@ -1315,8 +1315,14 @@
if self._last_lines_revision_id == left_revision:
left_lines = self._last_lines
else:
- left_lines = self.vf.get_lines(left_revision)
- right_lines = self.vf.get_lines(right_revision)
+ if left_revision in self._cached_lines:
+ left_lines = self._cached_lines[left_revision]
+ else:
+ left_lines = self.vf.get_lines(left_revision)
+ if right_revision in self._cached_lines:
+ right_lines = self._cached_lines[left_revision]
+ else:
+ right_lines = self.vf.get_lines(right_revision)
self._last_lines = right_lines
self._last_lines_revision_id = right_revision
matcher = patiencediff.PatienceSequenceMatcher(None, left_lines,
@@ -1380,6 +1386,10 @@
graph = _mod_graph.Graph(vf)
a_ancestry, b_ancestry = graph.find_difference(a_rev, b_rev)
self.uncommon = a_ancestry.union(b_ancestry)
+ mutter('Found %s uncommon ancestors to merge for %s',
+ len(self.uncommon), vf)
+ self._cached_lines = dict(zip(self.uncommon,
+ vf.get_line_list(self.uncommon)))
def _determine_status(self, revision_id, unique_line_numbers):
"""Determines the status unique lines versus all lcas.
@@ -1407,7 +1417,11 @@
return set()
parents = self.vf.get_parent_map([version_id])[version_id]
if len(parents) == 0:
- return set(range(len(self.vf.get_lines(version_id))))
+ if version_id in self._cached_lines:
+ lines = self._cached_lines[version_id]
+ else:
+ lines = self.vf.get_lines(version_id)
+ return set(range(len(lines)))
new = None
for parent in parents:
blocks = self._get_matching_blocks(version_id, parent)
=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py 2008-06-20 20:07:26 +0000
+++ b/bzrlib/versionedfile.py 2008-06-20 21:08:20 +0000
@@ -360,6 +360,10 @@
"""
raise NotImplementedError(self.get_lines)
+ def get_line_list(self, version_ids):
+ """Return the texts of listed versions as a list of strings."""
+ raise NotImplementedError(self.get_line_list)
+
def _get_lf_split_line_list(self, version_ids):
return [StringIO(t).readlines() for t in self.get_texts(version_ids)]
@@ -579,6 +583,30 @@
else:
raise errors.RevisionNotPresent(version_id, self._file_id)
+ def get_line_list(self, version_ids):
+ texts = {}
+ remaining_versions = set(version_ids)
+ for version_id in version_ids:
+ if version_id in self._lines:
+ texts[version_id] = self._lines[version_id]
+ remaining_versions.remove(version_id)
+
+ for vf in self.fallback_versionedfiles:
+ if not remaining_versions:
+ break
+ existing = set()
+ for version_id in remaining_versions:
+ if vf.has_version(version_id):
+ existing.add(version_id)
+ for version_id, lines in zip(existing, vf.get_line_list(existing)):
+ texts[version_id] = lines
+ remaining_versions.remove(version_id)
+
+ if remaining_versions:
+ raise errors.RevisionNotPresent(remaining_versions.pop(),
+ self._file_id)
+ return [texts[v] for v in version_ids]
+
def get_ancestry(self, version_id, topo_sorted=False):
"""See VersionedFile.get_ancestry.
More information about the bazaar-commits
mailing list