Rev 1712: pushing with v4 mappings works in file:///data/jelmer/bzr-svn/trunk/

Jelmer Vernooij jelmer at samba.org
Sat Aug 30 02:11:50 BST 2008


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

------------------------------------------------------------
revno: 1712
revision-id: jelmer at samba.org-20080830011146-9bkqhhay4wygnvkh
parent: jelmer at samba.org-20080830004033-jwoyzljlkfmzyogg
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Sat 2008-08-30 03:11:46 +0200
message:
  pushing with v4 mappings works
modified:
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  layout.py                      layout.py-20080323165407-y9qw8nx4oykvoe1k-1
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  mapping3/__init__.py           __init__.py-20080502174630-9324zh25kka98vlw-1
  mapping4.py                    mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  revids.py                      revids.py-20070416220458-36vfa0730cchevp1-1
=== modified file 'commit.py'
--- a/commit.py	2008-08-30 00:40:33 +0000
+++ b/commit.py	2008-08-30 01:11:46 +0000
@@ -204,7 +204,7 @@
         self._svnprops = lazy_dict({}, lambda: dict(self._base_branch_props.items()))
         self.base_mapping.export_revision(
             self.branch.get_branch_path(), timestamp, timezone, committer, revprops, 
-            revision_id, self.base_revno+1, merges, self._svn_revprops, self._svnprops)
+            revision_id, self.base_revno+1, parents, self._svn_revprops, self._svnprops)
 
         if len(merges) > 0:
             new_svk_merges = update_svk_features(self._base_branch_props.get(SVN_PROP_SVK_MERGE, ""), merges)
@@ -558,10 +558,10 @@
 
         assert self.revision_metadata is not None
 
-        self.repository._clear_cached_state()
-
         (result_revision, result_date, result_author) = self.revision_metadata
 
+        self.repository._clear_cached_state(result_revision)
+
         revid = self.branch.generate_revision_id(result_revision)
 
         assert not self.push_metadata or self._new_revision_id is None or self._new_revision_id == revid

=== modified file 'layout.py'
--- a/layout.py	2008-08-30 00:40:33 +0000
+++ b/layout.py	2008-08-30 01:11:46 +0000
@@ -13,8 +13,12 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from bzrlib import urlutils
+from bzrlib import urlutils, ui
 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.ra import DIRENT_KIND
 
 class RepositoryLayout(object):
     """Describes a repository layout."""
@@ -83,6 +87,12 @@
             return True
         return False
 
+    def is_branch_parent(self, path, project=None):
+        return self.is_branch(urlutils.join(path, "trunk"), project)
+
+    def is_tag_parent(self, path, project=None):
+        return self.is_tag(urlutils.join(path, "trunk"), project)
+
     def is_branch_or_tag(self, path, project=None):
         return self.is_branch(path, project) or self.is_tag(path, project)
 
@@ -107,6 +117,7 @@
 class ConfigBasedLayout(RepositoryLayout):
 
     def __init__(self, repository):
+        self.repository = repository
         self._config = repository.get_config()
 
     def get_tag_path(self, name, project=""):
@@ -116,14 +127,14 @@
         :param project: Optional name of the project the tag is for. Can include slashes.
         :return: Path of the tag."
         """
-        return urlutils.join(project, "tags", name)
+        return urlutils.join(project, "tags", name).strip("/")
 
     def get_tag_name(self, path, project=""):
         """Determine the tag name from a tag path.
 
         :param path: Path inside the repository.
         """
-        return urlutils.basename(path)
+        return urlutils.basename(path).strip("/")
 
     def push_merged_revisions(self, project=""):
         """Determine whether or not right hand side (merged) revisions should be pushed.
@@ -141,7 +152,7 @@
         :param project: Optional name of the project the branch is for. Can include slashes.
         :return: Path of the branch.
         """
-        return urlutils.join(project, "branches", name)
+        return urlutils.join(project, "branches", name).strip("/")
 
     def parse(self, path):
         """Parse a path.
@@ -161,23 +172,88 @@
                 else:
                     t = "branch"
                     j = i
-                return (t, "/".join(parts[:j-1]).strip("/"), "/".join(parts[:i]).strip("/"), "/".join(parts[i+1:]))
-        raise InvalidSvnBranchPath(path, self)
+                return (t, "/".join(parts[:j-1]).strip("/"), "/".join(parts[:i]).strip("/"), "/".join(parts[i+1:]).strip("/"))
+        raise NotBranchError(path)
 
-    def get_branches(self, revnum, project="", pb=None):
+    def get_branches(self, revnum, project=None, pb=None):
         """Retrieve a list of paths that refer to branches in a specific revision.
 
         :result: Iterator over tuples with (project, branch path)
         """
-        raise NotImplementedError
+        return get_root_paths(self.repository, ["branches/*", "trunk"], revnum, self.is_tag, project)
 
-    def get_tags(self, revnum, project="", pb=None):
+    def get_tags(self, revnum, project=None, pb=None):
         """Retrieve a list of paths that refer to tags in a specific revision.
 
         :result: Iterator over tuples with (project, branch path)
         """
-        raise NotImplementedError
+        return get_root_paths(self.repository, ["tags/*"], revnum, self.is_tag, project)
 
     def __repr__(self):
         return "%s()" % self.__class__.__name__
 
+def expand_branch_pattern(begin, todo, check_path, get_children, project=None):
+    """Find the paths in the repository that match the expected branch pattern.
+
+    :param begin: List of path elements currently opened.
+    :param todo: List of path elements to still evaluate (including wildcards)
+    :param check_path: Function for checking a path exists
+    :param get_children: Function for retrieving the children of a path
+    """
+    mutter('expand branches: %r, %r', begin, todo)
+    path = "/".join(begin)
+    if (project is not None and 
+        not project.startswith(path) and 
+        not path.startswith(project)):
+        return []
+    # If all elements have already been handled, just check the path exists
+    if len(todo) == 0:
+        if check_path(path):
+            return [path]
+        else:
+            return []
+    # Not a wildcard? Just expand next bits
+    if todo[0] != "*":
+        return expand_branch_pattern(begin+[todo[0]], todo[1:], check_path, 
+                                     get_children, project)
+    children = get_children(path)
+    if children is None:
+        return []
+    ret = []
+    pb = ui.ui_factory.nested_progress_bar()
+    try:
+        for idx, c in enumerate(children):
+            pb.update("browsing branches", idx, len(children))
+            if len(todo) == 1:
+                # Last path element, so return directly
+                ret.append("/".join(begin+[c]))
+            else:
+                ret += expand_branch_pattern(begin+[c], todo[1:], check_path, 
+                                             get_children, project)
+    finally:
+        pb.finished()
+    return ret
+
+def get_root_paths(repository, itemlist, revnum, verify_fn, project=None, pb=None):
+    def check_path(path):
+        return repository.transport.check_path(path, revnum) == NODE_DIR
+    def find_children(path):
+        try:
+            assert not path.startswith("/")
+            dirents = repository.transport.get_dir(path, revnum, DIRENT_KIND)[0]
+        except SubversionException, (msg, num):
+            if num in (ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND):
+                return None
+            raise
+        return [d for d in dirents if dirents[d]['kind'] == NODE_DIR]
+
+    for idx, pattern in enumerate(itemlist):
+        if pb is not None:
+            pb.update("finding branches", idx, len(itemlist))
+        for bp in expand_branch_pattern([], pattern.split("/"), check_path,
+                find_children, project):
+            if verify_fn(bp, project):
+                yield "", bp, bp.split("/")[-1]
+
+
+

=== modified file 'mapping.py'
--- a/mapping.py	2008-08-30 00:40:33 +0000
+++ b/mapping.py	2008-08-30 01:11:46 +0000
@@ -629,9 +629,7 @@
 
     def get_rhs_parents(self, branch_path, svn_revprops, 
                         fileprops):
-        if svn_revprops[SVN_REVPROP_BZR_ROOT] != branch:
-            return []
-        return svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines()
+        return tuple(svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines())
 
     def get_branch_root(self, revprops):
         return revprops[SVN_REVPROP_BZR_ROOT]

=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py	2008-08-29 21:48:03 +0000
+++ b/mapping3/__init__.py	2008-08-30 01:11:46 +0000
@@ -18,9 +18,7 @@
 from bzrlib.trace import mutter
 
 from bzrlib.plugins.svn import mapping, properties
-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.layout import RepositoryLayout
+from bzrlib.plugins.svn.layout import RepositoryLayout, get_root_paths
 from bzrlib.plugins.svn.mapping3.scheme import (BranchingScheme, guess_scheme_from_branch_path, 
                              guess_scheme_from_history, ListBranchingScheme, 
                              parse_list_scheme_text, NoBranchingScheme,
@@ -33,49 +31,6 @@
 # Number of revisions to evaluate when guessing the branching scheme
 SCHEME_GUESS_SAMPLE_SIZE = 2000
 
-def expand_branch_pattern(begin, todo, check_path, get_children, project=None):
-    """Find the paths in the repository that match the expected branch pattern.
-
-    :param begin: List of path elements currently opened.
-    :param todo: List of path elements to still evaluate (including wildcards)
-    :param check_path: Function for checking a path exists
-    :param get_children: Function for retrieving the children of a path
-    """
-    mutter('expand branches: %r, %r', begin, todo)
-    path = "/".join(begin)
-    if (project is not None and 
-        not project.startswith(path) and 
-        not path.startswith(project)):
-        return []
-    # If all elements have already been handled, just check the path exists
-    if len(todo) == 0:
-        if check_path(path):
-            return [path]
-        else:
-            return []
-    # Not a wildcard? Just expand next bits
-    if todo[0] != "*":
-        return expand_branch_pattern(begin+[todo[0]], todo[1:], check_path, 
-                                     get_children, project)
-    children = get_children(path)
-    if children is None:
-        return []
-    ret = []
-    pb = ui.ui_factory.nested_progress_bar()
-    try:
-        for idx, c in enumerate(children):
-            pb.update("browsing branches", idx, len(children))
-            if len(todo) == 1:
-                # Last path element, so return directly
-                ret.append("/".join(begin+[c]))
-            else:
-                ret += expand_branch_pattern(begin+[c], todo[1:], check_path, 
-                                             get_children, project)
-    finally:
-        pb.finished()
-    return ret
-
-
 class SchemeDerivedLayout(RepositoryLayout):
     def __init__(self, repository, scheme):
         self.repository = repository
@@ -92,32 +47,11 @@
     def get_tag_name(self, path, project=None):
         return path.split("/")[-1]
 
-    def _get_root_paths(self, itemlist, revnum, verify_fn, project=None, pb=None):
-        def check_path(path):
-            return self.repository.transport.check_path(path, revnum) == NODE_DIR
-        def find_children(path):
-            try:
-                assert not path.startswith("/")
-                dirents = self.repository.transport.get_dir(path, revnum, DIRENT_KIND)[0]
-            except SubversionException, (msg, num):
-                if num in (ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND):
-                    return None
-                raise
-            return [d for d in dirents if dirents[d]['kind'] == NODE_DIR]
-
-        for idx, pattern in enumerate(itemlist):
-            if pb is not None:
-                pb.update("finding branches", idx, len(itemlist))
-            for bp in expand_branch_pattern([], pattern.split("/"), check_path,
-                    find_children, project):
-                if verify_fn(bp, project):
-                    yield "", bp, bp.split("/")[-1]
-
     def get_branches(self, revnum, project=None, pb=None):
-        return self._get_root_paths(self.scheme.branch_list, revnum, self.scheme.is_branch, project, pb)
+        return get_root_paths(self.repository, self.scheme.branch_list, revnum, self.scheme.is_branch, project, pb)
 
     def get_tags(self, revnum, project=None, pb=None):
-        return self._get_root_paths(self.scheme.tag_list, revnum, self.scheme.is_tag, project, pb)
+        return get_root_paths(self.repository, self.scheme.tag_list, revnum, self.scheme.is_tag, project, pb)
 
     def get_tag_path(self, name, project=""):
         return self.scheme.get_tag_path(name, project)

=== modified file 'mapping4.py'
--- a/mapping4.py	2008-08-30 00:40:33 +0000
+++ b/mapping4.py	2008-08-30 01:11:46 +0000
@@ -79,6 +79,9 @@
     def __eq__(self, other):
         return type(self) == type(other)
 
+    def get_branch_root(self, revprops):
+        return self.revprops.get_branch_root(revprops)
+
     def get_lhs_parent(self, branch_path, svn_revprops, fileprops):
         return self.revprops.get_lhs_parent(branch_path, svn_revprops, fileprops)
 

=== modified file 'repository.py'
--- a/repository.py	2008-08-30 00:40:33 +0000
+++ b/repository.py	2008-08-30 01:11:46 +0000
@@ -223,6 +223,7 @@
         self.base = transport.base
         assert self.base is not None
         self._serializer = xml7.serializer_v7
+        self._config = None
         self.get_config().add_location(self.base)
         self._log = logwalker.LogWalker(transport=transport)
         self.fileid_map = FileIdMap(simple_apply_changes, self)
@@ -276,9 +277,9 @@
             self._lock_mode = None
             self._clear_cached_state()
 
-    def _clear_cached_state(self):
+    def _clear_cached_state(self, revnum=None):
         self._cached_tags = {}
-        self._cached_revnum = None
+        self._cached_revnum = revnum
         self._layout = None
         self._parents_provider = CachingParentsProvider(self._real_parents_provider)
 
@@ -776,7 +777,9 @@
             yield self._revmeta(bp, paths, revnum, revprops, svn_fileprops)
 
     def get_config(self):
-        return SvnRepositoryConfig(self.uuid)
+        if self._config is None:
+            self._config = SvnRepositoryConfig(self.uuid)
+        return self._config
 
     def has_signature_for_revision_id(self, revision_id):
         """Check whether a signature exists for a particular revision id.

=== modified file 'revids.py'
--- a/revids.py	2008-08-30 00:15:33 +0000
+++ b/revids.py	2008-08-30 01:11:46 +0000
@@ -60,23 +60,24 @@
         except InvalidRevisionId:
             pass
 
-        for entry_revid, branch, revno, mapping in self.discover_revprop_revids(0, self.repos.get_latest_revnum()):
+        last_revnum = self.repos.get_latest_revnum()
+        for entry_revid, branch, revno, mapping in self.discover_revprop_revids(0, last_revnum):
             if revid == entry_revid:
                 return (branch, revno, mapping.name)
 
-        for entry_revid, branch, revno, mapping in self.discover_fileprop_revids(layout, 0, self.repos.get_latest_revnum(), project):
+        for entry_revid, branch, revno, mapping in self.discover_fileprop_revids(layout, 0, last_revnum, project):
             if revid == entry_revid:
                 (bp, revnum, mapping_name) = self.bisect_revid_revnum(revid, branch, 0, revno)
                 return (bp, revnum, mapping_name)
         raise NoSuchRevision(self, revid)
 
     def discover_revprop_revids(self, from_revnum, to_revnum):
-        for (_, revno, revprops) in self.repos._log.iter_revs(None, from_revnum, to_revnum):
+        for (_, revno, revprops) in self.repos._log.iter_changes(None, from_revnum, to_revnum):
             if is_bzr_revision_revprops(revprops):
                 mapping = find_mapping(revprops, {})
                 (_, revid) = mapping.get_revision_id(None, revprops, {})
                 if revid is not None:
-                    yield (revid, mapping.get_branch_root(revprops), revno, mapping)
+                    yield (revid, mapping.get_branch_root(revprops).strip("/"), revno, mapping)
 
     def discover_fileprop_revids(self, layout, from_revnum, to_revnum, project=None):
         reuse_policy = self.repos.get_config().get_reuse_revisions()
@@ -191,7 +192,7 @@
                 # check again.
                 raise e
             found = None
-            for entry_revid, branch, revno, mapping in self.discover_revprop_revids(0, self.repos.get_latest_revnum()):
+            for entry_revid, branch, revno, mapping in self.actual.discover_revprop_revids(last_checked, last_revnum):
                 if entry_revid == revid:
                     found = (branch, revno, revno, mapping)
                 if entry_revid not in self.revid_seen:




More information about the bazaar-commits mailing list