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