Rev 1770: Split RevisionMetadata up into a separate file. in file:///data/jelmer/bzr-svn/trunk/

Jelmer Vernooij jelmer at samba.org
Mon Sep 1 23:34:29 BST 2008


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

------------------------------------------------------------
revno: 1770
revision-id: jelmer at samba.org-20080901223427-hq17p9awh7m9mc2k
parent: jelmer at samba.org-20080901213442-50m76lbi4s06bfeb
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Tue 2008-09-02 00:34:27 +0200
message:
  Split RevisionMetadata up into a separate file.
added:
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
modified:
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  revids.py                      revids.py-20070416220458-36vfa0730cchevp1-1
=== modified file 'fetch.py'
--- a/fetch.py	2008-09-01 20:53:16 +0000
+++ b/fetch.py	2008-09-01 22:34:27 +0000
@@ -122,9 +122,9 @@
     def change_prop(self, name, value):
         if self.path == "":
             # Replay lazy_dict, since it may be more expensive
-            if type(self.editor.revmeta.changed_fileprops) != dict:
-                self.editor.revmeta.changed_fileprops = {}
-            self.editor.revmeta.changed_fileprops[name] = value
+            if type(self.editor.revmeta._changed_fileprops) != dict:
+                self.editor.revmeta._changed_fileprops = {}
+            self.editor.revmeta._changed_fileprops[name] = value
 
         if name in (properties.PROP_ENTRY_COMMITTED_DATE,
                     properties.PROP_ENTRY_COMMITTED_REV,
@@ -403,7 +403,7 @@
         rev = Revision(revision_id=revid, 
                        parent_ids=parent_ids)
 
-        self.mapping.import_revision(self.revmeta.revprops, self.revmeta.changed_fileprops, 
+        self.mapping.import_revision(self.revmeta.revprops, self.revmeta.get_changed_fileprops(), 
                                      self.revmeta.uuid, self.revmeta.branch_path,
                                      self.revmeta.revnum, rev)
 
@@ -494,7 +494,7 @@
     def _get_text_revid(self, path):
         if self._text_revids is None:
             self._text_revids = self.mapping.import_text_parents(self.revmeta.revprops, 
-                                                                 self.revmeta.changed_fileprops)
+                                                                 self.revmeta.get_changed_fileprops())
         return self._text_revids.get(path)
 
 

=== modified file 'fileids.py'
--- a/fileids.py	2008-09-01 20:53:16 +0000
+++ b/fileids.py	2008-09-01 22:34:27 +0000
@@ -108,7 +108,7 @@
         self.repos = repos
 
     def _use_text_revids(self, mapping, revmeta, map):
-        text_revids = mapping.import_text_parents(revmeta.revprops, revmeta.changed_fileprops).items()
+        text_revids = mapping.import_text_parents(revmeta.revprops, revmeta.get_changed_fileprops()).items()
         for path, revid in text_revids:
             assert path in map
             map[path] = (map[path][0], revid)

=== modified file 'mapping.py'
--- a/mapping.py	2008-09-01 20:53:16 +0000
+++ b/mapping.py	2008-09-01 22:34:27 +0000
@@ -768,3 +768,10 @@
         if k.startswith(SVN_PROP_BZR_REVISION_ID):
             return True
     return None
+
+
+def contains_bzr_fileprops(fileprops):
+    for k in fileprops:
+        if k.startswith(SVN_PROP_BZR_PREFIX):
+            return True
+    return False

=== modified file 'repository.py'
--- a/repository.py	2008-09-01 21:34:42 +0000
+++ b/repository.py	2008-09-01 22:34:27 +0000
@@ -32,7 +32,7 @@
 from itertools import chain
 import os
 
-from bzrlib.plugins.svn import changes, core, errors, logwalker, properties
+from bzrlib.plugins.svn import changes, core, errors, logwalker, properties, revmeta
 from bzrlib.plugins.svn.branchprops import PathPropertyProvider
 from bzrlib.plugins.svn.cache import create_cache_dir, sqlite3
 from bzrlib.plugins.svn.changes import changes_path, find_prev_location
@@ -40,7 +40,6 @@
 from bzrlib.plugins.svn.core import SubversionException
 from bzrlib.plugins.svn.mapping import (SVN_REVPROP_BZR_SIGNATURE,
                      SVN_REVPROP_BZR_TAGS,
-                     SVN_REVPROP_BZR_SKIP,
                      parse_tags_property,
                      BzrSvnMapping,
                      get_default_mapping, 
@@ -49,8 +48,6 @@
                      parse_svn_dateprop)
 from bzrlib.plugins.svn.parents import DiskCachingParentsProvider
 from bzrlib.plugins.svn.revids import CachingRevidMap, RevidMap
-from bzrlib.plugins.svn.svk import (SVN_PROP_SVK_MERGE, svk_features_merged_since, 
-                 parse_svk_feature)
 from bzrlib.plugins.svn.tree import SvnRevisionTree
 from bzrlib.plugins.svn.versionedfiles import (SvnTexts, VirtualRevisionTexts, 
                                                VirtualInventoryTexts, VirtualSignatureTexts)
@@ -71,151 +68,6 @@
     return paths
 
 
-class RevisionMetadata(object):
-
-    def __init__(self, repository, branch_path, revnum, paths, revprops, changed_fileprops=None, consider_fileprops=True):
-        self.repository = repository
-        self.branch_path = branch_path
-        self.paths = paths
-        self.revnum = revnum
-        self.revprops = revprops
-        if changed_fileprops is None:
-            if paths is None:
-                self.changed_fileprops = self.repository.branchprop_list.get_changed_properties(branch_path, revnum)
-            elif branch_path in paths:
-                self.changed_fileprops = self.repository.branchprop_list.get_changed_properties(branch_path, revnum, skip_check=True)
-            else:
-                self.changed_fileprops = {}
-        else:
-            self.changed_fileprops = changed_fileprops
-        self.uuid = repository.uuid
-        self.consider_fileprops = consider_fileprops
-
-    def __repr__(self):
-        return "<RevisionMetadata for revision %d in repository %s>" % (self.revnum, self.repository.uuid)
-
-    def get_revision_id(self, mapping):
-        return self.repository.generate_revision_id(self.revnum, self.branch_path, mapping, self.revprops, self.changed_fileprops)
-
-    def get_lhs_parent(self, mapping):
-        lhs_parent = mapping.get_lhs_parent(self.branch_path, self.revprops, self.changed_fileprops)
-        if lhs_parent is None:
-            # Determine manually
-            lhs_parent = self.repository.lhs_revision_parent(self.branch_path, self.revnum, mapping)
-        return lhs_parent
-
-    def has_bzr_fileprop_ancestors(self):
-        """Check whether there are any bzr file properties present in this revision.
-
-        This can tell us whether one of the ancestors of this revision is a 
-        fileproperty-based bzr revision.
-        """
-        if not self.consider_fileprops:
-            # This revisions descendant doesn't have bzr fileprops set, so this one can't have them either.
-            return False
-        return is_bzr_revision_fileprops(self.repository.branchprop_list.get_properties(self.branch_path, self.revnum))
-
-    def is_bzr_revision(self):
-        """Determine (with as few network requests as possible) if this is a bzr revision.
-
-        """
-        # If the server already sent us all revprops, look at those first
-        order = []
-        if self.repository.quick_log_revprops:
-            order.append(lambda: is_bzr_revision_revprops(self.revprops))
-        if self.consider_fileprops:
-            order.append(lambda: is_bzr_revision_fileprops(self.changed_fileprops))
-        # Only look for revprops if they could've been committed
-        if (not self.repository.quick_log_revprops and 
-                self.repository.check_revprops):
-            order.append(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.changed_fileprops)
-
-        if extra_rhs_parents != ():
-            return extra_rhs_parents
-
-        if self.is_bzr_revision():
-            return ()
-
-        current = self.changed_fileprops.get(SVN_PROP_SVK_MERGE, "")
-        if current == "":
-            return ()
-
-        (prev_path, prev_revnum) = self.repository._log.get_previous(self.branch_path, 
-                                                          self.revnum)
-        if prev_path is None and prev_revnum == -1:
-            previous_fileprops = {}
-        else:
-            previous_fileprops = self.repository.branchprop_list.get_lazy_properties(prev_path.encode("utf-8"), prev_revnum)
-
-        previous = previous_fileprops.get(SVN_PROP_SVK_MERGE, "")
-
-        return tuple(self.repository._svk_merged_revisions(self.branch_path, self.revnum, mapping, current, previous))
-
-    def get_parent_ids(self, mapping):
-        parents_cache = getattr(self.repository._real_parents_provider, "_cache", None)
-        if parents_cache is not None:
-            parent_ids = parents_cache.lookup_parents(self.get_revision_id(mapping))
-            if parent_ids is not None:
-                return parent_ids
-
-        lhs_parent = self.get_lhs_parent(mapping)
-        if lhs_parent == NULL_REVISION:
-            parent_ids = (NULL_REVISION,)
-        else:
-            parent_ids = (lhs_parent,) + self.get_rhs_parents(mapping)
-
-        if parents_cache is not None:
-            parents_cache.insert_parents(self.get_revision_id(mapping), 
-                                         parent_ids)
-
-        return parent_ids
-
-    def get_revision(self, mapping):
-        parent_ids = self.get_parent_ids(mapping)
-        if parent_ids == (NULL_REVISION,):
-            parent_ids = ()
-        rev = Revision(revision_id=self.get_revision_id(mapping), 
-                       parent_ids=parent_ids,
-                       inventory_sha1="")
-
-        rev.svn_meta = self
-        rev.svn_mapping = mapping
-
-        mapping.import_revision(self.revprops, self.changed_fileprops, self.repository.uuid, self.branch_path, 
-                                self.revnum, rev)
-
-        return rev
-
-    def get_fileid_map(self, mapping):
-        return mapping.import_fileid_map(self.revprops, self.changed_fileprops)
-
-    def __hash__(self):
-        return hash((self.__class__, self.repository.uuid, self.branch_path, self.revnum))
-
-
-def svk_feature_to_revision_id(feature, mapping):
-    """Convert a SVK feature to a revision id for this repository.
-
-    :param feature: SVK feature.
-    :return: revision id.
-    """
-    try:
-        (uuid, bp, revnum) = parse_svk_feature(feature)
-    except errors.InvalidPropertyValue:
-        return None
-    if not mapping.is_branch(bp) and not mapping.is_tag(bp):
-        return None
-    return mapping.revision_id_foreign_to_bzr((uuid, revnum, bp))
-
-
 class SvnRepositoryFormat(RepositoryFormat):
     """Repository format for Subversion repositories (accessed using svn_ra).
     """
@@ -644,37 +496,26 @@
             parent_map[revision_id] = revmeta.get_parent_ids(mapping)
         return parent_map
 
-    def _svk_merged_revisions(self, branch, revnum, mapping, 
-                              current, previous):
-        """Find out what SVK features were merged in a revision.
-
-        """
-        for feature in svk_features_merged_since(current, previous):
-            # We assume svk:merge is only relevant on non-bzr-svn revisions. 
-            # If this is a bzr-svn revision, the bzr-svn properties 
-            # would be parsed instead.
-            #
-            # This saves one svn_get_dir() call.
-            revid = svk_feature_to_revision_id(feature, mapping)
-            if revid is not None:
-                yield revid
-
-    def _revmeta(self, path, revnum, changes=None, revprops=None, fileprops=None, 
+    def _revmeta(self, path, revnum, changes=None, revprops=None, changed_fileprops=None, 
                  consider_fileprops=True):
         if (path, revnum) in self._revmeta_cache:
+            cached = self._revmeta_cache[path,revnum]
             if changes is not None:
-                self._revmeta_cache[path,revnum].paths = changes
+                cached.paths = changes
             if not consider_fileprops:
-                self._revmeta_cache[path,revnum].consider_fileprops = False
+                cached.consider_fileprops = False
+            if cached._changed_fileprops is None:
+                cached._changed_fileprops = changed_fileprops
             return self._revmeta_cache[path,revnum]
 
         if revprops is None:
             revprops = self._log.revprop_list(revnum)
 
-        revmeta = RevisionMetadata(self, path, revnum, changes, revprops, 
-                                   fileprops, consider_fileprops=consider_fileprops)
-        self._revmeta_cache[path,revnum] = revmeta
-        return revmeta
+        ret = revmeta.RevisionMetadata(self, path, revnum, changes, revprops, 
+                                   changed_fileprops=changed_fileprops, 
+                                   consider_fileprops=consider_fileprops)
+        self._revmeta_cache[path,revnum] = ret
+        return ret
 
     def get_revision(self, revision_id):
         """See Repository.get_revision."""
@@ -709,13 +550,7 @@
         assert isinstance(revnum, int)
         assert isinstance(mapping, BzrSvnMapping)
 
-        if revprops is None:
-            revprops = self._log.revprop_list(revnum)
-
-        if changed_fileprops is None:
-            changed_fileprops = self.branchprop_list.get_changed_properties(path, revnum)
-
-        return self.get_revmap().get_revision_id(revnum, path, mapping, revprops, changed_fileprops)
+        return self._revmeta(path, revnum, revprops=revprops, changed_fileprops=changed_fileprops).get_revision_id(mapping)
 
     def lookup_revision_id(self, revid, layout=None, ancestry=None, 
                            project=None):

=== modified file 'revids.py'
--- a/revids.py	2008-09-01 21:15:18 +0000
+++ b/revids.py	2008-09-01 22:34:27 +0000
@@ -128,7 +128,7 @@
         # Find the branch property between min_revnum and max_revnum that 
         # added revid
         for revmeta in self.repos.iter_reverse_branch_changes(branch_path, max_revnum, min_revnum):
-            for propname, propvalue in revmeta.changed_fileprops.items():
+            for propname, propvalue in revmeta.get_changed_fileprops().items():
                 if not propname.startswith(SVN_PROP_BZR_REVISION_ID):
                     continue
                 try:

=== added file 'revmeta.py'
--- a/revmeta.py	1970-01-01 00:00:00 +0000
+++ b/revmeta.py	2008-09-01 22:34:27 +0000
@@ -0,0 +1,188 @@
+# Copyright (C) 2005-2007 Jelmer Vernooij <jelmer at samba.org>
+ 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# 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.revision import NULL_REVISION, Revision
+
+from bzrlib.plugins.svn import changes, errors, properties
+from bzrlib.plugins.svn.mapping import is_bzr_revision_fileprops, is_bzr_revision_revprops, contains_bzr_fileprops
+from bzrlib.plugins.svn.svk import (SVN_PROP_SVK_MERGE, svk_features_merged_since, 
+                 parse_svk_feature)
+
+class RevisionMetadata(object):
+    def __init__(self, repository, branch_path, revnum, paths, revprops, changed_fileprops=None, consider_fileprops=True):
+        self.repository = repository
+        self.branch_path = branch_path
+        self.paths = paths
+        self.revnum = revnum
+        self.revprops = revprops
+        self._changed_fileprops = changed_fileprops
+        self.uuid = repository.uuid
+        self.consider_fileprops = consider_fileprops
+
+    def __repr__(self):
+        return "<RevisionMetadata for revision %d in repository %s>" % (self.revnum, self.repository.uuid)
+
+    def get_revision_id(self, mapping):
+        return self.repository.get_revmap().get_revision_id(self.revnum, self.branch_path, mapping, 
+                                                            self.revprops, self.get_changed_fileprops())
+
+    def get_fileprops(self):
+        return self.repository.branchprop_list.get_properties(self.branch_path, self.revnum)
+
+    def get_previous_fileprops(self):
+        prev = changes.find_prev_location(self.paths, self.branch_path, self.revnum)
+        if prev is None:
+            return {}
+        (prev_path, prev_revnum) = prev
+        return self.repository.branchprop_list.get_properties(prev_path, prev_revnum)
+
+    def get_changed_fileprops(self):
+        if self._changed_fileprops is None:
+            if self.paths is None:
+                self._changed_fileprops = self.repository.branchprop_list.get_changed_properties(self.branch_path, self.revnum)
+            elif self.branch_path in self.paths:
+                self._changed_fileprops = properties.diff(self.get_fileprops(), self.get_previous_fileprops())
+            else:
+                self._changed_fileprops = {}
+        return self._changed_fileprops
+
+    def get_lhs_parent(self, mapping):
+        lhs_parent = mapping.get_lhs_parent(self.branch_path, self.revprops, self.get_changed_fileprops())
+        if lhs_parent is None:
+            # Determine manually
+            lhs_parent = self.repository.lhs_revision_parent(self.branch_path, self.revnum, mapping)
+        return lhs_parent
+
+    def has_bzr_fileprop_ancestors(self):
+        """Check whether there are any bzr file properties present in this revision.
+
+        This can tell us whether one of the ancestors of this revision is a 
+        fileproperty-based bzr revision.
+        """
+        if not self.consider_fileprops:
+            # This revisions descendant doesn't have bzr fileprops set, so this one can't have them either.
+            return False
+        return contains_bzr_fileprops(self.get_fileprops())
+
+    def is_bzr_revision(self):
+        """Determine (with as few network requests as possible) if this is a bzr revision.
+
+        """
+        # If the server already sent us all revprops, look at those first
+        order = []
+        if self.repository.quick_log_revprops:
+            order.append(lambda: is_bzr_revision_revprops(self.revprops))
+        if self.consider_fileprops:
+            order.append(lambda: is_bzr_revision_fileprops(self.get_changed_fileprops()))
+        # Only look for revprops if they could've been committed
+        if (not self.repository.quick_log_revprops and 
+                self.repository.check_revprops):
+            order.append(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.get_changed_fileprops())
+
+        if extra_rhs_parents != ():
+            return extra_rhs_parents
+
+        if self.is_bzr_revision():
+            return ()
+
+        current = self.get_fileprops().get(SVN_PROP_SVK_MERGE, "")
+        if current == "":
+            return ()
+
+        previous = self.get_previous_fileprops().get(SVN_PROP_SVK_MERGE, "")
+
+        return tuple(self._svk_merged_revisions(mapping, current, previous))
+
+    def get_parent_ids(self, mapping):
+        parents_cache = getattr(self.repository._real_parents_provider, "_cache", None)
+        if parents_cache is not None:
+            parent_ids = parents_cache.lookup_parents(self.get_revision_id(mapping))
+            if parent_ids is not None:
+                return parent_ids
+
+        lhs_parent = self.get_lhs_parent(mapping)
+        if lhs_parent == NULL_REVISION:
+            parent_ids = (NULL_REVISION,)
+        else:
+            parent_ids = (lhs_parent,) + self.get_rhs_parents(mapping)
+
+        if parents_cache is not None:
+            parents_cache.insert_parents(self.get_revision_id(mapping), 
+                                         parent_ids)
+
+        return parent_ids
+
+    def get_revision(self, mapping):
+        parent_ids = self.get_parent_ids(mapping)
+        if parent_ids == (NULL_REVISION,):
+            parent_ids = ()
+        rev = Revision(revision_id=self.get_revision_id(mapping), 
+                       parent_ids=parent_ids,
+                       inventory_sha1="")
+
+        rev.svn_meta = self
+        rev.svn_mapping = mapping
+
+        mapping.import_revision(self.revprops, self.get_changed_fileprops(), self.repository.uuid, self.branch_path, 
+                                self.revnum, rev)
+
+        return rev
+
+    def get_fileid_map(self, mapping):
+        return mapping.import_fileid_map(self.revprops, self.get_changed_fileprops())
+
+    def __hash__(self):
+        return hash((self.__class__, self.repository.uuid, self.branch_path, self.revnum))
+
+    def _svk_merged_revisions(self, mapping, current, previous):
+        """Find out what SVK features were merged in a revision.
+
+        """
+        for feature in svk_features_merged_since(current, previous):
+            # We assume svk:merge is only relevant on non-bzr-svn revisions. 
+            # If this is a bzr-svn revision, the bzr-svn properties 
+            # would be parsed instead.
+            #
+            # This saves one svn_get_dir() call.
+            revid = svk_feature_to_revision_id(feature, mapping)
+            if revid is not None:
+                yield revid
+
+
+
+def svk_feature_to_revision_id(feature, mapping):
+    """Convert a SVK feature to a revision id for this repository.
+
+    :param feature: SVK feature.
+    :return: revision id.
+    """
+    try:
+        (uuid, bp, revnum) = parse_svk_feature(feature)
+    except errors.InvalidPropertyValue:
+        return None
+    if not mapping.is_branch(bp) and not mapping.is_tag(bp):
+        return None
+    return mapping.revision_id_foreign_to_bzr((uuid, revnum, bp))
+
+
+




More information about the bazaar-commits mailing list