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