Rev 1709: More fixes, cache revmeta data. in file:///data/jelmer/bzr-svn/trunk/

Jelmer Vernooij jelmer at samba.org
Sat Aug 30 00:55:44 BST 2008


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

------------------------------------------------------------
revno: 1709
revision-id: jelmer at samba.org-20080829235541-mxivus3f1vqp63q8
parent: jelmer at samba.org-20080829215503-fnuyndz0852zxmhf
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Sat 2008-08-30 01:55:41 +0200
message:
  More fixes, cache revmeta data.
modified:
  NEWS                           news-20061231030336-h9fhq245ie0de8bs-1
  TODO                           todo-20060729211917-2kpobww0zyvvo0j2-1
  __init__.py                    __init__.py-20051008155114-eae558e6cf149e1d
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  mapping4.py                    mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  revids.py                      revids.py-20070416220458-36vfa0730cchevp1-1
  tags.py                        tags.py-20080822211316-scblu3akdvu0b64c-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
  upgrade.py                     upgrade.py-20070106192108-0rakplee2lzah4gs-1
=== modified file 'NEWS'
--- a/NEWS	2008-08-29 10:27:01 +0000
+++ b/NEWS	2008-08-29 23:55:41 +0000
@@ -2,6 +2,16 @@
 
 bzr-svn 0.4.12	UNRELEASED
 
+
+  CHANGES
+
+   * Implement set-revprops command.
+
+  FEATURES
+
+   * Add bzr:skip revision property to allow skipping 
+     more detailed analysis of revisions not created by bzr.
+
   BUG FIXES
 
    * Cope with svn+ prefix when setting tags. (#261748)
@@ -10,6 +20,8 @@
 
    * Fix compatibility with Bazaar 1.7.
 
+   * Set bzr signature revision property during commit if possible.
+
 bzr-svn 0.4.11	2008-08-26
 
 bzr-svn 0.4.11~rc2	2008-08-26

=== modified file 'TODO'
--- a/TODO	2008-08-29 21:48:03 +0000
+++ b/TODO	2008-08-29 23:55:41 +0000
@@ -1,8 +1,11 @@
 mappingv4:
  - refuse to set fileprops on repository on which revprops have been set
- - skip looking for fileprops if revprops have been found in earlier revisions
+ - skip looking for fileprops if revprops have been found in earlier revisions \
+   AND server supports revprops AND mapping.supports_custom_revprops()
  - implement layout functions, including command
  - integrate svn-set-revprops into svn-upgrade ?
+ - add options in commit for create_root, create_prefix
+  - if create_root=False: skip _check_dirs_exist
 
 todo:
 - generate deltas rather than fulltexts when creating file id maps
@@ -32,7 +35,6 @@
  - Run all tests against repository with revprop changing allowed and without
 - Needs upgrade command that can use legacy file properties and set revprops
 - Support disabling legacy file property support somehow
-- remove set revision properties settings
 
 for other things to do, see:
 

=== modified file '__init__.py'
--- a/__init__.py	2008-08-29 20:03:11 +0000
+++ b/__init__.py	2008-08-29 23:55:41 +0000
@@ -515,6 +515,8 @@
         from bzrlib.plugins.svn.upgrade import set_revprops
         from bzrlib.plugins.svn.mapping import get_default_mapping
         repos = Repository.open(location) 
+        if not repos.transport.has_capability("commit-revprops"):
+            raise BzrCommandError("Please upgrade the Subversion server to 1.5 or higher.")
         if mapping is None:
             mapping = get_default_mapping()
         new_mapping = mapping.from_repository(repos)

=== modified file 'commit.py'
--- a/commit.py	2008-08-29 21:55:03 +0000
+++ b/commit.py	2008-08-29 23:55:41 +0000
@@ -190,7 +190,10 @@
         else:
             self._base_branch_props = lazy_dict({}, self.repository.branchprop_list.get_properties, self.base_path, self.base_revnum)
         self.supports_custom_revprops = self.repository.transport.has_capability("commit-revprops")
-        if self.supports_custom_revprops:
+        if self.supports_custom_revprops is None and self.base_mapping.supports_custom_revprops() and self.repository.seen_bzr_revprops():
+            raise BzrError("Please upgrade your Subversion client libraries to 1.5 or higher to be able to commit with Subversion mapping %s" % self.base_mapping.name)
+
+        if self.supports_custom_revprops == True:
             self._svn_revprops = {}
             if opt_signature is not None:
                 self._svn_revprops[mapping.SVN_REVPROP_BZR_SIGNATURE] = opt_signature

=== modified file 'logwalker.py'
--- a/logwalker.py	2008-08-29 21:48:03 +0000
+++ b/logwalker.py	2008-08-29 23:55:41 +0000
@@ -587,6 +587,9 @@
 
     def changes_path(self, path, revnum):
         return self._get_revision_paths(revnum).has_key(path)
+
+    def get_change(self, path, revnum):
+        return self._get_revision_paths(revnum).get(path)
         
     def find_children(self, path, revnum):
         """Find all children of path in revnum.

=== modified file 'mapping.py'
--- a/mapping.py	2008-08-29 21:48:03 +0000
+++ b/mapping.py	2008-08-29 23:55:41 +0000
@@ -283,11 +283,7 @@
 
     @classmethod
     def supports_custom_revprops(cls):
-        """Whether this mapping can be used with custom revision properties."""
-        return False
-
-    def is_bzr_revision(self, revprops, fileprops):
-        """Whether this is a revision that was pushed by Bazaar."""
+        """Whether this mapping will primarily use custom revision properties."""
         return False
 
     @classmethod
@@ -580,9 +576,6 @@
     def export_message(self, message, revprops, fileprops):
         fileprops[SVN_PROP_BZR_LOG] = message.encode("utf-8")
 
-    def is_bzr_revision(self, revprops, fileprops):
-        return fileprops.has_key(SVN_PROP_BZR_REVISION_ID+self.name)
-
     def get_revision_id(self, branch_path, revprops, fileprops):
         # Lookup the revision from the bzr:revision-id-vX property
         text = fileprops.get(SVN_PROP_BZR_REVISION_ID+self.name, None)
@@ -640,15 +633,8 @@
             return []
         return svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines()
 
-    def is_bzr_revision(self, revprops, fileprops):
-        if revprops.has_key(SVN_REVPROP_BZR_MAPPING_VERSION):
-            return True
-        if revprops.has_key(SVN_REVPROP_BZR_SKIP):
-            return False
-        return None
-
     def get_revision_id(self, branch_path, revprops, fileprops):
-        if not self.is_bzr_revision(revprops, fileprops):
+        if not is_bzr_revision_revprops(revprops):
             return (None, None)
         if revprops[SVN_REVPROP_BZR_ROOT] == branch_path:
             revid = revprops[SVN_REVPROP_BZR_REVISION_ID]
@@ -749,3 +735,15 @@
             return parse_mapping_name(k[len(SVN_PROP_BZR_REVISION_ID):])
     return None
 
+def is_bzr_revision_revprops(revprops):
+    if revprops.has_key(SVN_REVPROP_BZR_MAPPING_VERSION):
+        return True
+    if revprops.has_key(SVN_REVPROP_BZR_SKIP):
+        return False
+    return None
+
+def is_bzr_revision_fileprops(fileprops):
+    for k in fileprops:
+        if k.startswith(SVN_PROP_BZR_REVISION_ID):
+            return True
+    return None

=== modified file 'mapping4.py'
--- a/mapping4.py	2008-08-29 21:48:03 +0000
+++ b/mapping4.py	2008-08-29 23:55:41 +0000
@@ -48,13 +48,6 @@
     def supports_custom_revprops():
         return True
 
-    def is_bzr_revision(self, revprops, fileprops):
-        """Whether this is a revision that was pushed by Bazaar."""
-        is_revprop_rev = self.revprops.is_bzr_revision(revprops, fileprops)
-        if is_revprop_rev is not None:
-            return is_revprop_rev
-        return self.fileprops.is_bzr_revision(revprops, fileprops)
-
     @classmethod
     def revision_id_bzr_to_foreign(cls, revid):
         assert isinstance(revid, str)

=== modified file 'repository.py'
--- a/repository.py	2008-08-29 21:48:03 +0000
+++ b/repository.py	2008-08-29 23:55:41 +0000
@@ -41,6 +41,7 @@
 from bzrlib.plugins.svn.mapping import (SVN_REVPROP_BZR_SIGNATURE,
                      BzrSvnMapping,
                      get_default_mapping, 
+                     is_bzr_revision_revprops, is_bzr_revision_fileprops,
                      parse_svn_dateprop)
 from bzrlib.plugins.svn.parents import DiskCachingParentsProvider
 from bzrlib.plugins.svn.revids import CachingRevidMap, RevidMap
@@ -80,8 +81,19 @@
             lhs_parent = self.repository.lhs_revision_parent(self.branch_path, self.revnum, mapping)
         return lhs_parent
 
-    def is_bzr_revision(self, mapping):
-        return mapping.is_bzr_revision(self.revprops, self.fileprops)
+    def is_bzr_revision(self):
+        # If the server already sent us all revprops, look at those first
+        if self.repository.transport.has_capability("log-revprops"):
+            order = [lambda: is_bzr_revision_revprops(self.revprops),
+                     lambda: is_bzr_revision_fileprops(self.fileprops)]
+        else:
+            order = [lambda: is_bzr_revision_fileprops(self.fileprops),
+                     lambda: is_bzr_revision_revprops(self.revprops)]
+        for fn in order:
+            ret = fn()
+            if ret is not None:
+                return ret
+        return None
 
     def get_rhs_parents(self, mapping):
         extra_rhs_parents = mapping.get_rhs_parents(self.branch_path, self.revprops, self.fileprops)
@@ -89,7 +101,7 @@
         if extra_rhs_parents != ():
             return extra_rhs_parents
 
-        if self.is_bzr_revision(mapping):
+        if self.is_bzr_revision():
             return ()
 
         (prev_path, prev_revnum) = self.repository._log.get_previous(self.branch_path, 
@@ -219,6 +231,7 @@
         self._hinted_branch_path = branch_path
         self._real_parents_provider = self
         self._cached_tags = {}
+        self._revmeta_cache = {}
 
         cache = self.get_config().get_use_cache()
 
@@ -449,7 +462,7 @@
                                 svn_fileprops = {}
                             else:
                                 svn_fileprops = self.branchprop_list.get_changed_properties(bp, revnum)
-                            yield RevisionMetadata(self, bp, paths, revnum, revprops, svn_fileprops)
+                            yield self._revmeta(bp, paths, revnum, revprops, svn_fileprops)
 
     def all_revision_ids(self, layout=None, mapping=None):
         if mapping is None:
@@ -571,9 +584,7 @@
             except NoSuchRevision:
                 continue
 
-            svn_fileprops = self.branchprop_list.get_changed_properties(branch, revnum)
-            svn_revprops = self._log.revprop_list(revnum)
-            revmeta = RevisionMetadata(self, branch, None, revnum, svn_revprops, svn_fileprops)
+            revmeta = self._revmeta(branch, None, revnum)
 
             parent_map[revision_id] = revmeta.get_parent_ids(mapping)
         return parent_map
@@ -597,6 +608,19 @@
             if revid is not None:
                 yield revid
 
+    def _revmeta(self, path, changes, revnum, revprops=None, fileprops=None):
+        if (path, revnum) in self._revmeta_cache:
+            return self._revmeta_cache[path,revnum]
+
+        if revprops is None:
+            revprops = self._log.revprop_list(revnum)
+        if fileprops is None:
+            fileprops = self.branchprop_list.get_changed_properties(path, revnum)
+
+        revmeta = RevisionMetadata(self, path, changes, revnum, revprops, fileprops)
+        self._revmeta_cache[path,revnum] = revmeta
+        return revmeta
+
     def get_revision(self, revision_id):
         """See Repository.get_revision."""
         if not revision_id or not isinstance(revision_id, str):
@@ -604,10 +628,7 @@
 
         (path, revnum, mapping) = self.lookup_revision_id(revision_id)
         
-        svn_revprops = self._log.revprop_list(revnum)
-        svn_fileprops = self.branchprop_list.get_changed_properties(path, revnum)
-
-        revmeta = RevisionMetadata(self, path, None, revnum, svn_revprops, svn_fileprops)
+        revmeta = self._revmeta(path, None, revnum)
 
         return revmeta.get_revision(mapping)
 
@@ -726,6 +747,16 @@
             else:
                 bp = next[0]
 
+    def seen_bzr_revprops(self):
+        """Check whether bzr-specific custom revision properties are present on this 
+        repository.
+
+        """
+        for revmeta in self._log.iter_all_changes():
+            if revmeta.is_bzr_revision():
+                return True
+        return False
+
     def iter_reverse_branch_changes(self, branch_path, from_revnum, to_revnum, 
                                     mapping=None, pb=None, limit=0):
         """Return all the changes that happened in a branch 
@@ -741,7 +772,7 @@
             else:
                 svn_fileprops = self.branchprop_list.get_changed_properties(bp, revnum)
 
-            yield RevisionMetadata(self, bp, paths, revnum, revprops, svn_fileprops)
+            yield self._revmeta(bp, paths, revnum, revprops, svn_fileprops)
 
     def get_config(self):
         return SvnRepositoryConfig(self.uuid)

=== modified file 'revids.py'
--- a/revids.py	2008-08-29 16:00:52 +0000
+++ b/revids.py	2008-08-29 23:55:41 +0000
@@ -63,7 +63,7 @@
         for entry_revid, branch, revno, mapping in self.discover_revids(layout, 0, self.repos.get_latest_revnum(), project):
             if revid == entry_revid:
                 (bp, revnum, mapping_name) = self.bisect_revid_revnum(revid, branch, 0, revno)
-                return (bp, revnum, parse_mapping_name(mapping_name))
+                return (bp, revnum, mapping_name)
         raise NoSuchRevision(self, revid)
 
     def discover_revids(self, layout, from_revnum, to_revnum, project=None):

=== modified file 'tags.py'
--- a/tags.py	2008-08-29 21:48:03 +0000
+++ b/tags.py	2008-08-29 23:55:41 +0000
@@ -18,7 +18,7 @@
 from bzrlib.tag import BasicTags
 from bzrlib.trace import mutter
 
-from bzrlib.plugins.svn import commit, core, properties
+from bzrlib.plugins.svn import commit, core, mapping, properties
 
 class SubversionTags(BasicTags):
     def __init__(self, branch):

=== modified file 'transport.py'
--- a/transport.py	2008-08-27 18:14:49 +0000
+++ b/transport.py	2008-08-29 23:55:41 +0000
@@ -426,7 +426,7 @@
             try:
                 self.capabilities[cap] = conn.has_capability(cap)
             except NotImplementedError:
-                self.capabilities[cap] = False # Assume the worst
+                self.capabilities[cap] = None # None for unknown
             return self.capabilities[cap]
         finally:
             self.add_connection(conn)

=== modified file 'upgrade.py'
--- a/upgrade.py	2008-08-29 21:48:03 +0000
+++ b/upgrade.py	2008-08-29 23:55:41 +0000
@@ -252,9 +252,10 @@
                 continue
             assert old_mapping.supports_custom_revprops() or bp is not None
             new_revprops = dict(revprops.items())
-            revmeta = RevisionMetadata(repository, bp, changes, revnum, revprops, fileprops)
+            revmeta = repository._revmeta(bp, changes, revnum, revprops, fileprops)
             rev = revmeta.get_revision(old_mapping)
             revno = graph.find_distance_to_null(rev.revision_id, [])
+            assert bp is not None
             new_mapping.export_revision(bp, rev.timestamp, rev.timezone, rev.committer, rev.properties, rev.revision_id, revno, rev.parent_ids, new_revprops, None)
             new_mapping.export_fileid_map(old_mapping.import_fileid_map(revprops, fileprops), 
                 new_revprops, None)
@@ -262,7 +263,7 @@
                 new_revprops, None)
             if rev.message != mapping.parse_svn_log(revprops.get(properties.PROP_REVISION_LOG)):
                 new_mapping.export_message(rev.message, new_revprops, None)
-            changed_revprops = dict(filter(lambda (k,v): revprops.get(k) != v, new_revprops.items()))
+            changed_revprops = dict(filter(lambda (k,v): k not in revprops or revprops[k] != v, new_revprops.items()))
             if logcache is not None:
                 logcache.drop_revprops(revnum)
             for k, v in changed_revprops.items():




More information about the bazaar-commits mailing list