Rev 2215: More various fixes. in file:///data/jelmer/bzr-svn/mappings/

Jelmer Vernooij jelmer at samba.org
Sun Dec 7 05:20:30 GMT 2008


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

------------------------------------------------------------
revno: 2215
revision-id: jelmer at samba.org-20081207052026-hfmm5p4omd5mrv81
parent: jelmer at samba.org-20081207042006-gg02bnson2u612sg
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: mappings
timestamp: Sun 2008-12-07 06:20:26 +0100
message:
  More various fixes.
modified:
  TODO                           todo-20060729211917-2kpobww0zyvvo0j2-1
  __init__.py                    __init__.py-20051008155114-eae558e6cf149e1d
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  mapping3/__init__.py           __init__.py-20080502174630-9324zh25kka98vlw-1
  mapping4.py                    mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
  upgrade.py                     upgrade.py-20070106192108-0rakplee2lzah4gs-1
=== modified file 'TODO'
--- a/TODO	2008-12-07 04:20:06 +0000
+++ b/TODO	2008-12-07 05:20:26 +0000
@@ -2,10 +2,7 @@
 - fix update_after_commit test
 - handle upgrades from v3 properly
  - cope with old mappings in find_tags_between_*
- - set-revprops upgrades v3 stuff as well?
- - set-revprops should refuse to work when there is no commit-revprops capability
  - use special fileproperty bzr:use-revprops for when log-revprops is not available
-- make distinction between "don't know" and "empty" in _import_from_properties
 - automatically disable cache in some situations, allow partial cache?
 - in-memory caching of revid mapping (LRUCache ?)
 - inventory problem that shows up in bigboard, evolution

=== modified file '__init__.py'
--- a/__init__.py	2008-12-05 17:23:40 +0000
+++ b/__init__.py	2008-12-07 05:20:26 +0000
@@ -506,12 +506,13 @@
                                  help="New mapping to upgrade to.",
                                  registry=mapping_registry,
                                  title="Subversion mapping",
-                                 value_switches=True)]
+                                 value_switches=True),
+                     Option('upgrade', help='Upgrade to new mapping version rather than setting revision properties for the current mapping')]
 
-    def run(self, location=".", mapping=None):
+    def run(self, location=".", upgrade=False, mapping=None):
         from bzrlib.errors import BzrCommandError
         from bzrlib.repository import Repository
-        from bzrlib.plugins.svn.upgrade import set_revprops
+        from bzrlib.plugins.svn.upgrade import set_revprops, upgrade_revprops
         from bzrlib.plugins.svn.mapping import mapping_registry
         repos = Repository.open(location) 
         if not repos.transport.has_capability("commit-revprops"):
@@ -522,7 +523,10 @@
         if not new_mapping.can_use_revprops:
             raise BzrCommandError("Please specify a different mapping, %s doesn't support revision properties." % new_mapping.name)
 
-        num = set_revprops(repos, new_mapping)
+        if upgrade:
+            num = upgrade_revprops(repos, new_mapping)
+        else:
+            num = set_revprops(repos)
         self.outf.write("Revision properties set for %d revisions.\n" % num)
         self.outf.write("Please restore the hooks/pre-revprop-change script "
                         "to refuse changes to most revision properties.\n")

=== modified file 'mapping.py'
--- a/mapping.py	2008-12-07 02:58:26 +0000
+++ b/mapping.py	2008-12-07 05:20:26 +0000
@@ -417,8 +417,6 @@
         """
         return None
 
-
-
     def get_rhs_parents_fileprops(self, fileprops):
         """Obtain the right-hand side parents for a revision.
 
@@ -564,6 +562,9 @@
     def export_revprop_redirect(self, revnum, fileprops):
         raise NotImplementedError(self.export_revprop_redirect)
 
+    def revprops_complete(self, revprops):
+        raise NotImplementedError(self.revprops_complete)
+
 
 def parse_fileid_property(text):
     """Pares a fileid file or revision property.

=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py	2008-12-07 02:58:26 +0000
+++ b/mapping3/__init__.py	2008-12-07 05:20:26 +0000
@@ -319,7 +319,10 @@
         self.revprop_map.export_text_revisions_revprops(text_revisions, svn_revprops)
 
     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)
+        self.revprop_map.export_revision_revprops(branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops)
+
+    def revprops_complete(self, revprops):
+        return (self.get_revision_id_revprops(revprops) is not None)
 
     def export_fileid_map_revprops(self, fileids, revprops):
         self.revprop_map.export_fileid_map_revprops(fileids, revprops)

=== modified file 'mapping4.py'
--- a/mapping4.py	2008-12-07 02:58:26 +0000
+++ b/mapping4.py	2008-12-07 05:20:26 +0000
@@ -193,3 +193,6 @@
     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)
+
+    def revprops_complete(self, revprops):
+        return (self.get_revision_id_revprops(revprops) is not None)

=== modified file 'revmeta.py'
--- a/revmeta.py	2008-12-07 04:20:06 +0000
+++ b/revmeta.py	2008-12-07 05:20:26 +0000
@@ -179,7 +179,7 @@
             (_, revid) = self._import_from_props(mapping, 
                     mapping.get_revision_id_fileprops,
                     mapping.get_revision_id_revprops,
-                    (None, None))
+                    (None, None), self.consider_bzr_fileprops)
         else:
             revid = None
 
@@ -359,13 +359,13 @@
         return self._import_from_props(None,
                 find_mapping_fileprops,
                 find_mapping_revprops,
-                None)
+                None, self.consider_bzr_fileprops)
 
     def _get_stored_lhs_parent_revid(self, mapping):
         return self._import_from_props(mapping, 
                 mapping.get_lhs_parent_fileprops,
                 mapping.get_lhs_parent_revprops, 
-                None)
+                None, self.consider_bzr_fileprops)
 
     def get_lhs_parent_revid(self, mapping):
         """Find the revid of the left hand side parent of this revision."""
@@ -414,7 +414,7 @@
         """Estimate how many svk ancestors this revision has."""
         return self._estimate_fileprop_ancestors("svk:merge", estimate_svk_ancestors)
 
-    def estimate_bzr_hidden_fileprop_ancestors(self, mapping):
+    def estimate_bzr_hidden_fileprop_ancestors(self):
         return self._estimate_fileprop_ancestors("bzr:hidden", estimate_bzr_ancestors)
 
     def is_changes_root(self):
@@ -433,7 +433,7 @@
         return self._import_from_props(mapping, 
                 mapping.is_bzr_revision_hidden_fileprops,
                 mapping.is_bzr_revision_hidden_revprops,
-                False)
+                False, consider_fileprops_fn=self.consider_bzr_hidden_fileprops)
 
     def is_bzr_revision(self):
         """Determine if this is a bzr revision.
@@ -462,7 +462,7 @@
         """Check what Bazaar revisions were merged in this revision."""
         return self._import_from_props(mapping,
             mapping.get_rhs_parents_fileprops,
-            mapping.get_rhs_parents_revprops, ())
+            mapping.get_rhs_parents_revprops, (), self.consider_bzr_fileprops)
 
     def get_svk_merges(self, mapping):
         """Check what SVK revisions were merged in this revision."""
@@ -496,7 +496,7 @@
             (bzr_revno, _) = self._import_from_props(mapping, 
                     mapping.get_revision_id_fileprops,
                     mapping.get_revision_id_revprops,
-                    (None, None))
+                    (None, None), self.consider_bzr_fileprops)
             if bzr_revno is not None:
                 return bzr_revno
         return None
@@ -567,23 +567,25 @@
         self._import_from_props(mapping, 
             lambda changed_fileprops: mapping.import_revision_fileprops(changed_fileprops, rev),
             lambda revprops: mapping.import_revision_revprops(revprops, rev),
-            False, check_branch_root=False)
+            False, self.consider_bzr_fileprops, check_branch_root=False)
 
         rev.svn_meta = self
 
         return rev
 
     def _import_from_props(self, mapping, fileprop_fn, revprop_fn, default,
-                           check_branch_root=True):
+                           consider_fileprops_fn, check_branch_root=True):
         can_use_revprops = (mapping is None or mapping.can_use_revprops)
         can_use_fileprops = (mapping is None or mapping.can_use_fileprops)
+
         # Check revprops if self.knows_revprops() and can_use_revprops
         if can_use_revprops and self.knows_revprops():
-            if (mapping is None or not check_branch_root or 
-                mapping.get_branch_root(self.get_revprops()) == self.branch_path):
-                ret = revprop_fn(self.get_revprops())
-                if ret != default:
-                    return ret
+            revprops = self.get_revprops()
+            if (mapping is None or 
+                (not check_branch_root and mapping.revprops_complete(revprops)) or
+                mapping.get_branch_root(revprops) == self.branch_path):
+                return revprop_fn(revprops)
+            can_use_revprops = False
 
         # Check changed_fileprops if self.knows_changed_fileprops() and 
         # can_use_fileprops
@@ -591,20 +593,21 @@
             ret = fileprop_fn(self.get_changed_fileprops())
             if ret != default:
                 return ret
+            can_use_fileprops = False
 
         # Check revprops if the last descendant has bzr:check-revprops set;
         #   if it has and the revnum there is < self.revnum
         if can_use_revprops and self.consider_bzr_revprops():
             warn_slow_revprops()
-            if (mapping is None or not check_branch_root or 
-                mapping.get_branch_root(self.get_revprops()) == self.branch_path):
-                ret = revprop_fn(self.get_revprops())
-                if ret != default:
-                    return ret
+            revprops = self.get_revprops()
+            if (mapping is None or 
+                (not check_branch_root and mapping.revprops_complete(revprops)) or 
+                mapping.get_branch_root(revprops) == self.branch_path):
+                return revprop_fn(revprops)
 
         # Check whether we should consider file properties at all 
         # for this revision, if we should -> check fileprops
-        if can_use_fileprops and self.consider_bzr_fileprops():
+        if can_use_fileprops and consider_fileprops_fn():
             ret = fileprop_fn(self.get_changed_fileprops())
             if ret != default:
                 return ret
@@ -615,19 +618,21 @@
         """Find the file id override map for this revision."""
         return self._import_from_props(mapping, 
             mapping.import_fileid_map_fileprops, 
-            mapping.import_fileid_map_revprops, {})
+            mapping.import_fileid_map_revprops, {}, self.consider_bzr_fileprops)
 
     def get_text_revisions(self, mapping):
         """Return text revision override map for this revision."""
         return self._import_from_props(mapping,
             mapping.import_text_revisions_fileprops,
-            mapping.import_text_revisions_revprops, {})
+            mapping.import_text_revisions_revprops, {}, 
+            self.consider_bzr_fileprops)
 
     def get_text_parents(self, mapping):
         """Return text revision override map for this revision."""
         return self._import_from_props(mapping,
             mapping.import_text_parents_fileprops, 
-            mapping.import_text_parents_revprops, {})
+            mapping.import_text_parents_revprops, {}, 
+            self.consider_bzr_fileprops)
 
     def consider_bzr_revprops(self):
         """See if bzr revision properties should be checked at all.
@@ -637,12 +642,19 @@
             return self._consider_bzr_revprops
         if not self.is_changes_root():
             self._consider_bzr_revprops = False
+        elif not self._log._transport.has_capability("commit-revprops"):
+            self._consider_bzr_revprops = False
         else:
             # FIXME: Check nearest descendant with bzr:see-revprops set
             # and return True if revnum in that property < self.revnum
             self._consider_bzr_revprops = True
         return self._consider_bzr_revprops
 
+    def consider_bzr_hidden_fileprops(self):
+        if not self.is_changes_root():
+            return False
+        return (self.estimate_bzr_hidden_fileprop_ancestors() > 0) 
+
     def consider_bzr_fileprops(self):
         """See if any bzr file properties should be checked at all.
 
@@ -661,10 +673,7 @@
 
         This will try to avoid extra network traffic if at all possible.
         """
-        if self._consider_svk_fileprops is not None:
-            return self._consider_svk_fileprops
-        self._consider_svk_fileprops = (self.estimate_svk_fileprop_ancestors() > 0)
-        return self._consider_svk_fileprops
+        return (self.estimate_svk_fileprop_ancestors() > 0)
 
     def get_roundtrip_ancestor_revids(self):
         """Return the number of fileproperty roundtrip ancestors.

=== modified file 'upgrade.py'
--- a/upgrade.py	2008-12-07 00:32:28 +0000
+++ b/upgrade.py	2008-12-07 05:20:26 +0000
@@ -22,7 +22,25 @@
 from subvertpy import SubversionException, ERR_FS_NOT_DIRECTORY
 
 
-def set_revprops(repository, new_mapping, from_revnum=0, to_revnum=None):
+def export_as_mapping(revmeta, revno, old_mapping, new_mapping):
+    new_revprops = dict(revmeta.get_revprops().iteritems())
+    rev = revmeta.get_revision(old_mapping)
+    new_mapping.export_revision_revprops(bp, rev.timestamp, rev.timezone, rev.committer, rev.properties, rev.revision_id, revno, rev.parent_ids, new_revprops)
+    new_mapping.export_fileid_map_revprops(revmeta.get_fileid_map(new_mapping), new_revprops)
+    new_mapping.export_text_parents_revprops(revmeta.get_text_parents(new_mapping), new_revprops)
+    new_mapping.export_text_revisions_revprops(revmeta.get_text_revisions(new_mapping), new_revprops)
+    if rev.message != mapping.parse_svn_log(revprops.get(properties.PROP_REVISION_LOG)):
+        new_mapping.export_message_revprops(rev.message, new_revprops)
+    return new_revprops
+
+
+def upgrade_revprops(repository, new_mapping, from_revnum=0, to_revnum=None):
+    # FIXME: Check that repository has log-revprops capability
+    # (otherwise the new revprops might not be seen by the clients)
+    raise NotImplementedError()
+
+
+def set_revprops_current(repository, from_revnum=0, to_revnum=None):
     """Set bzr-svn revision properties for existing bzr-svn revisions.
 
     :param repository: Subversion Repository object.
@@ -65,20 +83,10 @@
             if old_mapping is None:
                 num_changed += set_skip_revprop(revnum, revprops)
                 continue
-            if old_mapping == new_mapping:
-                # Already the latest mapping
-                continue
             assert old_mapping.can_use_revprops or bp is not None
-            new_revprops = dict(revprops.iteritems())
-            rev = revmeta.get_revision(old_mapping)
+            assert bp is not None
             revno = graph.find_distance_to_null(rev.revision_id, [])
-            assert bp is not None
-            new_mapping.export_revision_revprops(bp, rev.timestamp, rev.timezone, rev.committer, rev.properties, rev.revision_id, revno, rev.parent_ids, new_revprops)
-            new_mapping.export_fileid_map_revprops(revmeta.get_fileid_map(old_mapping), new_revprops)
-            new_mapping.export_text_parents_revprops(revmeta.get_text_parents(old_mapping), new_revprops)
-            new_mapping.export_text_revisions_revprops(revmeta.get_text_revisions(old_mapping), new_revprops)
-            if rev.message != mapping.parse_svn_log(revprops.get(properties.PROP_REVISION_LOG)):
-                new_mapping.export_message_revprops(rev.message, new_revprops)
+            new_revprops = export_as_mapping(revmeta, revno, old_mapping, old_mapping)
             changed_revprops = dict(ifilter(lambda (k,v): k not in revprops or revprops[k] != v, new_revprops.iteritems()))
             if logcache is not None:
                 logcache.drop_revprops(revnum)




More information about the bazaar-commits mailing list