Rev 1831: Move inventory retrieval to separate function. in file:///data/jelmer/bzr-svn/trunk/

Jelmer Vernooij jelmer at samba.org
Sat Sep 6 17:39:01 BST 2008


At file:///data/jelmer/bzr-svn/trunk/

------------------------------------------------------------
revno: 1831
revision-id: jelmer at samba.org-20080906163859-5vjubv7nowl5flwi
parent: jelmer at samba.org-20080906142105-4ye4yc877k71yjgk
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Sat 2008-09-06 18:38:59 +0200
message:
  Move inventory retrieval to separate function.
modified:
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
=== modified file 'fetch.py'
--- a/fetch.py	2008-09-06 13:34:47 +0000
+++ b/fetch.py	2008-09-06 16:38:59 +0000
@@ -564,7 +564,7 @@
         return self._idmap[path][0]
 
 
-def report_inventory_contents(reporter, inv, revnum, start_empty):
+def report_inventory_contents(reporter, revnum, start_empty):
     try:
         reporter.set_path("", revnum, start_empty)
     except:
@@ -680,6 +680,20 @@
         """
         raise NotImplementedError(self._fetch_replay)
 
+    def _get_inventory(self, revid):
+        """Retrieve an inventory, optionally using a inventory previously 
+        cached.
+
+        :param revid: Revision id to use.
+        """
+        if revid == NULL_REVISION:
+            return Inventory(root_id=None)
+        if self._prev_inv is not None and self._prev_inv.revision_id == revid:
+            return self._prev_inv
+        if "validate" in debug.debug_flags:
+            assert self.target.has_revision(revid)
+        return self.target.get_inventory(revid)
+
     def _fetch_switch(self, repos_root, revids, pb=None):
         """Copy a set of related revisions using svn.ra.switch.
 
@@ -687,84 +701,67 @@
                        newest first.
         :param pb: Optional progress bar.
         """
-        prev_revid = None
-        if pb is None:
-            pb = ui.ui_factory.nested_progress_bar()
-            nested_pb = pb
-        else:
-            nested_pb = None
-        prev_inv = None
-
-        try:
-            for num, (revmeta, mapping) in enumerate(revids):
-                revid = revmeta.get_revision_id(mapping)
-                assert revid != NULL_REVISION
-                pb.update('copying revision', num, len(revids))
-
-                parent_revmeta = revmeta.get_lhs_parent_revmeta(mapping)
-                if parent_revmeta is None:
-                    parent_revid = NULL_REVISION
-                    parent_inv = Inventory(root_id=None)
-                else:
-                    parent_revid = parent_revmeta.get_revision_id(mapping)
-                    if prev_revid != parent_revid:
-                        if "validate" in debug.debug_flags:
-                            assert self.target.has_revision(parent_revid)
-                        parent_inv = self.target.get_inventory(parent_revid)
-                    else:
-                        parent_inv = prev_inv
-
-                assert parent_revid is not None and parent_revid != revid
-
-                if parent_revid == NULL_REVISION:
-                    parent_branch = revmeta.branch_path
-                    parent_revnum = revmeta.revnum
-                    start_empty = True
-                else:
-                    parent_branch = parent_revmeta.branch_path
-                    parent_revnum = parent_revmeta.revnum
-                    start_empty = False
-
-                if not self.target.is_in_write_group():
-                    self.target.start_write_group()
+        self._prev_inv = None
+
+        for num, (revmeta, mapping) in enumerate(revids):
+            revid = revmeta.get_revision_id(mapping)
+            assert revid != NULL_REVISION
+            pb.update('copying revision', num, len(revids))
+
+            parent_revmeta = revmeta.get_lhs_parent_revmeta(mapping)
+            if parent_revmeta is None:
+                parent_revid = NULL_REVISION
+            else:
+                parent_revid = parent_revmeta.get_revision_id(mapping)
+
+            assert parent_revid is not None and parent_revid != revid
+
+            if parent_revid == NULL_REVISION:
+                parent_branch = revmeta.branch_path
+                parent_revnum = revmeta.revnum
+                start_empty = True
+            else:
+                parent_branch = parent_revmeta.branch_path
+                parent_revnum = parent_revmeta.revnum
+                start_empty = False
+
+            if not self.target.is_in_write_group():
+                self.target.start_write_group()
+            try:
+                editor = RevisionBuildEditor(self.source, self.target, revid, self._get_inventory(parent_revid), revmeta)
                 try:
-                    editor = RevisionBuildEditor(self.source, self.target, revid, parent_inv, revmeta)
+                    conn = None
                     try:
-                        conn = None
-                        try:
-                            conn = self.source.transport.get_connection(parent_branch)
-
-                            assert revmeta.revnum > parent_revnum or start_empty
-
-                            if parent_branch != revmeta.branch_path:
-                                reporter = conn.do_switch(revmeta.revnum, "", True, 
-                                    _url_escape_uri(urlutils.join(repos_root, revmeta.branch_path)), 
-                                    editor)
-                            else:
-                                reporter = conn.do_update(revmeta.revnum, "", True, editor)
-
-                            report_inventory_contents(reporter, parent_inv, parent_revnum, start_empty)
-                        finally:
-                            if conn is not None:
-                                if not conn.busy:
-                                    self.source.transport.add_connection(conn)
-                    except:
-                        editor.abort()
-                        raise
+                        conn = self.source.transport.get_connection(parent_branch)
+
+                        assert revmeta.revnum > parent_revnum or start_empty
+
+                        if parent_branch != revmeta.branch_path:
+                            reporter = conn.do_switch(revmeta.revnum, "", True, 
+                                _url_escape_uri(urlutils.join(repos_root, revmeta.branch_path)), 
+                                editor)
+                        else:
+                            reporter = conn.do_update(revmeta.revnum, "", True, editor)
+
+                        report_inventory_contents(reporter, parent_revnum, start_empty)
+                    finally:
+                        if conn is not None:
+                            if not conn.busy:
+                                self.source.transport.add_connection(conn)
                 except:
-                    if self.target.is_in_write_group():
-                        self.target.abort_write_group()
+                    editor.abort()
                     raise
-                if num % FETCH_COMMIT_WRITE_SIZE == 0:
-                    self.target.commit_write_group()
-
-                prev_inv = editor.inventory
-                prev_revid = revid
-            if self.target.is_in_write_group():
+            except:
+                if self.target.is_in_write_group():
+                    self.target.abort_write_group()
+                raise
+            if num % FETCH_COMMIT_WRITE_SIZE == 0:
                 self.target.commit_write_group()
-        finally:
-            if nested_pb is not None:
-                nested_pb.finished()
+
+            self._prev_inv = editor.inventory
+            assert self._prev_inv.revision_id == revid
+        if self.target.is_in_write_group():
+            self.target.commit_write_group()
 
     def fetch(self, revision_id=None, pb=None, find_ghosts=False, 
               branches=None):
@@ -797,7 +794,16 @@
                 # Nothing to fetch
                 return
 
-            self._fetch_switch(self.source.transport.get_svn_repos_root(), needed, pb)
+            if pb is None:
+                pb = ui.ui_factory.nested_progress_bar()
+                nested_pb = pb
+            else:
+                nested_pb = None
+            try:
+                self._fetch_switch(self.source.transport.get_svn_repos_root(), needed, pb)
+            finally:
+                if nested_pb is not None:
+                    nested_pb.finished()
         finally:
             self.target.unlock()
 




More information about the bazaar-commits mailing list