~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_upgrade.py

  • Committer: Martin Pool
  • Date: 2006-03-21 12:26:54 UTC
  • mto: This revision was merged to the branch mainline in revision 1621.
  • Revision ID: mbp@sourcefrog.net-20060321122654-514047ed65795a17
New developer commands 'weave-list' and 'weave-join'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Canonical Ltd
 
1
# Copyright (C) 2005 by Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
26
26
import os
27
27
import sys
28
28
 
29
 
from bzrlib import (
30
 
    branch as _mod_branch,
31
 
    bzrdir,
32
 
    progress,
33
 
    repository,
34
 
    workingtree,
35
 
    workingtree_4,
36
 
    )
37
29
import bzrlib.branch
38
30
from bzrlib.branch import Branch
39
 
from bzrlib.tests import TestCaseWithTransport
 
31
import bzrlib.bzrdir as bzrdir
 
32
import bzrlib.repository as repository
 
33
from bzrlib.revision import is_ancestor
 
34
from bzrlib.tests import TestCase, TestCaseInTempDir
40
35
from bzrlib.transport import get_transport
41
36
from bzrlib.upgrade import upgrade
42
 
 
43
 
 
44
 
class TestUpgrade(TestCaseWithTransport):
 
37
import bzrlib.workingtree as workingtree
 
38
 
 
39
 
 
40
class TestUpgrade(TestCaseInTempDir):
45
41
    
46
42
    def test_build_tree(self):
47
43
        """Test tree-building test helper"""
50
46
        self.failUnlessExists('.bzr/README')
51
47
 
52
48
    def test_upgrade_simple(self):
53
 
        """Upgrade simple v0.0.4 format to latest format"""
 
49
        """Upgrade simple v0.0.4 format to v6"""
54
50
        eq = self.assertEquals
55
51
        self.build_tree_contents(_upgrade1_template)
56
52
        upgrade(u'.')
57
53
        control = bzrdir.BzrDir.open('.')
58
54
        b = control.open_branch()
 
55
        r = control.open_repository()
 
56
        t = control.open_workingtree()
59
57
        # tsk, peeking under the covers.
60
 
        self.failUnless(
61
 
            isinstance(
62
 
                control._format,
63
 
                bzrdir.BzrDirFormat.get_default_format().__class__))
 
58
        self.failUnless(isinstance(control._format, bzrdir.BzrDirFormat6))
 
59
        self.failUnless(isinstance(b._format, bzrlib.branch.BzrBranchFormat4))
 
60
        self.failUnless(isinstance(r._format, repository.RepositoryFormat6))
 
61
        self.failUnless(isinstance(t._format, workingtree.WorkingTreeFormat2))
64
62
        rh = b.revision_history()
65
63
        eq(rh,
66
64
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
114
112
 
115
113
    def test_upgrade_makes_dir_weaves(self):
116
114
        self.build_tree_contents(_upgrade_dir_template)
117
 
        old_repodir = bzrlib.bzrdir.BzrDir.open_unsupported('.')
118
 
        old_repo_format = old_repodir.open_repository()._format
119
115
        upgrade('.')
120
116
        # this is the path to the literal file. As format changes 
121
117
        # occur it needs to be updated. FIXME: ask the store for the
122
118
        # path.
123
 
        repo = bzrlib.repository.Repository.open('.')
124
 
        # it should have changed the format
125
 
        self.assertNotEqual(old_repo_format.__class__, repo._format.__class__)
126
 
        # and we should be able to read the names for the file id 
127
 
        # 'dir-20051005095101-da1441ea3fa6917a'
128
 
        self.assertNotEqual(
129
 
            [],
130
 
            repo.text_store.get_weave(
131
 
                'dir-20051005095101-da1441ea3fa6917a',
132
 
                repo.get_transaction()))
 
119
        self.failUnlessExists(
 
120
            '.bzr/weaves/de/dir-20051005095101-da1441ea3fa6917a.weave')
133
121
 
134
122
    def test_upgrade_to_meta_sets_workingtree_last_revision(self):
135
123
        self.build_tree_contents(_upgrade_dir_template)
136
124
        upgrade('.', bzrdir.BzrDirMetaFormat1())
137
125
        tree = workingtree.WorkingTree.open('.')
138
 
        self.assertEqual([tree.branch.revision_history()[-1]],
139
 
            tree.get_parent_ids())
140
 
 
141
 
    def test_upgrade_v6_to_meta_no_workingtree(self):
142
 
        # Some format6 branches do not have checkout files. Upgrading
143
 
        # such a branch to metadir must not setup a working tree.
144
 
        self.build_tree_contents(_upgrade1_template)
145
 
        upgrade('.', bzrdir.BzrDirFormat6())
146
 
        transport = get_transport('.')
147
 
        transport.delete_multi(['.bzr/pending-merges', '.bzr/inventory'])
148
 
        assert not transport.has('.bzr/stat-cache')
149
 
        # XXX: upgrade fails if a .bzr.backup is already present
150
 
        # -- David Allouche 2006-08-11
151
 
        transport.delete_tree('.bzr.backup')
152
 
        # At this point, we have a format6 branch without checkout files.
153
 
        upgrade('.', bzrdir.BzrDirMetaFormat1())
154
 
        # The upgrade should not have set up a working tree.
155
 
        control = bzrdir.BzrDir.open('.')
156
 
        self.assertFalse(control.has_workingtree())
157
 
        # We have covered the scope of this test, we may as well check that
158
 
        # upgrade has not eaten our data, even if it's a bit redundant with
159
 
        # other tests.
160
 
        self.failUnless(isinstance(control._format, bzrdir.BzrDirMetaFormat1))
161
 
        branch = control.open_branch()
162
 
        self.assertEquals(branch.revision_history(),
163
 
           ['mbp@sourcefrog.net-20051004035611-176b16534b086b3c',
164
 
            'mbp@sourcefrog.net-20051004035756-235f2b7dcdddd8dd'])
165
 
 
166
 
    def test_convert_branch5_branch6(self):
167
 
        branch = self.make_branch('branch', format='knit')
168
 
        branch.set_revision_history(['AB', 'CD'])
169
 
        branch.set_parent('file:///EF')
170
 
        branch.set_bound_location('file:///GH')
171
 
        branch.set_push_location('file:///IJ')
172
 
        target = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
173
 
        converter = branch.bzrdir._format.get_converter(target)
174
 
        converter.convert(branch.bzrdir, progress.DummyProgress())
175
 
        new_branch = _mod_branch.Branch.open(self.get_url('branch'))
176
 
        self.assertIs(new_branch.__class__, _mod_branch.BzrBranch6)
177
 
        self.assertEqual('CD', new_branch.last_revision())
178
 
        self.assertEqual('file:///EF', new_branch.get_parent())
179
 
        self.assertEqual('file:///GH', new_branch.get_bound_location())
180
 
        branch_config = new_branch.get_config()._get_branch_data_config()
181
 
        self.assertEqual('file:///IJ',
182
 
            branch_config.get_user_option('push_location'))
183
 
 
184
 
        branch2 = self.make_branch('branch2', format='knit')
185
 
        converter = branch2.bzrdir._format.get_converter(target)
186
 
        converter.convert(branch2.bzrdir, progress.DummyProgress())
187
 
        branch2 = _mod_branch.Branch.open(self.get_url('branch'))
188
 
        self.assertIs(branch2.__class__, _mod_branch.BzrBranch6)
189
 
 
190
 
    def test_convert_knit_dirstate_empty(self):
191
 
        # test that asking for an upgrade from knit to dirstate works.
192
 
        tree = self.make_branch_and_tree('tree', format='knit')
193
 
        target = bzrdir.format_registry.make_bzrdir('dirstate')
194
 
        converter = tree.bzrdir._format.get_converter(target)
195
 
        converter.convert(tree.bzrdir, progress.DummyProgress())
196
 
        new_tree = workingtree.WorkingTree.open('tree')
197
 
        self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
198
 
        self.assertEqual(None, new_tree.last_revision())
199
 
 
200
 
    def test_convert_knit_dirstate_content(self):
201
 
        # smoke test for dirstate conversion: we call dirstate primitives,
202
 
        # and its there that the core logic is tested.
203
 
        tree = self.make_branch_and_tree('tree', format='knit')
204
 
        self.build_tree(['tree/file'])
205
 
        tree.add(['file'], ['file-id'])
206
 
        target = bzrdir.format_registry.make_bzrdir('dirstate')
207
 
        converter = tree.bzrdir._format.get_converter(target)
208
 
        converter.convert(tree.bzrdir, progress.DummyProgress())
209
 
        new_tree = workingtree.WorkingTree.open('tree')
210
 
        self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
211
 
        self.assertEqual(None, new_tree.last_revision())
212
 
 
213
 
    def test_convert_knit_one_parent_dirstate(self):
214
 
        # test that asking for an upgrade from knit to dirstate works.
215
 
        tree = self.make_branch_and_tree('tree', format='knit')
216
 
        rev_id = tree.commit('first post')
217
 
        target = bzrdir.format_registry.make_bzrdir('dirstate')
218
 
        converter = tree.bzrdir._format.get_converter(target)
219
 
        converter.convert(tree.bzrdir, progress.DummyProgress())
220
 
        new_tree = workingtree.WorkingTree.open('tree')
221
 
        self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
222
 
        self.assertEqual(rev_id, new_tree.last_revision())
223
 
        for path in ['basis-inventory-cache', 'inventory', 'last-revision',
224
 
            'pending-merges', 'stat-cache']:
225
 
            self.failIfExists('tree/.bzr/checkout/' + path)
226
 
 
227
 
    def test_convert_knit_merges_dirstate(self):
228
 
        tree = self.make_branch_and_tree('tree', format='knit')
229
 
        rev_id = tree.commit('first post')
230
 
        merge_tree = tree.bzrdir.sprout('tree2').open_workingtree()
231
 
        rev_id2 = tree.commit('second post')
232
 
        rev_id3 = merge_tree.commit('second merge post')
233
 
        tree.merge_from_branch(merge_tree.branch)
234
 
        target = bzrdir.format_registry.make_bzrdir('dirstate')
235
 
        converter = tree.bzrdir._format.get_converter(target)
236
 
        converter.convert(tree.bzrdir, progress.DummyProgress())
237
 
        new_tree = workingtree.WorkingTree.open('tree')
238
 
        self.assertIs(new_tree.__class__, workingtree_4.WorkingTree4)
239
 
        self.assertEqual(rev_id2, new_tree.last_revision())
240
 
        self.assertEqual([rev_id2, rev_id3], new_tree.get_parent_ids())
241
 
        for path in ['basis-inventory-cache', 'inventory', 'last-revision',
242
 
            'pending-merges', 'stat-cache']:
243
 
            self.failIfExists('tree/.bzr/checkout/' + path)
 
126
        self.assertEqual(tree.last_revision(),
 
127
                         tree.branch.revision_history()[-1])
244
128
 
245
129
 
246
130
_upgrade1_template = \