Rev 328: Reduce number of find_children() calls. in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Fri Dec 29 18:49:19 GMT 2006


------------------------------------------------------------
revno: 328
revision-id: jelmer at samba.org-20061229184647-pbc050jhf8ls78fk
parent: jelmer at samba.org-20061229171536-42b4448bos7zjhp4
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Fri 2006-12-29 19:46:47 +0100
message:
  Reduce number of find_children() calls.
modified:
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
=== modified file 'fetch.py'
--- a/fetch.py	2006-12-29 16:56:21 +0000
+++ b/fetch.py	2006-12-29 18:46:47 +0000
@@ -31,6 +31,7 @@
 from svn.core import SubversionException, Pool
 import svn.core, svn.ra
 
+from fileids import generate_file_id
 from repository import (SvnRepository, SVN_PROP_BZR_MERGE, SVN_PROP_SVK_MERGE,
                 SVN_PROP_BZR_REVPROP_PREFIX, SvnRepositoryFormat)
 from tree import apply_txdelta_handler
@@ -95,11 +96,22 @@
     def relpath(self, path):
         return path.strip("/")
 
-    def _get_existing_id(self, parent_id, old_path):
+    def _get_existing_id(self, parent_id, path):
+        if self.id_map.has_key(path):
+            return self.id_map[path]
+
+        return self._get_old_id(parent_id, path)
+
+    def _get_old_id(self, parent_id, old_path):
         return self.old_inventory[parent_id].children[os.path.basename(old_path)].file_id
 
-    def delete_entry(self, path, revnum, parent_baton, pool):
-        del self.inventory[self._get_existing_id(parent_baton, path)]
+    def _get_new_id(self, parent_id, new_path):
+        if self.id_map.has_key(new_path):
+            return self.id_map[new_path]
+        return generate_file_id(self.revid, new_path)
+
+    def delete_entry(self, path, revnum, parent_id, pool):
+        del self.inventory[self._get_old_id(parent_id, path)]
 
     def close_directory(self, id):
         if id != ROOT_ID:
@@ -109,8 +121,8 @@
             if not file_weave.has_version(self.revid):
                 file_weave.add_lines(self.revid, self.dir_baserev[id], [])
 
-    def add_directory(self, path, parent_baton, copyfrom_path, copyfrom_revnum, pool):
-        file_id = self.id_map[path]
+    def add_directory(self, path, parent_id, copyfrom_path, copyfrom_revnum, pool):
+        file_id = self._get_new_id(parent_id, path)
 
         self.dir_baserev[file_id] = []
         ie = self.inventory.add_path(path, 'directory', file_id)
@@ -118,14 +130,11 @@
 
         return file_id
 
-    def open_directory(self, path, parent_baton, base_revnum, pool):
+    def open_directory(self, path, parent_id, base_revnum, pool):
         assert base_revnum >= 0
-        base_file_id = self._get_existing_id(parent_baton, path)
+        base_file_id = self._get_old_id(parent_id, path)
         base_revid = self.old_inventory[base_file_id].revision
-        if self.id_map.has_key(path):
-            file_id = self.id_map[path]
-        else:
-            file_id = base_file_id
+        file_id = self._get_existing_id(parent_id, path)
         if file_id == base_file_id:
             self.dir_baserev[file_id] = [base_revid]
             ie = self.inventory[file_id]
@@ -194,16 +203,13 @@
         self.file_data = ""
         self.file_parents = []
         self.file_stream = None
-        self.file_id = self.id_map[path]
+        self.file_id = self._get_new_id(parent_id, path)
         return path
 
     def open_file(self, path, parent_id, base_revnum, pool):
-        base_file_id = self._get_existing_id(parent_id, path)
+        base_file_id = self._get_old_id(parent_id, path)
         base_revid = self.old_inventory[base_file_id].revision
-        if self.id_map.has_key(path):
-            self.file_id = self.id_map[path]
-        else:
-            self.file_id = base_file_id
+        self.file_id = self._get_existing_id(parent_id, path)
         self.is_executable = None
         self.is_symlink = (self.inventory[base_file_id].kind == 'symlink')
         file_weave = self.weave_store.get_weave_or_empty(base_file_id, self.transact)

=== modified file 'fileids.py'
--- a/fileids.py	2006-12-29 17:15:36 +0000
+++ b/fileids.py	2006-12-29 18:46:47 +0000
@@ -68,10 +68,10 @@
             except NotBranchError:
                 # Copied from outside of a known branch
                 # Make it look like the files were added in this revision
-                assert find_children is not None
-                for c in find_children(data[1], data[2]):
-                    mutter('oops: %r child %r' % (data[1], c))
-                    new_paths[(new_p+"/"+c[len(data[1]):].strip("/")).strip("/")] = (data[0], None, -1)
+                if find_children is not None:
+                    for c in find_children(data[1], data[2]):
+                        mutter('oops: %r child %r' % (data[1], c))
+                        new_paths[(new_p+"/"+c[len(data[1]):].strip("/")).strip("/")] = (data[0], None, -1)
                 data = (data[0], None, -1)
 
         new_paths[new_p] = data
@@ -120,11 +120,13 @@
         """
         changes = get_local_changes(global_changes, self.repos.scheme,
                                         uuid, find_children)
-
-        def get_children(path, revid):
-            (_, bp, revnum) = parse_svn_revision_id(revid)
-            for p in find_children(bp+"/"+path, revnum):
-                yield self.repos.scheme.unprefix(p)[1]
+        if find_children is not None:
+            def get_children(path, revid):
+                (_, bp, revnum) = parse_svn_revision_id(revid)
+                for p in find_children(bp+"/"+path, revnum):
+                    yield self.repos.scheme.unprefix(p)[1]
+        else:
+            get_children = None
 
         revid = generate_svn_revision_id(uuid, revnum, branch)
 
@@ -208,10 +210,10 @@
 
                 if data[1] is not None:
                     mutter('%r:%s copied from %r:%s' % (p, revid, data[1], data[2]))
-                    assert find_children is not None, 'incomplete data for %r' % p
-                    for c in find_children(data[1], data[2]):
-                        path = c.replace(data[1], p+"/", 1).replace("//", "/")
-                        map[path] = generate_file_id(revid, c)
-                        mutter('added mapping %r -> %r' % (path, map[path]))
+                    if find_children is not None:
+                        for c in find_children(data[1], data[2]):
+                            path = c.replace(data[1], p+"/", 1).replace("//", "/")
+                            map[path] = generate_file_id(revid, c)
+                            mutter('added mapping %r -> %r' % (path, map[path]))
 
         return map

=== modified file 'repository.py'
--- a/repository.py	2006-12-29 17:15:36 +0000
+++ b/repository.py	2006-12-29 18:46:47 +0000
@@ -256,8 +256,8 @@
         return self.fileid_map.get_map(self.uuid, revnum, path, pb)
 
     def transform_fileid_map(self, uuid, revnum, branch, changes):
-        return self.fileid_map.apply_changes(uuid, revnum, branch, changes,
-                find_children=self._log.find_children)
+        return self.fileid_map.apply_changes(uuid, revnum, branch, changes)
+                #find_children=self._log.find_children)
 
     def path_to_file_id(self, revnum, path):
         """Generate a bzr file id from a Subversion file name. 




More information about the bazaar-commits mailing list