Rev 2066: Remove mapping from RevisionMetadataBranch. in http://people.samba.org/bzr/jelmer/bzr-svn/0.5

Jelmer Vernooij jelmer at samba.org
Mon Nov 24 20:30:20 GMT 2008


At http://people.samba.org/bzr/jelmer/bzr-svn/0.5

------------------------------------------------------------
revno: 2066
revision-id: jelmer at samba.org-20081124203008-lv1y11f34ppn8ye6
parent: jelmer at samba.org-20081124184019-zpwlxasnspt7bome
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.5
timestamp: Mon 2008-11-24 21:30:08 +0100
message:
  Remove mapping from RevisionMetadataBranch.
modified:
  __init__.py                    __init__.py-20051008155114-eae558e6cf149e1d
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  mapping2.py                    mapping.py-20080904055555-lw057kjuadn0r2ma-2
  mapping3/__init__.py           __init__.py-20080502174630-9324zh25kka98vlw-1
  mapping4.py                    mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
  revids.py                      revids.py-20070416220458-36vfa0730cchevp1-1
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
  tests/mapping_implementations/test_repository.py test_repository.py-20080902013845-ity7d1ymye69sobm-2
=== modified file '__init__.py'
--- a/__init__.py	2008-11-18 01:02:56 +0000
+++ b/__init__.py	2008-11-24 20:30:08 +0000
@@ -249,6 +249,7 @@
                     raise BzrCommandError("%s appears to contain a branch. " 
                             "For individual branches, use 'bzr branch'." % 
                             from_location)
+                # FIXME: Hint about is_tag()
                 elif guessed_overall_layout.is_branch_parent(prefix):
                     self.outf.write("Importing branches with prefix /%s\n" % 
                         urlutils.unescape_for_display(prefix, self.outf.encoding))

=== modified file 'fileids.py'
--- a/fileids.py	2008-11-21 14:59:07 +0000
+++ b/fileids.py	2008-11-24 20:30:08 +0000
@@ -127,7 +127,7 @@
         :param mapping: Mapping
         """
         renames = revmeta.get_fileid_map(mapping)
-        changes = get_local_changes(revmeta.get_paths(), revmeta.branch_path, mapping,
+        changes = get_local_changes(revmeta.get_paths(mapping), revmeta.branch_path, mapping,
                     self.repos.get_layout(),
                     self.repos.generate_revision_id, find_children)
         if find_children is not None:

=== modified file 'mapping.py'
--- a/mapping.py	2008-11-24 17:18:00 +0000
+++ b/mapping.py	2008-11-24 20:30:08 +0000
@@ -311,6 +311,7 @@
     can_use_revprops = False
     can_use_fileprops = False
     supports_hidden = False
+    restricts_branch_paths = False
 
     def __init__(self):
         if (version_info[3] == 'exp' or self.experimental) and not BzrSvnMapping._warned_experimental:
@@ -373,6 +374,9 @@
     def is_tag(self, tag_path):
         raise NotImplementedError(self.is_tag)
 
+    def is_branch_or_tag(self, path):
+        return self.is_branch(path) or self.is_tag(path)
+
     @staticmethod
     def generate_file_id(uuid, revnum, branch, inv_path):
         """Create a file id identifying a Subversion file.

=== modified file 'mapping2.py'
--- a/mapping2.py	2008-11-18 22:33:09 +0000
+++ b/mapping2.py	2008-11-24 20:30:08 +0000
@@ -38,6 +38,7 @@
     name = "v1"
     roundtripping = False
     revid_prefix = "svn-v1"
+    restricts_branch_paths = True
 
     def __init__(self, layout):
         super(BzrSvnMappingv1, self).__init__()
@@ -128,6 +129,7 @@
     name = "v2"
     roundtripping = False
     revid_prefix = "svn-v2"
+    restricts_branch_paths = True
 
     @classmethod
     def revision_id_bzr_to_foreign(cls, revid):

=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py	2008-11-19 00:54:21 +0000
+++ b/mapping3/__init__.py	2008-11-24 20:30:08 +0000
@@ -170,6 +170,7 @@
     revid_prefix = "svn-v3-"
     roundtripping = True
     can_use_fileprops = True
+    restricts_branch_paths = True
 
     def __init__(self, scheme, guessed_scheme=None):
         mapping.BzrSvnMapping.__init__(self)

=== modified file 'mapping4.py'
--- a/mapping4.py	2008-11-19 13:04:52 +0000
+++ b/mapping4.py	2008-11-24 20:30:08 +0000
@@ -34,6 +34,7 @@
     can_use_revprops = True
     can_use_fileprops = True
     supports_hidden = True
+    restricts_branch_paths = False
 
     def __init__(self):
         self.name = "v4"

=== modified file 'revids.py'
--- a/revids.py	2008-11-21 16:13:14 +0000
+++ b/revids.py	2008-11-24 20:30:08 +0000
@@ -137,8 +137,7 @@
                 if entry_revid == revid:
                     mapping_name = propname[len(SVN_PROP_BZR_REVISION_ID):]
                     mapping = mapping_registry.parse_mapping_name("svn-" + mapping_name)
-                    assert (mapping.is_tag(revmeta.branch_path) or 
-                            mapping.is_branch(revmeta.branch_path))
+                    assert mapping.is_branch_or_tag(revmeta.branch_path)
                     return (revmeta.branch_path, revmeta.revnum, mapping)
 
         raise InvalidBzrSvnRevision(revid)

=== modified file 'revmeta.py'
--- a/revmeta.py	2008-11-24 18:40:19 +0000
+++ b/revmeta.py	2008-11-24 20:30:08 +0000
@@ -112,11 +112,20 @@
     def get_foreign_revid(self):
         return (self.uuid, self.branch_path, self.revnum)
 
-    def get_paths(self):
+    def get_paths(self, mapping=None):
         """Fetch the changed paths dictionary for this revision.
         """
         if self._paths is None:
             self._paths = self._log.get_revision_paths(self.revnum)
+        if mapping is not None and mapping.restricts_branch_paths:
+            next = changes.find_prev_location(self._paths, self.branch_path, self.revnum)
+            if next is not None and not mapping.is_branch_or_tag(next[0]):
+                # Make it look like the branch started here if the mapping (anything < v4)
+                # restricts what paths can be valid branches
+                paths = dict(self._paths.items())
+                lazypaths = logwalker.lazy_dict(paths, full_paths, self.repository._log.find_children, paths, self.branch_path, next[0], next[1])
+                paths[self.branch_path] = ('A', None, -1)
+                return lazypaths
         return self._paths
 
     def get_revision_id(self, mapping):
@@ -200,10 +209,9 @@
 
         :note: Returns None when there is no parent (parent is NULL_REVISION)
         """
-        assert (mapping.is_branch(self.branch_path) or 
-                mapping.is_tag(self.branch_path)), "%s not valid in %r" % (self.branch_path, mapping)
+        assert mapping.is_branch_or_tag(self.branch_path), "%s not valid in %r" % (self.branch_path, mapping)
         def get_next_parent(rm):
-            if rm.metabranch is not None and rm.metabranch.mapping == mapping:
+            if rm.metabranch is not None:
                 # Perhaps the metabranch already has the parent?
                 try:
                     parentrevmeta = rm.metabranch.get_lhs_parent(rm)
@@ -463,7 +471,7 @@
         (uuid, bp, revnum) = parse_svk_feature(feature)
     except svn_errors.InvalidPropertyValue:
         return None
-    if not mapping.is_branch(bp) and not mapping.is_tag(bp):
+    if not mapping.is_branch_or_tag(bp):
         return None
     return mapping.revision_id_foreign_to_bzr((uuid, bp, revnum))
 
@@ -471,11 +479,10 @@
 class RevisionMetadataBranch(object):
     """Describes a Bazaar-like branch in a Subversion repository."""
 
-    def __init__(self, mapping, next=None, revmeta_provider=None, 
+    def __init__(self, next=None, revmeta_provider=None, 
                  history_limit=None):
         self._revs = []
         self._revnums = []
-        self.mapping = mapping
         self._get_next = next
         self._history_limit = history_limit
         self._revmeta_provider = revmeta_provider
@@ -618,15 +625,13 @@
         self._revmeta_cache[path,revnum] = ret
         return ret
 
-    def iter_changes(self, branch_path, from_revnum, to_revnum, mapping=None, pb=None, limit=0):
+    def iter_changes(self, branch_path, from_revnum, to_revnum, pb=None, limit=0):
         """Iterate over all revisions backwards.
         
         :return: iterator that returns tuples with branch path, 
             changed paths, revision number, changed file properties and 
         """
         assert isinstance(branch_path, str)
-        assert mapping is None or mapping.is_branch(branch_path) or mapping.is_tag(branch_path), \
-                "Mapping %r doesn't accept %s as branch or tag" % (mapping, branch_path)
         assert from_revnum >= to_revnum
 
         bp = branch_path
@@ -641,19 +646,7 @@
             assert bp is not None
             next = changes.find_prev_location(paths, bp, revnum)
             assert revnum > 0 or bp == ""
-            assert mapping is None or mapping.is_branch(bp) or mapping.is_tag(bp), "%r is not a valid path" % bp
-
-            if (next is not None and 
-                not (mapping is None or mapping.is_branch(next[0]) or mapping.is_tag(next[0]))):
-                # Make it look like the branch started here if the mapping 
-                # doesn't support weird paths as branches
-                # TODO: Make this quicker - it can be very slow for large repos.
-                lazypaths = logwalker.lazy_dict(paths, full_paths, self._log.find_children, paths, bp, next[0], next[1])
-                paths[bp] = ('A', None, -1)
-
-                yield (bp, lazypaths, revnum, revprops)
-                return
-                     
+                    
             if changes.changes_path(paths, bp, False):
                 yield (bp, paths, revnum, revprops)
                 i += 1
@@ -666,6 +659,7 @@
                 bp = next[0]
 
     def get_mainline(self, branch_path, revnum, mapping, pb=None):
+        """Get a list with all the RevisionMetadata elements on a branch mainline."""
         return list(self.iter_reverse_branch_changes(branch_path, revnum, to_revnum=0, mapping=mapping, pb=pb))
 
     def branch_prev_location(self, revmeta, mapping):
@@ -673,11 +667,7 @@
         firstrevmeta = iterator.next()
         assert revmeta == firstrevmeta
         try:
-            parentrevmeta = iterator.next()
-            if (not mapping.is_branch(parentrevmeta.branch_path) and
-                not mapping.is_tag(parentrevmeta.branch_path)):
-                return None
-            return parentrevmeta
+            return iterator.next()
         except StopIteration:
             return None
 
@@ -688,16 +678,16 @@
 
         :return: iterator that returns RevisionMetadata objects.
         """
-        assert (mapping is None or 
-                mapping.is_branch(branch_path) or 
-                mapping.is_tag(branch_path))
+        assert mapping is None or mapping.is_branch_or_tag(branch_path)
         history_iter = self.iter_changes(branch_path, from_revnum, 
-                                              to_revnum, mapping, pb=pb, 
+                                              to_revnum, pb=pb, 
                                               limit=limit)
-        metabranch = RevisionMetadataBranch(mapping, history_iter.next, self,
+        metabranch = RevisionMetadataBranch(history_iter.next, self,
                                             limit)
         self._open_metabranches.append(metabranch)
         for ret in metabranch:
+            if mapping is not None and not mapping.is_branch_or_tag(ret.branch_path):
+                break
             yield ret
 
     def iter_all_changes(self, layout, mapping, from_revnum, to_revnum=0, 
@@ -710,14 +700,14 @@
         assert from_revnum >= to_revnum
         metabranches = {}
         if mapping is None:
-            mapping_check_path = lambda x:True
+            mapping_check_path = lambda x: True
         else:
-            mapping_check_path = lambda x: mapping.is_branch(x) or mapping.is_tag(x)
+            mapping_check_path = mapping.is_branch_or_tag
         # Layout decides which ones to pick up
         # Mapping decides which ones to keep
         def get_metabranch(bp):
             if not bp in metabranches:
-                metabranches[bp] = RevisionMetadataBranch(mapping)
+                metabranches[bp] = RevisionMetadataBranch()
             return metabranches[bp]
 
         if project is not None:

=== modified file 'tests/mapping_implementations/test_repository.py'
--- a/tests/mapping_implementations/test_repository.py	2008-11-21 12:55:46 +0000
+++ b/tests/mapping_implementations/test_repository.py	2008-11-24 20:30:08 +0000
@@ -74,12 +74,9 @@
             repos.set_layout(CustomLayout(["bla/bar"]))
         except svn_errors.LayoutUnusable:
             raise TestNotApplicable
-        ret = list(repos._revmeta_provider.iter_changes('bla/bar', 2, 0, repos.get_mapping()))
+        ret = list(repos._revmeta_provider.iter_changes('bla/bar', 2, 0))
         self.assertEquals(1, len(ret))
-        if repos.get_mapping().is_branch("foo/bar"):
-            self.assertEquals("foo/bar", ret[0][0])
-        else:
-            self.assertEquals("bla/bar", ret[0][0])
+        self.assertEquals("foo/bar", ret[0][0])
 
     def test_set_make_working_trees(self):
         repos_url = self.make_repository("a")
@@ -185,12 +182,12 @@
                   {'pygments': ('A', 'pykleur', 1)},
                     2),
                     ('pykleur', {'pykleur': ('A', None, -1), 'pykleur/bla': ('A', None, -1)}, 1)],
-                    [(l.branch_path, l.get_paths(), l.revnum) for l in changes])
+                    [(l.branch_path, l.get_paths(repos.get_mapping()), l.revnum) for l in changes])
         else:
             self.assertEquals([('pygments',
               {'pygments/bla': ('A', None, -1), 'pygments': ('A', None, -1)},
                 2)],
-                [(l.branch_path, l.get_paths(), l.revnum) for l in changes])
+                [(l.branch_path, l.get_paths(repos.get_mapping()), l.revnum) for l in changes])
 
     def test_history_all(self):
         repos_url = self.make_repository("a")




More information about the bazaar-commits mailing list