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