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