Rev 382: Warn if data changed during an upgrade. in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Sun Jan 7 00:48:49 GMT 2007


------------------------------------------------------------
revno: 382
revision-id: jelmer at samba.org-20070107004800-hfyerfcy9w1s2va6
parent: jelmer at samba.org-20070106231146-r09j2k60av8uz1jf
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Sun 2007-01-07 01:48:00 +0100
message:
  Warn if data changed during an upgrade. 
modified:
  NEWS                           news-20061231030336-h9fhq245ie0de8bs-1
  TODO                           todo-20060729211917-2kpobww0zyvvo0j2-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  tests/test_upgrade.py          test_upgrade.py-20070106170128-64zt3eqggg4tng1c-1
  upgrade.py                     upgrade.py-20070106192108-0rakplee2lzah4gs-1
=== modified file 'NEWS'
--- a/NEWS	2007-01-01 22:18:53 +0000
+++ b/NEWS	2007-01-07 00:48:00 +0000
@@ -54,6 +54,9 @@
 
    * Conversion output can now be on a remote transport.
 
+   * Upgrade command can be used to upgrade branches created with 
+     older versions of the plugin.
+
   PERFORMANCE IMPROVEMENTS
 
    * More efficient implementation of follow_history().

=== modified file 'TODO'
--- a/TODO	2007-01-06 22:56:30 +0000
+++ b/TODO	2007-01-07 00:48:00 +0000
@@ -3,12 +3,12 @@
 - fix autorealm repository
 - handle parent directories of branches being moved correctly
 - fix "bzr status" in lightweight checkouts
-- faster "bzr status" in lightweight checkouts
+ - faster "bzr status" in lightweight checkouts
 - avoid extra connect in logwalker?
 - get rid of use of `svn ls' in logwalker
-- make sure data didn't actually change in upgrade!
-- rewrite TrunkBranchingScheme() and ListBranchingScheme() as subclasses of 
-  ListBranchingScheme()
+- make ListBranchingScheme() support wildcards
+ - rewrite TrunkBranchingScheme() and ListBranchingScheme() as subclasses of 
+   ListBranchingScheme()
 - support multiple branching schemes per repository
 - more efficient implementation for applying txdeltas to weaves. perhaps convert svn deltas to bzr deltas?
 - free memory!

=== modified file 'repository.py'
--- a/repository.py	2007-01-03 22:24:00 +0000
+++ b/repository.py	2007-01-07 00:48:00 +0000
@@ -464,9 +464,6 @@
         return bzrlib.xml5.serializer_v5.write_revision_to_string(
             self.get_revision(revision_id))
 
-    def get_revision_sha1(self, revision_id):
-        return osutils.sha_string(self.get_revision_xml(revision_id))
-
     def follow_history(self, revnum):
         while revnum > 0:
             yielded_paths = []

=== modified file 'tests/test_upgrade.py'
--- a/tests/test_upgrade.py	2007-01-06 22:56:30 +0000
+++ b/tests/test_upgrade.py	2007-01-07 00:48:00 +0000
@@ -18,6 +18,7 @@
 from bzrlib.errors import NoRepositoryPresent, InvalidRevisionId
 from bzrlib.repository import Repository
 from bzrlib.tests import TestCase, TestCaseWithTransport
+from bzrlib.trace import mutter
 
 import repository
 from repository import SvnRepository, MAPPING_VERSION, REVISION_ID_PREFIX
@@ -98,7 +99,7 @@
 
         self.assertTrue(newrepos.has_revision("svn-v1:1@%s-" % oldrepos.uuid))
 
-        upgrade_repository(newrepos, oldrepos)
+        upgrade_repository(newrepos, oldrepos, allow_change=True)
 
         self.assertTrue(newrepos.has_revision("svn-v%d:1@%s-" % (MAPPING_VERSION, oldrepos.uuid)))
 
@@ -120,7 +121,7 @@
         file("f/a", 'w').write("moredata")
         wt.commit(message='fix moredata', rev_id="customrev")
 
-        upgrade_repository(newrepos, oldrepos)
+        upgrade_repository(newrepos, oldrepos, allow_change=True)
 
         self.assertTrue(newrepos.has_revision("svn-v%d:1@%s-" % (MAPPING_VERSION, oldrepos.uuid)))
         self.assertTrue(newrepos.has_revision("customrev-svn%d-upgrade" % MAPPING_VERSION))
@@ -146,7 +147,7 @@
         file("f/a", 'w').write("blackfield")
         wt.commit(message='fix it again', rev_id="anotherrev")
 
-        renames = upgrade_repository(newrepos, oldrepos)
+        renames = upgrade_repository(newrepos, oldrepos, allow_change=True)
         self.assertEqual({
             "svn-v1:1@%s-" % oldrepos.uuid:"svn-v%d:1@%s-" % (MAPPING_VERSION, oldrepos.uuid),
             "customrev": "customrev-svn%d-upgrade" % MAPPING_VERSION,
@@ -180,7 +181,7 @@
         file("f/a", 'w').write("blackfield")
         wt.commit(message='fix it again', rev_id="anotherrev")
 
-        upgrade_branch(b, oldrepos)
+        upgrade_branch(b, oldrepos, allow_change=True)
         self.assertEqual(["svn-v2:1@%s-" % oldrepos.uuid,
                           "customrev-svn%d-upgrade" % MAPPING_VERSION,
                           "anotherrev-svn%d-upgrade" % MAPPING_VERSION
@@ -208,3 +209,20 @@
         upgrade_branch(b, oldrepos)
         self.assertEqual(["blarev", "customrev", "anotherrev"],
                 b.revision_history())
+
+    def test_raise_incompat(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/d': 'e'})
+        self.client_add("dc/d")
+        self.client_commit("dc", "data")
+
+        oldrepos = Repository.open(repos_url)
+        dir = BzrDir.create("f")
+        newrepos = dir.create_repository()
+        b = dir.create_branch()
+        wt = dir.create_workingtree()
+        file("f/a", "w").write("c")
+        wt.add("a")
+        wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
+
+        self.assertRaises(UpgradeChangesContent, upgrade_branch, b, oldrepos)

=== modified file 'upgrade.py'
--- a/upgrade.py	2007-01-06 23:11:46 +0000
+++ b/upgrade.py	2007-01-07 00:48:00 +0000
@@ -19,6 +19,7 @@
 
 from bzrlib.config import Config
 from bzrlib.errors import BzrError, InvalidRevisionId
+from bzrlib.trace import mutter
 from bzrlib.ui import ui_factory
 
 from repository import (MAPPING_VERSION, parse_svn_revision_id, 
@@ -91,10 +92,22 @@
 def upgrade_branch(branch, svn_repository, allow_change=False):
     renames = upgrade_repository(branch.repository, svn_repository, 
               branch.last_revision(), allow_change)
+    mutter('renames %r' % renames)
     if len(renames) > 0:
         branch.generate_revision_history(renames[branch.last_revision()])
 
 
+def revision_changed(oldrev, newrev):
+    if (newrev.inventory_sha1 != oldrev.inventory_sha1 or
+        newrev.timestamp != oldrev.timestamp or
+        newrev.message != oldrev.message or
+        newrev.timezone != oldrev.timezone or
+        newrev.committer != oldrev.committer or
+        newrev.properties != oldrev.properties):
+        return True
+    return False
+
+
 def upgrade_repository(repository, svn_repository, revision_id=None, 
                        allow_change=False):
     needed_revs = []
@@ -123,6 +136,13 @@
                     newrevid = generate_svn_revision_id(uuid, rev, bp)
                     if svn_repository.has_revision(newrevid):
                         rename_map[revid] = newrevid
+                        if not repository.has_revision(newrevid):
+                            if not allow_change:
+                                oldrev = repository.get_revision(revid)
+                                newrev = svn_repository.get_revision(newrevid)
+                                if revision_changed(oldrev, newrev):
+                                    raise UpgradeChangesContent(revid)
+                            needed_revs.append(newrevid)
                         continue
                 except InvalidRevisionId:
                     pass
@@ -132,8 +152,15 @@
                         (uuid, bp, rev, version) = parse_legacy_revision_id(parent)
                         new_parent = generate_svn_revision_id(uuid, rev, bp)
                         if new_parent != parent:
-                            needed_revs.append(new_parent)
+                            if not repository.has_revision(revid):
+                                needed_revs.append(new_parent)
                             needs_upgrading.append(revid)
+
+                            if not allow_change:
+                                oldrev = repository.get_revision(parent)
+                                newrev = svn_repository.get_revision(new_parent)
+                                if revision_changed(oldrev, newrev):
+                                    raise UpgradeChangesContent(parent)
                         new_parents[revid].append(new_parent)
                     except InvalidRevisionId:
                         new_parents[revid].append(parent)




More information about the bazaar-commits mailing list