Rev 2212: Fix tests. in file:///data/jelmer/bzr-svn/mappings/

Jelmer Vernooij jelmer at samba.org
Sun Dec 7 02:58:32 GMT 2008


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

------------------------------------------------------------
revno: 2212
revision-id: jelmer at samba.org-20081207025826-sptapcukknl1qyh9
parent: jelmer at samba.org-20081207012310-rczcon6voppjl923
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: mappings
timestamp: Sun 2008-12-07 03:58:26 +0100
message:
  Fix tests.
modified:
  TODO                           todo-20060729211917-2kpobww0zyvvo0j2-1
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-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
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
  tests/mapping_implementations/test_base.py test_base.py-20080904055908-3t0g1y0qnmr6aeiq-1
  tests/test_mapping.py          test_mapping.py-20080201131338-0zd86eznn4bojtee-1
=== modified file 'TODO'
--- a/TODO	2008-12-07 00:58:59 +0000
+++ b/TODO	2008-12-07 02:58:26 +0000
@@ -6,7 +6,6 @@
  - set-revprops should refuse to work when there is no commit-revprops capability
  - special fileproperty bzr:use-revprops for use when quick_revprops is not available
 - automatically disable cache in some situations, allow partial cache?
-- avoid checking properties in get_appropriate_mappings() unless really necessary
 - in-memory caching of revid mapping (LRUCache ?)
 - warn when retrieving revision properties slowly
 - inventory problem that shows up in bigboard, evolution

=== modified file 'commit.py'
--- a/commit.py	2008-12-07 01:23:10 +0000
+++ b/commit.py	2008-12-07 02:58:26 +0000
@@ -396,16 +396,24 @@
             raise BzrError("Please upgrade your Subversion client libraries to 1.5 or higher to be able to commit with Subversion mapping %s" % self.mapping.name)
 
         self._svn_revprops = {}
+        self._svnprops = lazy_dict({}, lambda: dict(self._base_branch_props.iteritems()))
         if self.supports_custom_revprops and self.mapping.can_use_revprops:
             self.set_custom_revprops = True
             self.set_custom_fileprops = self.mapping.must_use_fileprops
             # If possible, submit signature directly
             if opt_signature is not None:
                 self._svn_revprops[mapping.SVN_REVPROP_BZR_SIGNATURE] = opt_signature
+            # Set hint for potential clients that they have to check revision 
+            # properties
+            if (not self.set_custom_fileprops and 
+                self.repository.transport.has_capability("log-revprops")):
+                # Tell clients about first approximate use of revision 
+                # properties
+                self.mapping.export_revprop_redirect(
+                    self.repository.get_latest_revnum()+1, self._svnprops)
         else:
             self.set_custom_fileprops = True
             self.set_custom_revprops = False
-        self._svnprops = lazy_dict({}, lambda: dict(self._base_branch_props.iteritems()))
         revno = self.base_revno + 1
         if self.set_custom_fileprops:
             self.mapping.export_revision_fileprops(

=== modified file 'mapping.py'
--- a/mapping.py	2008-12-07 01:23:10 +0000
+++ b/mapping.py	2008-12-07 02:58:26 +0000
@@ -37,6 +37,7 @@
 SVN_PROP_BZR_LOG = 'bzr:log'
 SVN_PROP_BZR_REQUIRED_FEATURES = 'bzr:required-features'
 SVN_PROP_BZR_HIDDEN = 'bzr:hidden'
+SVN_PROP_BZR_REVPROP_REDIRECT = 'bzr:see-revprops'
 
 SVN_REVPROP_BZR_COMMITTER = 'bzr:committer'
 SVN_REVPROP_BZR_FILEIDS = 'bzr:file-ids'
@@ -266,18 +267,25 @@
     :param props: Dictionary with Subversion revision properties.
     :param rev: Revision object
     """
+    changed = False
     if props.has_key(SVN_REVPROP_BZR_TIMESTAMP):
         (rev.timestamp, rev.timezone) = unpack_highres_date(props[SVN_REVPROP_BZR_TIMESTAMP])
+        changed = True
 
     if props.has_key(SVN_REVPROP_BZR_COMMITTER):
         rev.committer = props[SVN_REVPROP_BZR_COMMITTER].decode("utf-8")
+        changed = True
 
     if props.has_key(SVN_REVPROP_BZR_LOG):
         rev.message = props[SVN_REVPROP_BZR_LOG]
+        changed = True
 
     for name, value in props.iteritems():
         if name.startswith(SVN_REVPROP_BZR_REVPROP_PREFIX):
             rev.properties[name[len(SVN_REVPROP_BZR_REVPROP_PREFIX):]] = value
+        changed = True
+
+    return changed
 
 
 def parse_required_features_property(text):
@@ -376,6 +384,7 @@
 
         :param revprops: Dictionary with Subversion revision properties.
         :param rev: Revision object to import data into.
+        :return: Whether or not any metadata was found
         """
         raise NotImplementedError(self.import_revision_revprops)
 
@@ -386,6 +395,7 @@
         :param fileprops: Dictionary with Subversion file properties on the 
                           branch root.
         :param rev: Revision object to import data into.
+        :return: Whether or not any metadata was found
         """
         raise NotImplementedError(self.import_revision_fileprops)
 
@@ -551,6 +561,9 @@
     def show_foreign_revid(self, (uuid, bp, revnum)):
         return { "svn revno": "%d (on /%s)" % (revnum, bp)}
 
+    def export_revprop_redirect(self, revnum, fileprops):
+        raise NotImplementedError(self.export_revprop_redirect)
+
 
 def parse_fileid_property(text):
     """Pares a fileid file or revision property.
@@ -609,9 +622,8 @@
         metadata = fileprops.get(SVN_PROP_BZR_REVISION_INFO)
         if metadata is not None:
             parse_revision_metadata(metadata[1], rev)
-
-    def import_revision_revprops(self, svn_revprops, rev):
-        pass
+            return True
+        return False
 
     def import_text_parents_fileprops(self, fileprops):
         metadata = fileprops.get(SVN_PROP_BZR_TEXT_PARENTS)
@@ -619,21 +631,12 @@
             return {}
         return parse_text_parents_property(metadata[1])
 
-    def import_text_parents_revprops(self, svn_revprops):
-        return {}
-
     def import_text_revisions_fileprops(self, fileprops):
         metadata = fileprops.get(SVN_PROP_BZR_TEXT_REVISIONS)
         if metadata is None:
             return {}
         return parse_text_revisions_property(metadata[1])
 
-    def import_text_revisions_revprops(self, svn_revprops):
-        return {}
-
-    def export_text_parents_revprops(self, text_parents, revprops):
-        pass
-
     def export_text_parents_fileprops(self, text_parents, fileprops):
         if text_parents != {}:
             fileprops[SVN_PROP_BZR_TEXT_PARENTS] = generate_text_parents_property(text_parents)
@@ -646,9 +649,6 @@
         elif SVN_PROP_BZR_TEXT_REVISIONS in fileprops:
             fileprops[SVN_PROP_BZR_TEXT_REVISIONS] = ""
 
-    def export_text_revisions_revprops(self, text_revisions, revprops):
-        pass
-
     def get_rhs_parents_fileprops(self, fileprops):
         bzr_merges = fileprops.get(SVN_PROP_BZR_ANCESTRY+self.name, None)
         if bzr_merges is not None:
@@ -664,9 +664,6 @@
 
         return ()
 
-    def get_rhs_parents_revprops(self, revprops):
-        return ()
-
     def get_rhs_ancestors(self, fileprops):
         ancestry = []
         for l in fileprops.get(SVN_PROP_BZR_ANCESTRY+self.name, (None, ""))[1].splitlines():
@@ -708,9 +705,6 @@
     def export_message_fileprops(self, message, fileprops):
         fileprops[SVN_PROP_BZR_LOG] = message.encode("utf-8")
 
-    def get_revision_id_revprops(self, revprops):
-        return (None, None)
-
     def get_revision_id_fileprops(self, fileprops):
         # Lookup the revision from the bzr:revision-id-vX property
         text = fileprops.get(SVN_PROP_BZR_REVISION_ID+self.name, None)
@@ -740,34 +734,22 @@
         elif SVN_PROP_BZR_FILEIDS in fileprops:
             fileprops[SVN_PROP_BZR_FILEIDS] = ""
 
-    def export_fileid_map_revprops(self, fileids, revprops):
-        pass
-
 
 class BzrSvnMappingRevProps(object):
 
     def import_revision_revprops(self, svn_revprops, rev):
-        parse_bzr_svn_revprops(svn_revprops, rev)
-
-    def import_revision_fileprops(self, fileprops, rev):
-        pass
+        return parse_bzr_svn_revprops(svn_revprops, rev)
 
     def import_fileid_map_revprops(self, svn_revprops):
         if not svn_revprops.has_key(SVN_REVPROP_BZR_FILEIDS):
             return {}
         return parse_fileid_property(svn_revprops[SVN_REVPROP_BZR_FILEIDS])
 
-    def import_text_parents_fileprops(self, fileprops):
-        return {}
-
     def import_text_parents_revprops(self, svn_revprops):
         if not svn_revprops.has_key(SVN_REVPROP_BZR_TEXT_PARENTS):
             return {}
         return parse_text_parents_property(svn_revprops[SVN_REVPROP_BZR_TEXT_PARENTS])
 
-    def export_text_parents_fileprops(self, text_parents, fileprops):
-        pass
-
     def export_text_parents_revprops(self, text_parents, svn_revprops):
         if text_parents != {}:
             svn_revprops[SVN_REVPROP_BZR_TEXT_PARENTS] = generate_text_parents_property(text_parents)
@@ -777,34 +759,19 @@
             return {}
         return parse_text_revisions_property(svn_revprops[SVN_REVPROP_BZR_TEXT_REVISIONS])
 
-    def import_text_revisions_fileprops(self, fileprops):
-        return {}
-
     def export_text_revisions_revprops(self, text_revisions, svn_revprops):
         if text_revisions != {}:
             svn_revprops[SVN_REVPROP_BZR_TEXT_REVISIONS] = generate_text_revisions_property(text_revisions)
 
-    def export_text_revisions_fileprops(self, text_revisions, fileprops):
-        pass
-
     def get_lhs_parent_revprops(self, svn_revprops):
         return svn_revprops.get(SVN_REVPROP_BZR_BASE_REVISION)
 
-    def get_lhs_parent_fileprops(self, fileprops):
-        return None
-
     def get_rhs_parents_revprops(self, svn_revprops):
         return tuple(svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines())
 
-    def get_rhs_parents_fileprops(self, fileprops):
-        return ()
-
     def get_branch_root(self, revprops):
         return revprops.get(SVN_REVPROP_BZR_ROOT)
 
-    def get_revision_id_fileprops(self, fileprops):
-        return (None, None)
-
     def get_revision_id_revprops(self, revprops):
         if (not is_bzr_revision_revprops(revprops) or 
             not SVN_REVPROP_BZR_REVISION_ID in revprops):
@@ -847,12 +814,6 @@
         if fileids != {}:
             revprops[SVN_REVPROP_BZR_FILEIDS] = generate_fileid_property(fileids)
 
-    def export_fileid_map_fileprops(self, fileids, fileprops):
-        pass
-
-    def get_rhs_ancestors(self, fileprops):
-        raise NotImplementedError(self.get_rhs_ancestors)
-
 
 class SubversionMappingRegistry(foreign.VcsMappingRegistry):
 

=== modified file 'mapping2.py'
--- a/mapping2.py	2008-12-07 01:23:10 +0000
+++ b/mapping2.py	2008-12-07 02:58:26 +0000
@@ -74,38 +74,23 @@
     def is_tag(self, tag_path):
         return False
 
-    def import_revision_revprops(self, svn_revprops, rev):
-        pass
-
     def import_revision_fileprops(self, fileprops, rev):
-        pass
+        return True
 
     def generate_file_id(self, uuid, revnum, branch, inv_path):
         if inv_path == u"":
             return ROOT_ID
         return "%s-%s" % (self.revision_id_foreign_to_bzr((uuid, branch, revnum)), escape_svn_path(inv_path.encode("utf-8")))
 
-    def import_fileid_map_revprops(self, revprops):
-        return {}
-
     def import_fileid_map_fileprops(self, fileprops):
         return {}
 
     def import_text_parents_fileprops(self, fileprops):
         return {}
 
-    def import_text_parents_revprops(self, revprops):
-        return {}
-
-    def import_text_revisions_revprops(self, svn_revprops):
-        return {}
-
     def import_text_revisions_fileprops(self, fileprops):
         return {}
 
-    def get_rhs_parents_revprops(self, revprops):
-        return ()
-
     def get_rhs_parent_fileprops(self, fileprops):
         value = fileprops.get(SVN_PROP_BZR_MERGE, "")
         if value == "":

=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py	2008-12-07 00:58:59 +0000
+++ b/mapping3/__init__.py	2008-12-07 02:58:26 +0000
@@ -315,30 +315,29 @@
     def export_text_parents_revprops(self, text_parents, svn_revprops):
         self.revprop_map.export_text_parents_revprops(text_parents, svn_revprops)
 
-    def export_text_parents_fileprops(self, text_parents, fileprops):
-        mapping.BzrSvnMappingFileProps.export_text_parents_fileprops(self, text_parents, fileprops)
-
     def export_text_revisions_revprops(self, text_revisions, svn_revprops):
         self.revprop_map.export_text_revisions_revprops(text_revisions, svn_revprops)
 
-    def export_text_revisions_fileprops(self, text_revisions, fileprops):
-        mapping.BzrSvnMappingFileProps.export_text_revisions_fileprops(self, text_revisions, fileprops)
-
     def export_revision_revprops(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops):
         self.revprop_map.export_revision_revprops(branch_root, timestamp, timezone, committer, revprops, None, revno, parent_ids, svn_revprops)
 
-    def export_revision_fileprops(self, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_fileprops):
-        mapping.BzrSvnMappingFileProps.export_revision_fileprops(self, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_fileprops)
-
-    def export_fileid_map_fileprops(self, fileids, fileprops):
-        mapping.BzrSvnMappingFileProps.export_fileid_map_fileprops(self, fileids, fileprops)
-
     def export_fileid_map_revprops(self, fileids, revprops):
-        self.revprop_map.export_fileid_map(fileids, revprops)
-
-    def export_message_fileprops(self, log, fileprops):
-        mapping.BzrSvnMappingFileProps.export_message_fileprops(self, log, fileprops)
+        self.revprop_map.export_fileid_map_revprops(fileids, revprops)
+
+    def import_fileid_map_revprops(self, revprops):
+        return self.revprop_map.import_fileid_map_revprops(revprops)
+
+    def import_text_revisions_revprops(self, revprops):
+        return self.revprop_map.import_text_revisions_revprops(revprops)
+
+    def import_text_parents_revprops(self, revprops):
+        return self.revprop_map.import_text_parents_revprops(revprops)
+
+    def import_revision_revprops(self, revprops, rev):
+        return self.revprop_map.import_revision_revprops(revprops, rev)
 
     def export_message_revprops(self, log, revprops):
-        self.revprop_map.export_message(log, revprops)
+        self.revprop_map.export_message_revprops(log, revprops)
 
+    def get_revision_id_revprops(self, revprops):
+        return self.revprop_map.get_revision_id_revprops(revprops)

=== modified file 'mapping4.py'
--- a/mapping4.py	2008-12-07 01:23:10 +0000
+++ b/mapping4.py	2008-12-07 02:58:26 +0000
@@ -159,13 +159,13 @@
             features = mapping.parse_required_features_property(svn_revprops[mapping.SVN_REVPROP_BZR_REQUIRED_FEATURES])
             assert features.issubset(supported_features), "missing feature: %r" % features.difference(supported_features)
         assert svn_revprops.get(mapping.SVN_REVPROP_BZR_MAPPING_VERSION) in (None, self.name), "unknown mapping: %s" % svn_revprops[mapping.SVN_REVPROP_BZR_MAPPING_VERSION]
-        self.revprops.import_revision_revprops(svn_revprops, rev)
+        return self.revprops.import_revision_revprops(svn_revprops, rev)
 
     def import_revision_fileprops(self, fileprops, rev):
         if fileprops.has_key(mapping.SVN_PROP_BZR_REQUIRED_FEATURES):
             features = mapping.parse_required_features_property(fileprops[mapping.SVN_PROP_BZR_REQUIRED_FEATURES])
             assert features.issubset(supported_features), "missing feature: %r" % features.difference(supported_features)
-        self.fileprops.import_revision_fileprops(fileprops, rev)
+        return self.fileprops.import_revision_fileprops(fileprops, rev)
 
     def get_mandated_layout(self, repository):
         return None
@@ -189,3 +189,7 @@
 
     def supports_tags(self):
         return True
+
+    def export_revprop_redirect(self, revnum, fileprops):
+        if not mapping.SVN_PROP_BZR_REVPROP_REDIRECT in fileprops:
+            fileprops[mapping.SVN_PROP_BZR_REVPROP_REDIRECT] = str(revnum)

=== modified file 'repository.py'
--- a/repository.py	2008-12-06 22:16:14 +0000
+++ b/repository.py	2008-12-07 02:58:26 +0000
@@ -725,8 +725,6 @@
         try:
             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 layout.is_branch_or_tag(p, project):
                         if paths[p][0] in ('R', 'D') and p in created_branches:

=== modified file 'revmeta.py'
--- a/revmeta.py	2008-12-07 01:23:10 +0000
+++ b/revmeta.py	2008-12-07 02:58:26 +0000
@@ -550,9 +550,10 @@
                               parent_ids=parent_ids)
 
         parse_svn_revprops(self.get_revprops(), rev)
-        mapping.import_revision_revprops(self.get_revprops(), rev)
-
-        mapping.import_revision_fileprops(self.get_changed_fileprops(), rev)
+        self._import_from_props(mapping, 
+            lambda changed_fileprops: mapping.import_revision_fileprops(changed_fileprops, rev),
+            lambda revprops: mapping.import_revision_revprops(revprops, rev),
+            False)
 
         rev.svn_meta = self
 
@@ -560,11 +561,12 @@
 
     def _import_from_props(self, mapping, fileprop_fn, revprop_fn, default):
         # FIXME: Magic happens here
+        # FIXME: Check whatever is available first
         if mapping is None or mapping.can_use_fileprops:
             ret = fileprop_fn(self.get_changed_fileprops())
             if ret != default:
                 return ret
-        if mapping is not None and mapping.must_use_file_props:
+        if mapping is not None and mapping.must_use_fileprops:
             return default
         if mapping is None or mapping.can_use_revprops:
             if mapping is None or mapping.get_branch_root(self.get_revprops()) == self.branch_path:

=== modified file 'tests/mapping_implementations/test_base.py'
--- a/tests/mapping_implementations/test_base.py	2008-12-07 01:23:10 +0000
+++ b/tests/mapping_implementations/test_base.py	2008-12-07 02:58:26 +0000
@@ -17,7 +17,7 @@
 from bzrlib.revision import Revision
 from bzrlib.tests import TestCase, TestNotApplicable
 
-from bzrlib.plugins.svn.mapping import mapping_registry
+from bzrlib.plugins.svn.mapping import mapping_registry, parse_svn_revprops
 from subvertpy import properties
 
 def changed_props(props):
@@ -56,9 +56,9 @@
             raise TestNotApplicable
         fileids = {"": "some-id", "bla/blie": "other-id"}
         revprops = {}
+        revprops["svn:date"] = "2008-11-03T09:33:00.716938Z"
         self.mapping.export_revision_revprops("branchp", 432432432.0, 0, "somebody", {}, "arevid", 4, ["merge1"], revprops)
         self.mapping.export_fileid_map_revprops(fileids, revprops)
-        revprops["svn:date"] = "2008-11-03T09:33:00.716938Z"
         self.assertEquals(fileids, 
                 self.mapping.import_fileid_map_revprops(revprops))
 
@@ -163,6 +163,7 @@
                                      {"arevprop": "val" }, "arevid", 4, ["parent", "merge1"], revprops)
         targetrev = Revision(None)
         revprops["svn:date"] = "2008-11-03T09:33:00.716938Z"
+        parse_svn_revprops(revprops, targetrev)
         self.mapping.import_revision_revprops(revprops, targetrev)
         self.assertEquals(targetrev.committer, "somebody")
         self.assertEquals(targetrev.properties, {"arevprop": "val"})
@@ -205,14 +206,4 @@
                 self.mapping.revision_id_foreign_to_bzr(("myuuid", "bla", 5))))
 
 
-    def test_import_revision_svnprops(self):
-        rev = Revision(None)
-        self.mapping.import_revision_revprops({"svn:log": "A log msg",
-                                      "svn:author": "Somebody",
-                                      "svn:date": "2008-11-03T09:33:00.716938Z"},  rev)
-        self.assertEquals("Somebody", rev.committer)
-        self.assertEquals("A log msg", rev.message)
-        self.assertEquals({}, rev.properties)
-        self.assertEquals(1225704780.716938, rev.timestamp)
-        self.assertEquals(0.0, rev.timezone)
 

=== modified file 'tests/test_mapping.py'
--- a/tests/test_mapping.py	2008-11-12 10:24:38 +0000
+++ b/tests/test_mapping.py	2008-12-07 02:58:26 +0000
@@ -257,3 +257,18 @@
                     mapping.SVN_PROP_BZR_REVISION_ID+"v90-ll": "50 brevid\n",
                     "otherrevprop": "fsldds",
                     })))
+
+
+class TestParseSvnProps(TestCase):
+
+    def test_import_revision_svnprops(self):
+        rev = Revision(None)
+        mapping.parse_svn_revprops({"svn:log": "A log msg",
+                                      "svn:author": "Somebody",
+                                      "svn:date": "2008-11-03T09:33:00.716938Z"},  rev)
+        self.assertEquals("Somebody", rev.committer)
+        self.assertEquals("A log msg", rev.message)
+        self.assertEquals({}, rev.properties)
+        self.assertEquals(1225704780.716938, rev.timestamp)
+        self.assertEquals(0.0, rev.timezone)
+




More information about the bazaar-commits mailing list