Rev 1842: pass project parameter around everywhere to limit revision id searching. in file:///data/jelmer/bzr-svn/trunk/

Jelmer Vernooij jelmer at samba.org
Sun Sep 7 00:49:37 BST 2008


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

------------------------------------------------------------
revno: 1842
revision-id: jelmer at samba.org-20080906234934-5m18ae0s01dsavxz
parent: jelmer at samba.org-20080906225612-lllmnbna8iqyfkm9
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Sun 2008-09-07 01:49:34 +0200
message:
  pass project parameter around everywhere to limit revision id searching.
modified:
  NEWS                           news-20061231030336-h9fhq245ie0de8bs-1
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  convert.py                     svn2bzr.py-20051018015439-cb4563bff29e632d
  layout.py                      layout.py-20080323165407-y9qw8nx4oykvoe1k-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
=== modified file 'NEWS'
--- a/NEWS	2008-09-06 19:33:59 +0000
+++ b/NEWS	2008-09-06 23:49:34 +0000
@@ -13,6 +13,9 @@
 	   replaced by "repository layouts", which are 
 	   much more flexible. (#130372)
 
+   * Will avoid browsing the full repository for bzr-revisions, 
+     only closely related paths.
+
   FEATURES
 
    * Add bzr:skip revision property to allow skipping 

=== modified file 'branch.py'
--- a/branch.py	2008-09-06 22:49:08 +0000
+++ b/branch.py	2008-09-06 23:49:34 +0000
@@ -238,7 +238,7 @@
     def set_revision_history(self, rev_history):
         """See Branch.set_revision_history()."""
         if (rev_history == [] or 
-            not self.repository.has_revision(rev_history[-1])):
+            not self.repository.has_revision(rev_history[-1], project=self.project)):
             raise NotImplementedError("set_revision_history can't add ghosts")
         push(self.repository.get_graph(), 
              self, self.repository, rev_history[-1])
@@ -271,7 +271,7 @@
         """
         missing = []
         for revid in other.repository.iter_reverse_revision_history(stop_revision):
-            if self.repository.has_revision(revid):
+            if self.repository.has_revision(revid, project=self.project):
                 missing.reverse()
                 return missing
             missing.append(revid)

=== modified file 'convert.py'
--- a/convert.py	2008-09-04 15:47:01 +0000
+++ b/convert.py	2008-09-06 23:49:34 +0000
@@ -176,7 +176,7 @@
         # have to remove existing branches.
         if from_revnum == 0 or (not keep and len(to_transport.list_dir(".")) > 1):
             removed_branches, changed_branches = source_repos.find_branches_between(layout=layout, 
-                from_revnum=from_revnum, to_revnum=to_revnum)
+                from_revnum=from_revnum, to_revnum=to_revnum, project=None)
             existing_branches = []
             for bp in changed_branches:
                 try:

=== modified file 'layout.py'
--- a/layout.py	2008-09-06 22:49:08 +0000
+++ b/layout.py	2008-09-06 23:49:34 +0000
@@ -17,7 +17,7 @@
 from bzrlib.errors import NotBranchError
 from bzrlib.trace import mutter
 from bzrlib.plugins.svn.core import SubversionException, NODE_DIR
-from bzrlib.plugins.svn.errors import ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND
+from bzrlib.plugins.svn.errors import ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND, InvalidSvnBranchPath
 from bzrlib.plugins.svn.ra import DIRENT_KIND
 
 class RepositoryLayout(object):
@@ -26,6 +26,9 @@
     def __init__(self):
         pass
 
+    def get_project_prefixes(self, project):
+        return [project]
+
     def supports_tags(self):
         return True
 
@@ -71,6 +74,15 @@
         """
         raise NotImplementedError
 
+    def split_project_path(self, path, project):
+        """Parse a project inside a particular project.
+
+        """
+        (pt, parsed_project, bp, ip) = self.parse(path)
+        if project is not None and parsed_project != project:
+            raise InvalidSvnBranchPath(path, self)
+        return (pt, bp, ip)
+
     def is_branch(self, path, project=None):
         """Check whether a specified path points at a branch."""
         try:

=== modified file 'repository.py'
--- a/repository.py	2008-09-06 22:49:08 +0000
+++ b/repository.py	2008-09-06 23:49:34 +0000
@@ -546,7 +546,7 @@
             raise errors.RevpropChangeFailed(SVN_REVPROP_BZR_SIGNATURE)
 
     @needs_read_lock
-    def find_branches_between(self, layout, from_revnum, to_revnum):
+    def find_branches_between(self, layout, from_revnum, to_revnum, project=None):
         deleted = set()
         created = set()
         for (paths, revnum, revprops) in self._log.iter_changes(None, from_revnum, to_revnum):
@@ -568,7 +568,7 @@
                             except SubversionException, (_, errors.ERR_FS_NOT_DIRECTORY):
                                 pass
                 try:
-                    (pt, project, bp, rp) = layout.parse(p)
+                    (pt, bp, rp) = layout.split_project_path(p, project)
                     if pt == "branch":
                         if paths[p][0] != 'D' or rp != "":
                             created.add(bp)
@@ -639,12 +639,12 @@
                                 pass
                     else:
                         try:
-                            (pt, proj, bp, rp) = layout.parse(p)
+                            (pt, bp, rp) = layout.split_project_path(p, project)
                         except errors.InvalidSvnBranchPath:
                             continue
                         except NotBranchError:
                             continue
-                        if pt != "tag" or (project is not None and proj != project):
+                        if pt != "tag":
                             continue
                         if action == "D" and rp == "":
                             tag_changes[p] = None
@@ -698,7 +698,7 @@
                     layout=layout, mapping=mapping, from_revnum=0, to_revnum=revnum)
         return self._cached_tags[layout,mapping]
 
-    def find_branchpaths(self, check_path, check_parent_path, 
+    def find_branchpaths(self, layout,
                          from_revnum=0, to_revnum=None, 
                          project=None):
         """Find all branch paths that were changed in the specified revision 
@@ -716,21 +716,26 @@
 
         ret = []
 
+        if project is not None:
+            prefixes = layout.get_project_prefixes(project)
+        else:
+            prefixes = [""]
+
         pb = ui.ui_factory.nested_progress_bar()
         try:
-            for (paths, i, revprops) in self._log.iter_changes([""], from_revnum, to_revnum):
+            for (paths, i, revprops) in self._log.iter_changes(prefixes, from_revnum, to_revnum):
                 pb.update("finding branches", i, to_revnum)
                 if self.transport.has_capability("log-revprops") and is_bzr_revision_revprops(revprops) is not None:
                     continue
                 for p in sorted(paths.keys()):
-                    if check_path(p, project):
+                    if layout.is_branch_or_tag(p, project):
                         if paths[p][0] in ('R', 'D') and p in created_branches:
                             ret.append((p, created_branches[p], False))
                             del created_branches[p]
 
                         if paths[p][0] in ('A', 'R', 'M'): 
                             created_branches[p] = i
-                    elif check_parent_path(p, project):
+                    elif layout.is_branch_or_tag_parent(p, project):
                         if paths[p][0] in ('R', 'D'):
                             k = created_branches.keys()
                             for c in k:
@@ -744,9 +749,9 @@
                                 try:
                                     for c in self.transport.get_dir(p, i)[0].keys():
                                         n = p+"/"+c
-                                        if check_path(n, project):
+                                        if layout.is_branch_or_tag(n, project):
                                             created_branches[n] = i
-                                        elif check_parent_path(n, project):
+                                        elif layout.is_branch_or_tag_parent(n, project):
                                             parents.append(n)
                                 except SubversionException, (_, errors.ERR_FS_NOT_DIRECTORY):
                                     pass
@@ -782,11 +787,8 @@
             for (project, branch, nick) in it:
                 yield (branch, to_revnum, True)
         else:
-            check_path_fn = layout.is_branch_or_tag
-            check_parent_path_fn = layout.is_branch_or_tag_parent
             for (branch, revno, exists) in self.find_branchpaths(
-                check_path_fn, check_parent_path_fn,
-                from_revnum, to_revnum, project):
+                    layout, from_revnum, to_revnum, project):
                 yield (branch, revno, exists)
 
     def abort_write_group(self):

=== modified file 'revmeta.py'
--- a/revmeta.py	2008-09-06 21:56:26 +0000
+++ b/revmeta.py	2008-09-06 23:49:34 +0000
@@ -485,7 +485,7 @@
         if prev is not None:
             yield prev
 
-    def iter_all_changes(self, layout, mapping, from_revnum, to_revnum=0, pb=None):
+    def iter_all_changes(self, layout, mapping, from_revnum, to_revnum=0, project=None, pb=None):
         assert from_revnum >= to_revnum
         metabranches = {}
         if mapping is None:
@@ -498,8 +498,13 @@
             if not bp in metabranches:
                 metabranches[bp] = RevisionMetadataBranch(mapping)
             return metabranches[bp]
+
+        if project is not None:
+            prefixes = layout.get_project_prefixes(project)
+        else:
+            prefixes = [""]
         unusual = set()
-        for (paths, revnum, revprops) in self._log.iter_changes(None, from_revnum, to_revnum, pb=pb):
+        for (paths, revnum, revprops) in self._log.iter_changes(prefixes, from_revnum, to_revnum, pb=pb):
             bps = {}
             if pb:
                 pb.update("discovering revisions", revnum, from_revnum-revnum)
@@ -508,7 +513,7 @@
                 action = paths[p][0]
 
                 try:
-                    (_, _, bp, ip) = layout.parse(p)
+                    (_, bp, ip) = layout.split_project_path(p, project)
                 except errors.NotBranchError:
                     pass
                     for u in unusual:
@@ -530,7 +535,7 @@
                     del metabranches[new_name]
                     if mapping_check_path(old_name):
                         metabranches[old_name] = data
-                        if not layout.is_branch_or_tag(old_name):
+                        if not layout.is_branch_or_tag(old_name, project):
                             unusual.add(old_name)
 
             for bp in bps:
@@ -539,6 +544,6 @@
                 yield revmeta
     
         # Make sure commit 0 is processed
-        if to_revnum == 0 and layout.is_branch_or_tag(""):
+        if to_revnum == 0 and layout.is_branch_or_tag("", project):
             bps[""] = get_metabranch("")
             yield self.get_revision("", 0, {"": ('A', None, -1)}, {}, metabranch=bps[""])




More information about the bazaar-commits mailing list