13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Tests for upgrade of old trees.
19
This file contains canned versions of some old trees, which are instantiated
19
This file contains canned versions of some old trees, which are instantiated
20
20
and then upgraded to the new format."""
22
22
# TODO queue for upgrade:
38
37
import bzrlib.branch
39
38
from bzrlib.branch import Branch
40
39
from bzrlib.tests import TestCaseWithTransport
40
from bzrlib.transport import get_transport
41
41
from bzrlib.upgrade import upgrade
44
44
class TestUpgrade(TestCaseWithTransport):
46
def test_build_tree(self):
47
"""Test tree-building test helper"""
48
self.build_tree_contents(_upgrade1_template)
49
self.failUnlessExists('foo')
50
self.failUnlessExists('.bzr/README')
46
52
def test_upgrade_simple(self):
47
53
"""Upgrade simple v0.0.4 format to latest format"""
75
81
# check a backup was made:
76
backup_dir = 'backup.bzr.~1~'
77
t = transport.get_transport(b.base)
79
t.stat(backup_dir + '/README')
80
t.stat(backup_dir + '/branch-format')
81
t.stat(backup_dir + '/revision-history')
82
t.stat(backup_dir + '/merged-patches')
83
t.stat(backup_dir + '/pending-merged-patches')
84
t.stat(backup_dir + '/pending-merges')
85
t.stat(backup_dir + '/branch-name')
86
t.stat(backup_dir + '/branch-lock')
87
t.stat(backup_dir + '/inventory')
88
t.stat(backup_dir + '/stat-cache')
89
t.stat(backup_dir + '/text-store')
90
t.stat(backup_dir + '/text-store/foo-20051004035611-1591048e9dc7c2d4.gz')
91
t.stat(backup_dir + '/text-store/foo-20051004035756-4081373d897c3453.gz')
92
t.stat(backup_dir + '/inventory-store/')
93
t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
94
t.stat(backup_dir + '/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
95
t.stat(backup_dir + '/revision-store/')
96
t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
97
t.stat(backup_dir + '/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
82
transport = get_transport(b.base)
83
transport.stat('backup.bzr')
84
transport.stat('backup.bzr/README')
85
transport.stat('backup.bzr/branch-format')
86
transport.stat('backup.bzr/revision-history')
87
transport.stat('backup.bzr/merged-patches')
88
transport.stat('backup.bzr/pending-merged-patches')
89
transport.stat('backup.bzr/pending-merges')
90
transport.stat('backup.bzr/branch-name')
91
transport.stat('backup.bzr/branch-lock')
92
transport.stat('backup.bzr/inventory')
93
transport.stat('backup.bzr/stat-cache')
94
transport.stat('backup.bzr/text-store')
95
transport.stat('backup.bzr/text-store/foo-20051004035611-1591048e9dc7c2d4.gz')
96
transport.stat('backup.bzr/text-store/foo-20051004035756-4081373d897c3453.gz')
97
transport.stat('backup.bzr/inventory-store/')
98
transport.stat('backup.bzr/inventory-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
99
transport.stat('backup.bzr/inventory-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
100
transport.stat('backup.bzr/revision-store/')
101
transport.stat('backup.bzr/revision-store/mbp@sourcefrog.net-20051004035611-176b16534b086b3c.gz')
102
transport.stat('backup.bzr/revision-store/mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd.gz')
99
104
def test_upgrade_with_ghosts(self):
100
105
"""Upgrade v0.0.4 tree containing ghost references.
102
107
That is, some of the parents of revisions mentioned in the branch
103
aren't present in the branch's storage.
108
aren't present in the branch's storage.
105
This shouldn't normally happen in branches created entirely in
110
This shouldn't normally happen in branches created entirely in
106
111
bzr, but can happen in branches imported from baz and arch, or from
107
other systems, where the importer knows about a revision but not
112
other systems, where the importer knows about a revision but not
109
114
eq = self.assertEquals
110
115
self.build_tree_contents(_ghost_template)
120
125
old_repodir = bzrlib.bzrdir.BzrDir.open_unsupported('.')
121
126
old_repo_format = old_repodir.open_repository()._format
123
# this is the path to the literal file. As format changes
128
# this is the path to the literal file. As format changes
124
129
# occur it needs to be updated. FIXME: ask the store for the
126
131
repo = bzrlib.repository.Repository.open('.')
127
132
# it should have changed the format
128
133
self.assertNotEqual(old_repo_format.__class__, repo._format.__class__)
129
# and we should be able to read the names for the file id
134
# and we should be able to read the names for the file id
130
135
# 'dir-20051005095101-da1441ea3fa6917a'
132
137
self.addCleanup(repo.unlock)
133
text_keys = repo.texts.keys()
134
dir_keys = [key for key in text_keys if key[0] ==
135
'dir-20051005095101-da1441ea3fa6917a']
136
self.assertNotEqual([], dir_keys)
140
repo.weave_store.get_weave(
141
'dir-20051005095101-da1441ea3fa6917a',
142
repo.get_transaction()).versions())
138
144
def test_upgrade_to_meta_sets_workingtree_last_revision(self):
139
145
self.build_tree_contents(_upgrade_dir_template)
147
153
# such a branch to metadir must not setup a working tree.
148
154
self.build_tree_contents(_upgrade1_template)
149
155
upgrade('.', bzrdir.BzrDirFormat6())
150
t = transport.get_transport('.')
151
t.delete_multi(['.bzr/pending-merges', '.bzr/inventory'])
152
self.assertFalse(t.has('.bzr/stat-cache'))
156
transport = get_transport('.')
157
transport.delete_multi(['.bzr/pending-merges', '.bzr/inventory'])
158
self.assertFalse(transport.has('.bzr/stat-cache'))
153
159
# XXX: upgrade fails if a backup.bzr is already present
154
160
# -- David Allouche 2006-08-11
155
t.delete_tree('backup.bzr.~1~')
161
transport.delete_tree('backup.bzr')
156
162
# At this point, we have a format6 branch without checkout files.
157
163
upgrade('.', bzrdir.BzrDirMetaFormat1())
158
164
# The upgrade should not have set up a working tree.
167
173
['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
168
174
'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
170
def test_upgrade_rich_root(self):
171
tree = self.make_branch_and_tree('tree', format='rich-root')
172
rev_id = tree.commit('first post')
175
176
def test_convert_branch5_branch6(self):
176
177
branch = self.make_branch('branch', format='knit')
177
178
branch.set_revision_history(['AB', 'CD'])
180
181
branch.set_push_location('file:///IJ')
181
182
target = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
182
183
converter = branch.bzrdir._format.get_converter(target)
183
converter.convert(branch.bzrdir, None)
184
converter.convert(branch.bzrdir, progress.DummyProgress())
184
185
new_branch = _mod_branch.Branch.open(self.get_url('branch'))
185
186
self.assertIs(new_branch.__class__, _mod_branch.BzrBranch6)
186
187
self.assertEqual('CD', new_branch.last_revision())
193
194
branch2 = self.make_branch('branch2', format='knit')
194
195
converter = branch2.bzrdir._format.get_converter(target)
195
converter.convert(branch2.bzrdir, None)
196
converter.convert(branch2.bzrdir, progress.DummyProgress())
196
197
branch2 = _mod_branch.Branch.open(self.get_url('branch'))
197
198
self.assertIs(branch2.__class__, _mod_branch.BzrBranch6)
199
def test_convert_branch7_branch8(self):
200
branch = self.make_branch('branch', format='1.9')
201
target = bzrdir.format_registry.make_bzrdir('1.9')
202
target.set_branch_format(_mod_branch.BzrBranchFormat8())
203
converter = branch.bzrdir._format.get_converter(target)
204
converter.convert(branch.bzrdir, None)
205
branch = _mod_branch.Branch.open(self.get_url('branch'))
206
self.assertIs(branch.__class__, _mod_branch.BzrBranch8)
207
self.assertEqual({}, branch._get_all_reference_info())
209
200
def test_convert_knit_dirstate_empty(self):
210
201
# test that asking for an upgrade from knit to dirstate works.
211
202
tree = self.make_branch_and_tree('tree', format='knit')
212
203
target = bzrdir.format_registry.make_bzrdir('dirstate')
213
204
converter = tree.bzrdir._format.get_converter(target)
214
converter.convert(tree.bzrdir, None)
205
converter.convert(tree.bzrdir, progress.DummyProgress())
215
206
new_tree = workingtree.WorkingTree.open('tree')
216
207
self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
217
208
self.assertEqual('null:', new_tree.last_revision())
224
215
tree.add(['file'], ['file-id'])
225
216
target = bzrdir.format_registry.make_bzrdir('dirstate')
226
217
converter = tree.bzrdir._format.get_converter(target)
227
converter.convert(tree.bzrdir, None)
218
converter.convert(tree.bzrdir, progress.DummyProgress())
228
219
new_tree = workingtree.WorkingTree.open('tree')
229
220
self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
230
221
self.assertEqual('null:', new_tree.last_revision())
235
226
rev_id = tree.commit('first post')
236
227
target = bzrdir.format_registry.make_bzrdir('dirstate')
237
228
converter = tree.bzrdir._format.get_converter(target)
238
converter.convert(tree.bzrdir, None)
229
converter.convert(tree.bzrdir, progress.DummyProgress())
239
230
new_tree = workingtree.WorkingTree.open('tree')
240
231
self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
241
232
self.assertEqual(rev_id, new_tree.last_revision())
252
243
tree.merge_from_branch(merge_tree.branch)
253
244
target = bzrdir.format_registry.make_bzrdir('dirstate')
254
245
converter = tree.bzrdir._format.get_converter(target)
255
converter.convert(tree.bzrdir, None)
246
converter.convert(tree.bzrdir, progress.DummyProgress())
256
247
new_tree = workingtree.WorkingTree.open('tree')
257
248
self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
258
249
self.assertEqual(rev_id2, new_tree.last_revision())