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