Rev 1707: More bugfixes. in file:///data/jelmer/bzr-svn/trunk/
Jelmer Vernooij
jelmer at samba.org
Fri Aug 29 22:48:09 BST 2008
At file:///data/jelmer/bzr-svn/trunk/
------------------------------------------------------------
revno: 1707
revision-id: jelmer at samba.org-20080829214803-2jf0om4f9p0pvddu
parent: jelmer at samba.org-20080829204608-znabytduhk7cr278
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Fri 2008-08-29 23:48:03 +0200
message:
More bugfixes.
modified:
TODO todo-20060729211917-2kpobww0zyvvo0j2-1
logwalker.py logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
mapping.py mapping.py-20080128201303-6cp01phc0dmc0kiv-1
mapping3/__init__.py __init__.py-20080502174630-9324zh25kka98vlw-1
mapping4.py mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
repository.py repository.py-20060306123302-1f8c5069b3fe0265
tags.py tags.py-20080822211316-scblu3akdvu0b64c-1
upgrade.py upgrade.py-20070106192108-0rakplee2lzah4gs-1
=== modified file 'TODO'
--- a/TODO 2008-08-29 19:02:27 +0000
+++ b/TODO 2008-08-29 21:48:03 +0000
@@ -1,11 +1,8 @@
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
- - implement set-svn-revprops command
- - iterate over all revisions in history and:
- - check if a revision is a bzr revision
- - if it is, upgrade it
- implement layout functions, including command
+ - integrate svn-set-revprops into svn-upgrade ?
todo:
- generate deltas rather than fulltexts when creating file id maps
=== modified file 'logwalker.py'
--- a/logwalker.py 2008-08-29 20:46:08 +0000
+++ b/logwalker.py 2008-08-29 21:48:03 +0000
@@ -206,7 +206,6 @@
def drop_revprops(self, revnum):
self.cachedb.execute("update revinfo set all_revprops = 0 where rev = ?", (revnum,))
- self.cachedb.commit()
def get_revprops(self, revnum):
"""Retrieve all the cached revision properties.
=== modified file 'mapping.py'
--- a/mapping.py 2008-08-29 20:11:40 +0000
+++ b/mapping.py 2008-08-29 21:48:03 +0000
@@ -17,6 +17,7 @@
from bzrlib import osutils, registry
from bzrlib.errors import InvalidRevisionId
+from bzrlib.revision import NULL_REVISION
from bzrlib.trace import mutter
from bzrlib.plugins.svn import errors, foreign, properties, version_info
@@ -46,6 +47,8 @@
SVN_REVPROP_BZR_LOG = 'bzr:log'
SVN_REVPROP_BZR_TEXT_PARENTS = 'bzr:text-parents'
SVN_REVPROP_BZR_REQUIRED_FEATURES = 'bzr:required-features'
+SVN_REVPROP_BZR_BASE_REVISION = 'bzr:base-revision'
+SVN_REVPROP_BZR_SKIP = 'bzr:skip'
def escape_svn_path(x):
@@ -142,19 +145,22 @@
return (properties.time_from_cstring(date) / 1000000.0, 0)
+def parse_svn_log(log):
+ if log is None:
+ return None
+ try:
+ return log.decode("utf-8")
+ except UnicodeDecodeError:
+ return log
+
+
def parse_svn_revprops(svn_revprops, rev):
if svn_revprops.has_key(properties.PROP_REVISION_AUTHOR):
rev.committer = svn_revprops[properties.PROP_REVISION_AUTHOR]
else:
rev.committer = ""
- rev.message = svn_revprops.get(properties.PROP_REVISION_LOG)
-
- if rev.message:
- try:
- rev.message = rev.message.decode("utf-8")
- except UnicodeDecodeError:
- pass
+ rev.message = parse_svn_log(svn_revprops.get(properties.PROP_REVISION_LOG))
assert svn_revprops.has_key(properties.PROP_REVISION_DATE)
(rev.timestamp, rev.timezone) = parse_svn_dateprop(svn_revprops[properties.PROP_REVISION_DATE])
@@ -343,6 +349,15 @@
"""
raise NotImplementedError(self.import_revision)
+ def get_lhs_parent(self, branch_path, revprops, fileprops):
+ """Determine the left hand side parent, if it was explicitly recorded.
+
+ If not explicitly recorded, returns None. Returns NULL_REVISION if
+ there is no lhs parent.
+
+ """
+ return None
+
def get_rhs_parents(self, branch_path, revprops, fileprops):
"""Obtain the right-hand side parents for a revision.
@@ -387,7 +402,7 @@
"""
raise NotImplementedError(self.export_text_parents)
- def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops):
+ def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops):
"""Determines the revision properties and branch root file
properties.
"""
@@ -547,14 +562,14 @@
return svnprops
- def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops):
+ def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops):
# Keep track of what Subversion properties to set later on
svn_fileprops[SVN_PROP_BZR_REVISION_INFO] = generate_revision_metadata(
timestamp, timezone, committer, revprops)
- if len(merges) > 0:
- svn_fileprops.update(self.record_merges(merges, svn_fileprops))
+ if len(parent_ids) > 1:
+ svn_fileprops.update(self.record_merges(parent_ids[1:], svn_fileprops))
# Set appropriate property if revision id was specified by
# caller
@@ -616,6 +631,9 @@
if text_parents != {}:
svn_revprops[SVN_REVPROP_BZR_TEXT_PARENTS] = generate_text_parents_property(text_parents)
+ def get_lhs_parent(self, branch_parent, svn_revprops, fileprops):
+ return svn_revprops.get(SVN_REVPROP_BZR_BASE_REVISION)
+
def get_rhs_parents(self, branch_path, svn_revprops,
fileprops):
if svn_revprops[SVN_REVPROP_BZR_ROOT] != branch:
@@ -623,7 +641,11 @@
return svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines()
def is_bzr_revision(self, revprops, fileprops):
- return revprops.has_key(SVN_REVPROP_BZR_MAPPING_VERSION)
+ 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):
@@ -637,7 +659,7 @@
def export_message(self, message, revprops, fileprops):
revprops[SVN_REVPROP_BZR_LOG] = message.encode("utf-8")
- def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops):
+ def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops):
if timestamp is not None:
svn_revprops[SVN_REVPROP_BZR_TIMESTAMP] = format_highres_date(timestamp, timezone)
@@ -654,8 +676,13 @@
if revision_id is not None:
svn_revprops[SVN_REVPROP_BZR_REVISION_ID] = revision_id
- if merges != []:
- svn_revprops[SVN_REVPROP_BZR_MERGE] = "".join([x+"\n" for x in merges])
+ if len(parent_ids) > 1:
+ svn_revprops[SVN_REVPROP_BZR_MERGE] = "".join([x+"\n" for x in parent_ids[1:]])
+ if len(parent_ids) == 0:
+ svn_revprops[SVN_REVPROP_BZR_BASE_REVISION] = NULL_REVISION
+ else:
+ svn_revprops[SVN_REVPROP_BZR_BASE_REVISION] = parent_ids[0]
+
svn_revprops[SVN_REVPROP_BZR_REVNO] = str(revno)
def export_fileid_map(self, fileids, revprops, fileprops):
=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py 2008-08-29 20:03:11 +0000
+++ b/mapping3/__init__.py 2008-08-29 21:48:03 +0000
@@ -356,10 +356,10 @@
if svn_revprops is not None:
self.revprop_map.export_text_parents(text_parents, svn_revprops, fileprops)
- def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops):
- mapping.BzrSvnMappingFileProps.export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops)
+ def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops):
+ mapping.BzrSvnMappingFileProps.export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops)
if svn_revprops is not None:
- self.revprop_map.export_revision(branch_root, timestamp, timezone, committer, revprops, None, revno, merges, svn_revprops, svn_fileprops)
+ self.revprop_map.export_revision(branch_root, timestamp, timezone, committer, revprops, None, revno, parent_ids, svn_revprops, svn_fileprops)
def export_fileid_map(self, fileids, revprops, fileprops):
mapping.BzrSvnMappingFileProps.export_fileid_map(self, fileids, revprops, fileprops)
@@ -373,8 +373,8 @@
class BzrSvnMappingv3RevProps(mapping.BzrSvnMappingRevProps, BzrSvnMappingv3):
- def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops):
- mapping.BzrSvnMappingRevProps.export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, merges, svn_revprops, svn_fileprops)
+ def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops):
+ mapping.BzrSvnMappingRevProps.export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops)
svn_revprops[mapping.SVN_REVPROP_BZR_MAPPING_VERSION] = "3"
=== modified file 'mapping4.py'
--- a/mapping4.py 2008-08-29 20:03:11 +0000
+++ b/mapping4.py 2008-08-29 21:48:03 +0000
@@ -48,6 +48,13 @@
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)
@@ -79,6 +86,9 @@
def __eq__(self, other):
return type(self) == type(other)
+ def get_lhs_parent(self, branch_path, svn_revprops, fileprops):
+ return self.revprops.get_lhs_parent(branch_path, svn_revprops, fileprops)
+
def get_rhs_parents(self, branch_path, svn_revprops, fileprops):
if svn_revprops.has_key(mapping.SVN_REVPROP_BZR_MAPPING_VERSION):
return self.revprops.get_rhs_parents(branch_path, svn_revprops, fileprops)
@@ -104,14 +114,14 @@
return self.fileprops.import_fileid_map(svn_revprops, fileprops)
def export_revision(self, branch_root, timestamp, timezone, committer, revprops, revision_id,
- revno, merges, svn_revprops, svn_fileprops):
+ revno, parent_ids, svn_revprops, svn_fileprops):
if svn_revprops is not None:
self.revprops.export_revision(branch_root, timestamp, timezone, committer,
- revprops, revision_id, revno, merges, svn_revprops, svn_fileprops)
+ revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops)
svn_revprops[mapping.SVN_REVPROP_BZR_MAPPING_VERSION] = "v4"
else:
self.fileprops.export_revision(branch_root, timestamp, timezone, committer,
- revprops, revision_id, revno, merges, svn_revprops, svn_fileprops)
+ revprops, revision_id, revno, parent_ids, svn_revprops, svn_fileprops)
def export_fileid_map(self, fileids, revprops, fileprops):
if revprops is not None:
=== modified file 'repository.py'
--- a/repository.py 2008-08-29 16:27:15 +0000
+++ b/repository.py 2008-08-29 21:48:03 +0000
@@ -74,7 +74,14 @@
return self.repository.generate_revision_id(self.revnum, self.branch_path, mapping, self.revprops, self.fileprops)
def get_lhs_parent(self, mapping):
- return self.repository.lhs_revision_parent(self.branch_path, self.revnum, mapping)
+ lhs_parent = mapping.get_lhs_parent(self.branch_path, self.revprops, self.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 is_bzr_revision(self, mapping):
+ return mapping.is_bzr_revision(self.revprops, self.fileprops)
def get_rhs_parents(self, mapping):
extra_rhs_parents = mapping.get_rhs_parents(self.branch_path, self.revprops, self.fileprops)
@@ -82,7 +89,7 @@
if extra_rhs_parents != ():
return extra_rhs_parents
- if mapping.is_bzr_revision(self.revprops, self.fileprops):
+ if self.is_bzr_revision(mapping):
return ()
(prev_path, prev_revnum) = self.repository._log.get_previous(self.branch_path,
@@ -113,6 +120,23 @@
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.fileprops, self.repository.uuid, self.branch_path,
+ self.revnum, rev)
+
+ return rev
+
+
def __hash__(self):
return hash((self.__class__, self.repository.uuid, self.branch_path, self.revnum))
@@ -585,20 +609,7 @@
revmeta = RevisionMetadata(self, path, None, revnum, svn_revprops, svn_fileprops)
- parent_ids = revmeta.get_parent_ids(mapping)
- if parent_ids == (NULL_REVISION,):
- parent_ids = ()
- rev = Revision(revision_id=revision_id,
- parent_ids=parent_ids,
- inventory_sha1="")
-
- rev.svn_meta = revmeta
- rev.svn_mapping = mapping
-
- mapping.import_revision(svn_revprops, svn_fileprops, self.uuid, path,
- revnum, rev)
-
- return rev
+ return revmeta.get_revision(mapping)
def get_revisions(self, revision_ids):
"""See Repository.get_revisions()."""
=== modified file 'tags.py'
--- a/tags.py 2008-08-27 17:39:12 +0000
+++ b/tags.py 2008-08-29 21:48:03 +0000
@@ -35,7 +35,7 @@
return
conn = self.repository.transport.get_connection()
try:
- ci = conn.get_commit_editor({properties.PROP_REVISION_LOG: "Add tags base directory."})
+ ci = conn.get_commit_editor(self._revprops("Add tags base directory."))
try:
root = ci.open_root()
name = None
@@ -76,7 +76,7 @@
conn = self.repository.transport.get_connection(parent)
deletefirst = (conn.check_path(urlutils.basename(path), self.repository.get_latest_revnum()) != core.NODE_NONE)
try:
- ci = conn.get_commit_editor({properties.PROP_REVISION_LOG: "Add tag %s" % tag_name.encode("utf-8")})
+ ci = conn.get_commit_editor(self._revprops("Add tag %s" % tag_name.encode("utf-8")))
try:
root = ci.open_root()
if deletefirst:
@@ -90,6 +90,16 @@
finally:
self.repository.transport.add_connection(conn)
+ def _revprops(self, message):
+ """Create a revprops dictionary.
+
+ Optionally sets bzr:skip to slightly optimize fetching of this revision later.
+ """
+ revprops = {properties.PROP_REVISION_LOG: message}
+ if self.repository.transport.has_capability("commit-revprops"):
+ revprops[mapping.SVN_REVPROP_BZR_SKIP] = ""
+ return revprops
+
def lookup_tag(self, tag_name):
try:
return self.get_tag_dict()[tag_name]
@@ -120,7 +130,7 @@
try:
if conn.check_path(urlutils.basename(path), self.repository.get_latest_revnum()) != core.NODE_DIR:
raise NoSuchTag(tag_name)
- ci = conn.get_commit_editor({properties.PROP_REVISION_LOG: "Remove tag %s" % tag_name.encode("utf-8")})
+ ci = conn.get_commit_editor(self._revprops("Remove tag %s" % tag_name.encode("utf-8")))
try:
root = ci.open_root()
root.delete_entry(urlutils.basename(path))
=== modified file 'upgrade.py'
--- a/upgrade.py 2008-08-29 20:46:08 +0000
+++ b/upgrade.py 2008-08-29 21:48:03 +0000
@@ -242,23 +242,29 @@
else:
fileprops = logwalker.lazy_dict({}, repository.branchprop_list.get_properties, bp, revnum)
old_mapping = mapping.find_mapping(revprops, fileprops)
- if old_mapping is None or old_mapping == new_mapping:
+ if old_mapping is None:
+ # Not a bzr-svn revision
+ if not mapping.SVN_REVPROP_BZR_SKIP in revprops:
+ repository.transport.change_rev_prop(revnum, mapping.SVN_REVPROP_BZR_SKIP, "")
+ continue
+ if old_mapping == new_mapping:
+ # Already the latest mapping
continue
assert old_mapping.supports_custom_revprops() or bp is not None
new_revprops = dict(revprops.items())
- rev = Revision(old_mapping.get_revision_id(bp, revprops, fileprops)[1])
- old_mapping.import_revision(revprops, fileprops, repository.uuid, bp, revnum, rev)
+ revmeta = RevisionMetadata(repository, bp, changes, revnum, revprops, fileprops)
+ rev = revmeta.get_revision(old_mapping)
revno = graph.find_distance_to_null(rev.revision_id, [])
- new_mapping.export_revision(bp, rev.timestamp, rev.timezone, rev.committer, rev.properties, rev.revision_id, revno, old_mapping.get_rhs_parents(bp, revprops, fileprops), new_revprops, 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)
new_mapping.export_text_parents(old_mapping.import_text_parents(revprops, fileprops),
new_revprops, None)
- if rev.message != revprops[properties.PROP_REVISION_LOG]:
- new_mapping.export_message(rev.message)
+ 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()))
if logcache is not None:
- logcache.drop_revprops()
+ logcache.drop_revprops(revnum)
for k, v in changed_revprops.items():
repository.transport.change_rev_prop(revnum, k, v)
# Might as well update the cache while we're at it
More information about the bazaar-commits
mailing list