/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2005-2012, 2016 Canonical Ltd
1399.1.12 by Robert Collins
add new test script
2
# Authors:  Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1399.1.12 by Robert Collins
add new test script
17
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
18
from .. import (
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
19
    conflicts,
20
    errors,
6754.8.9 by Jelmer Vernooij
Fix more tests.
21
    lock,
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
22
    transport,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
23
    workingtree,
6670.4.1 by Jelmer Vernooij
Update imports.
24
    )
25
from ..bzr import (
26
    bzrdir,
27
    workingtree as bzrworkingtree,
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
28
    workingtree_3,
5816.5.7 by Jelmer Vernooij
Fix more imports.
29
    workingtree_4,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
30
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
31
from ..lock import write_locked
32
from ..lockdir import LockDir
33
from . import TestCase, TestCaseWithTransport, TestSkipped
6846.6.1 by Jelmer Vernooij
Move Tree{Link,File,Directory,Entry} to breezy.tree.
34
from ..tree import (
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
35
    TreeEntry,
36
    TreeDirectory,
37
    TreeFile,
38
    TreeLink,
39
    )
1399.1.12 by Robert Collins
add new test script
40
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
41
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
42
class TestTreeDirectory(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
43
44
    def test_kind_character(self):
45
        self.assertEqual(TreeDirectory().kind_character(), '/')
46
47
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
48
class TestTreeEntry(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
49
50
    def test_kind_character(self):
51
        self.assertEqual(TreeEntry().kind_character(), '???')
52
53
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
54
class TestTreeFile(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
55
56
    def test_kind_character(self):
57
        self.assertEqual(TreeFile().kind_character(), '')
58
59
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
60
class TestTreeLink(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
61
62
    def test_kind_character(self):
63
        self.assertEqual(TreeLink().kind_character(), '')
64
65
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
66
class TestDefaultFormat(TestCaseWithTransport):
67
68
    def test_get_set_default_format(self):
5662.3.3 by Jelmer Vernooij
add tests
69
        old_format = workingtree.format_registry.get_default()
5816.5.2 by Jelmer Vernooij
Fix comment - default wt format is 6.
70
        # default is 6
5816.5.7 by Jelmer Vernooij
Fix more imports.
71
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
5662.3.3 by Jelmer Vernooij
add tests
72
        workingtree.format_registry.set_default(SampleTreeFormat())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
73
        try:
74
            # the default branch format is used by the meta dir format
75
            # which is not the default bzrdir format at this point
76
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
77
            dir.create_repository()
78
            dir.create_branch()
79
            result = dir.create_workingtree()
80
            self.assertEqual(result, 'A tree')
81
        finally:
5662.3.3 by Jelmer Vernooij
add tests
82
            workingtree.format_registry.set_default(old_format)
83
        self.assertEqual(old_format, workingtree.format_registry.get_default())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
84
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
85
    def test_from_string(self):
86
        self.assertIsInstance(
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
87
            SampleTreeFormat.from_string(b"Sample tree format."),
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
88
            SampleTreeFormat)
6213.1.54 by Jelmer Vernooij
Fix tests.
89
        self.assertRaises(AssertionError,
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
90
            SampleTreeFormat.from_string, b"Different format string.")
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
91
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
92
    def test_get_set_default_format_by_key(self):
93
        old_format = workingtree.format_registry.get_default()
5816.5.7 by Jelmer Vernooij
Fix more imports.
94
        # default is 6
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
95
        format = SampleTreeFormat()
96
        workingtree.format_registry.register(format)
97
        self.addCleanup(workingtree.format_registry.remove, format)
5816.5.7 by Jelmer Vernooij
Fix more imports.
98
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
99
        workingtree.format_registry.set_default_key(format.get_format_string())
100
        try:
101
            # the default branch format is used by the meta dir format
102
            # which is not the default bzrdir format at this point
103
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
104
            dir.create_repository()
105
            dir.create_branch()
106
            result = dir.create_workingtree()
107
            self.assertEqual(result, 'A tree')
108
        finally:
109
            workingtree.format_registry.set_default_key(
110
                old_format.get_format_string())
111
        self.assertEqual(old_format, workingtree.format_registry.get_default())
112
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
113
    def test_open(self):
114
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
115
        open_direct = workingtree.WorkingTree.open('.')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
116
        self.assertEqual(tree.basedir, open_direct.basedir)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
117
        open_no_args = workingtree.WorkingTree.open()
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
118
        self.assertEqual(tree.basedir, open_no_args.basedir)
119
120
    def test_open_containing(self):
121
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
122
        open_direct, relpath = workingtree.WorkingTree.open_containing('.')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
123
        self.assertEqual(tree.basedir, open_direct.basedir)
124
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
125
        open_no_args, relpath = workingtree.WorkingTree.open_containing()
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
126
        self.assertEqual(tree.basedir, open_no_args.basedir)
127
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
128
        open_subdir, relpath = workingtree.WorkingTree.open_containing('subdir')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
129
        self.assertEqual(tree.basedir, open_subdir.basedir)
130
        self.assertEqual('subdir', relpath)
131
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
132
6653.3.1 by Jelmer Vernooij
Move bzr-specific code to breezy.bzrworkingtree.
133
class SampleTreeFormat(bzrworkingtree.WorkingTreeFormatMetaDir):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
134
    """A sample format
135
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
136
    this format is initializable, unsupported to aid in testing the
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
137
    open and open_downlevel routines.
138
    """
139
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
140
    @classmethod
141
    def get_format_string(cls):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
142
        """See WorkingTreeFormat.get_format_string()."""
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
143
        return b"Sample tree format."
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
144
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
145
    def initialize(self, a_controldir, revision_id=None, from_branch=None,
3136.1.5 by Aaron Bentley
Fix sample workingtree format
146
                   accelerator_tree=None, hardlink=False):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
147
        """Sample branches cannot be created."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
148
        t = a_controldir.get_workingtree_transport(self)
1955.3.13 by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings.
149
        t.put_bytes('format', self.get_format_string())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
150
        return 'A tree'
151
152
    def is_supported(self):
153
        return False
154
155
    def open(self, transport, _found=False):
156
        return "opened tree."
157
158
5642.2.4 by Jelmer Vernooij
add tests.
159
class SampleExtraTreeFormat(workingtree.WorkingTreeFormat):
160
    """A sample format that does not support use in a metadir.
161
162
    """
163
164
    def get_format_string(self):
165
        # Not usable in a metadir, so no format string
166
        return None
167
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
168
    def initialize(self, a_controldir, revision_id=None, from_branch=None,
5642.2.4 by Jelmer Vernooij
add tests.
169
                   accelerator_tree=None, hardlink=False):
170
        raise NotImplementedError(self.initialize)
171
172
    def is_supported(self):
173
        return False
174
175
    def open(self, transport, _found=False):
176
        raise NotImplementedError(self.open)
177
178
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
179
class TestWorkingTreeFormat(TestCaseWithTransport):
180
    """Tests for the WorkingTreeFormat facility."""
181
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
182
    def test_find_format_string(self):
183
        # is the right format object found for a working tree?
184
        branch = self.make_branch('branch')
185
        self.assertRaises(errors.NoWorkingTree,
6653.6.4 by Jelmer Vernooij
Merge trunk.
186
            bzrworkingtree.WorkingTreeFormatMetaDir.find_format_string, branch.controldir)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
187
        transport = branch.controldir.get_workingtree_transport(None)
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
188
        transport.mkdir('.')
7045.4.23 by Jelmer Vernooij
Fix some help tests.
189
        transport.put_bytes("format", b"some format name")
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
190
        # The format does not have to be known by Bazaar,
191
        # find_format_string just retrieves the name
7045.4.23 by Jelmer Vernooij
Fix some help tests.
192
        self.assertEqual(b"some format name",
6653.6.4 by Jelmer Vernooij
Merge trunk.
193
            bzrworkingtree.WorkingTreeFormatMetaDir.find_format_string(branch.controldir))
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
194
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
195
    def test_find_format(self):
196
        # is the right format object found for a working tree?
197
        # create a branch with a few known format objects.
198
        self.build_tree(["foo/", "bar/"])
199
        def check_format(format, url):
6746.2.1 by Jelmer Vernooij
Rename matchingbzrdir to matchingcontroldir.
200
            dir = format._matchingcontroldir.initialize(url)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
201
            dir.create_repository()
202
            dir.create_branch()
203
            format.initialize(dir)
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
204
            t = transport.get_transport(url)
6653.5.1 by Jelmer Vernooij
Fix some more tests.
205
            found_format = bzrworkingtree.WorkingTreeFormatMetaDir.find_format(dir)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
206
            self.assertIsInstance(found_format, format.__class__)
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
207
        check_format(workingtree_3.WorkingTreeFormat3(), "bar")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
208
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
209
    def test_find_format_no_tree(self):
210
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
211
        self.assertRaises(errors.NoWorkingTree,
6653.5.1 by Jelmer Vernooij
Fix some more tests.
212
                          bzrworkingtree.WorkingTreeFormatMetaDir.find_format,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
213
                          dir)
214
215
    def test_find_format_unknown_format(self):
216
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
217
        dir.create_repository()
218
        dir.create_branch()
219
        SampleTreeFormat().initialize(dir)
220
        self.assertRaises(errors.UnknownFormatError,
6653.5.1 by Jelmer Vernooij
Fix some more tests.
221
                          bzrworkingtree.WorkingTreeFormatMetaDir.find_format,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
222
                          dir)
223
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
224
    def test_find_format_with_features(self):
225
        tree = self.make_branch_and_tree('.', format='2a')
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
226
        tree.update_feature_flags({b"name": b"necessity"})
6653.5.1 by Jelmer Vernooij
Fix some more tests.
227
        found_format = bzrworkingtree.WorkingTreeFormatMetaDir.find_format(
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
228
            tree.controldir)
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
229
        self.assertIsInstance(found_format, workingtree.WorkingTreeFormat)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
230
        self.assertEqual(found_format.features.get(b"name"), b"necessity")
6731.1.3 by Jelmer Vernooij
Move MissingFeature error to breezy.bzr.bzrdir.
231
        self.assertRaises(bzrdir.MissingFeature, found_format.check_support_status,
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
232
            True)
6653.5.1 by Jelmer Vernooij
Fix some more tests.
233
        self.addCleanup(bzrworkingtree.WorkingTreeFormatMetaDir.unregister_feature,
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
234
            b"name")
235
        bzrworkingtree.WorkingTreeFormatMetaDir.register_feature(b"name")
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
236
        found_format.check_support_status(True)
237
5662.3.3 by Jelmer Vernooij
add tests
238
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
239
class TestWorkingTreeIterEntriesByDir_wSubtrees(TestCaseWithTransport):
240
241
    def make_simple_tree(self):
242
        tree = self.make_branch_and_tree('tree', format='development-subtree')
243
        self.build_tree(['tree/a/', 'tree/a/b/', 'tree/a/b/c'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
244
        tree.set_root_id(b'root-id')
245
        tree.add(['a', 'a/b', 'a/b/c'], [b'a-id', b'b-id', b'c-id'])
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
246
        tree.commit('initial')
247
        return tree
248
249
    def test_just_directory(self):
250
        tree = self.make_simple_tree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
251
        self.assertEqual([('directory', b'root-id'),
252
                          ('directory', b'a-id'),
253
                          ('directory', b'b-id'),
254
                          ('file', b'c-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
255
                         [(ie.kind, ie.file_id)
256
                          for path, ie in tree.iter_entries_by_dir()])
257
        subtree = self.make_branch_and_tree('tree/a/b')
6855.4.1 by Jelmer Vernooij
Yet more bees.
258
        self.assertEqual([('tree-reference', b'b-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
259
                         [(ie.kind, ie.file_id)
6885.6.1 by Jelmer Vernooij
Support specific_files argument to Tree.iter_entries_by_dir.
260
                          for path, ie in tree.iter_entries_by_dir(
261
                              specific_files=['a/b'])])
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
262
263
    def test_direct_subtree(self):
264
        tree = self.make_simple_tree()
265
        subtree = self.make_branch_and_tree('tree/a/b')
6855.4.1 by Jelmer Vernooij
Yet more bees.
266
        self.assertEqual([('directory', b'root-id'),
267
                          ('directory', b'a-id'),
268
                          ('tree-reference', b'b-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
269
                         [(ie.kind, ie.file_id)
270
                          for path, ie in tree.iter_entries_by_dir()])
271
272
    def test_indirect_subtree(self):
273
        tree = self.make_simple_tree()
274
        subtree = self.make_branch_and_tree('tree/a')
6855.4.1 by Jelmer Vernooij
Yet more bees.
275
        self.assertEqual([('directory', b'root-id'),
276
                          ('tree-reference', b'a-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
277
                         [(ie.kind, ie.file_id)
278
                          for path, ie in tree.iter_entries_by_dir()])
279
280
5662.3.3 by Jelmer Vernooij
add tests
281
class TestWorkingTreeFormatRegistry(TestCase):
282
283
    def setUp(self):
284
        super(TestWorkingTreeFormatRegistry, self).setUp()
285
        self.registry = workingtree.WorkingTreeFormatRegistry()
286
287
    def test_register_unregister_format(self):
288
        format = SampleTreeFormat()
289
        self.registry.register(format)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
290
        self.assertEqual(format, self.registry.get(b"Sample tree format."))
5662.3.3 by Jelmer Vernooij
add tests
291
        self.registry.remove(format)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
292
        self.assertRaises(KeyError, self.registry.get, b"Sample tree format.")
5662.3.3 by Jelmer Vernooij
add tests
293
294
    def test_get_all(self):
295
        format = SampleTreeFormat()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
296
        self.assertEqual([], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
297
        self.registry.register(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
298
        self.assertEqual([format], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
299
300
    def test_register_extra(self):
5642.2.4 by Jelmer Vernooij
add tests.
301
        format = SampleExtraTreeFormat()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
302
        self.assertEqual([], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
303
        self.registry.register_extra(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
304
        self.assertEqual([format], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
305
306
    def test_register_extra_lazy(self):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
307
        self.assertEqual([], self.registry._get_all())
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
308
        self.registry.register_extra_lazy("breezy.tests.test_workingtree",
5662.3.3 by Jelmer Vernooij
add tests
309
            "SampleExtraTreeFormat")
310
        formats = self.registry._get_all()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
311
        self.assertEqual(1, len(formats))
5662.3.3 by Jelmer Vernooij
add tests
312
        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
313
314
315
class TestWorkingTreeFormat3(TestCaseWithTransport):
316
    """Tests specific to WorkingTreeFormat3."""
317
318
    def test_disk_layout(self):
319
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
320
        control.create_repository()
321
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
322
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
323
        # we want:
324
        # format 'Bazaar-NG Working Tree format 3'
325
        # inventory = blank inventory
326
        # pending-merges = ''
327
        # stat-cache = ??
328
        # no inventory.basis yet
329
        t = control.get_workingtree_transport(None)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
330
        self.assertEqualDiff(b'Bazaar-NG Working Tree format 3',
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
331
                             t.get('format').read())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
332
        self.assertEqualDiff(t.get('inventory').read(),
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
333
                              b'<inventory format="5">\n'
334
                              b'</inventory>\n',
1731.1.33 by Aaron Bentley
Revert no-special-root changes
335
                             )
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
336
        self.assertEqualDiff(b'### bzr hashcache v5\n',
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
337
                             t.get('stat-cache').read())
338
        self.assertFalse(t.has('inventory.basis'))
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
339
        # no last-revision file means 'None' or 'NULLREVISION'
340
        self.assertFalse(t.has('last-revision'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
341
        # TODO RBC 20060210 do a commit, check the inventory.basis is created
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
342
        # correctly and last-revision file becomes present.
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
343
344
    def test_uses_lockdir(self):
345
        """WorkingTreeFormat3 uses its own LockDir:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
346
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
347
            - lock is a directory
348
            - when the WorkingTree is locked, LockDir can see that
349
        """
350
        t = self.get_transport()
351
        url = self.get_url()
352
        dir = bzrdir.BzrDirMetaFormat1().initialize(url)
353
        repo = dir.create_repository()
354
        branch = dir.create_branch()
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
355
        try:
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
356
            tree = workingtree_3.WorkingTreeFormat3().initialize(dir)
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
357
        except errors.NotLocalUrl:
358
            raise TestSkipped('Not a local URL')
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
359
        self.assertIsDirectory('.bzr', t)
360
        self.assertIsDirectory('.bzr/checkout', t)
361
        self.assertIsDirectory('.bzr/checkout/lock', t)
362
        our_lock = LockDir(t, '.bzr/checkout/lock')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
363
        self.assertEqual(our_lock.peek(), None)
6969.3.2 by Jelmer Vernooij
Use context managers for locking.
364
        with tree.lock_write():
365
            self.assertTrue(our_lock.peek())
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
366
        self.assertEqual(our_lock.peek(), None)
1534.10.6 by Aaron Bentley
Conflict serialization working for WorkingTree3
367
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
368
    def test_missing_pending_merges(self):
369
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
370
        control.create_repository()
371
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
372
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
373
        tree._transport.delete("pending-merges")
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
374
        self.assertEqual([], tree.get_parent_ids())
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
375
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
376
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
377
class TestRevert(TestCaseWithTransport):
378
379
    def test_revert_conflicts_recursive(self):
380
        this_tree = self.make_branch_and_tree('this-tree')
381
        self.build_tree_contents([('this-tree/foo/',),
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
382
                                  ('this-tree/foo/bar', b'bar')])
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
383
        this_tree.add(['foo', 'foo/bar'])
384
        this_tree.commit('created foo/bar')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
385
        other_tree = this_tree.controldir.sprout('other-tree').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
386
        self.build_tree_contents([('other-tree/foo/bar', b'baz')])
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
387
        other_tree.commit('changed bar')
6855.4.1 by Jelmer Vernooij
Yet more bees.
388
        self.build_tree_contents([('this-tree/foo/bar', b'qux')])
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
389
        this_tree.commit('changed qux')
390
        this_tree.merge_from_branch(other_tree.branch)
391
        self.assertEqual(1, len(this_tree.conflicts()))
392
        this_tree.revert(['foo'])
393
        self.assertEqual(0, len(this_tree.conflicts()))
394
395
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
396
class TestAutoResolve(TestCaseWithTransport):
397
398
    def test_auto_resolve(self):
399
        base = self.make_branch_and_tree('base')
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
400
        self.build_tree_contents([('base/hello', b'Hello')])
6855.4.1 by Jelmer Vernooij
Yet more bees.
401
        base.add('hello', b'hello_id')
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
402
        base.commit('Hello')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
403
        other = base.controldir.sprout('other').open_workingtree()
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
404
        self.build_tree_contents([('other/hello', b'hELLO')])
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
405
        other.commit('Case switch')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
406
        this = base.controldir.sprout('this').open_workingtree()
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
407
        self.assertPathExists('this/hello')
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
408
        self.build_tree_contents([('this/hello', b'Hello World')])
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
409
        this.commit('Add World')
410
        this.merge_from_branch(other.branch)
6855.4.1 by Jelmer Vernooij
Yet more bees.
411
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
412
                         this.conflicts())
413
        this.auto_resolve()
6855.4.1 by Jelmer Vernooij
Yet more bees.
414
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
415
                         this.conflicts())
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
416
        self.build_tree_contents([('this/hello', b'<<<<<<<')])
417
        this.auto_resolve()
6855.4.1 by Jelmer Vernooij
Yet more bees.
418
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
419
                         this.conflicts())
420
        self.build_tree_contents([('this/hello', b'=======')])
421
        this.auto_resolve()
6855.4.1 by Jelmer Vernooij
Yet more bees.
422
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
423
                         this.conflicts())
424
        self.build_tree_contents([('this/hello', b'\n>>>>>>>')])
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
425
        remaining, resolved = this.auto_resolve()
6855.4.1 by Jelmer Vernooij
Yet more bees.
426
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
427
                         this.conflicts())
428
        self.assertEqual([], resolved)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
429
        self.build_tree_contents([('this/hello', b'hELLO wORLD')])
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
430
        remaining, resolved = this.auto_resolve()
431
        self.assertEqual([], this.conflicts())
6855.4.1 by Jelmer Vernooij
Yet more bees.
432
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
433
                         resolved)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
434
        self.assertPathDoesNotExist('this/hello.BASE')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
435
436
    def test_auto_resolve_dir(self):
437
        tree = self.make_branch_and_tree('tree')
438
        self.build_tree(['tree/hello/'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
439
        tree.add('hello', b'hello-id')
440
        file_conflict = conflicts.TextConflict('file', b'hello-id')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
441
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
442
        tree.auto_resolve()
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
443
444
445
class TestFindTrees(TestCaseWithTransport):
446
447
    def test_find_trees(self):
448
        self.make_branch_and_tree('foo')
449
        self.make_branch_and_tree('foo/bar')
450
        # Sticking a tree inside a control dir is heinous, so let's skip it
451
        self.make_branch_and_tree('foo/.bzr/baz')
452
        self.make_branch('qux')
453
        trees = workingtree.WorkingTree.find_trees('.')
454
        self.assertEqual(2, len(list(trees)))
6538.1.5 by Aaron Bentley
Implement WorkingTree.store_uncommitted.
455
456
457
class TestStoredUncommitted(TestCaseWithTransport):
458
459
    def store_uncommitted(self):
460
        tree = self.make_branch_and_tree('tree')
461
        tree.commit('get root in there')
6855.4.1 by Jelmer Vernooij
Yet more bees.
462
        self.build_tree_contents([('tree/file', b'content')])
463
        tree.add('file', b'file-id')
6538.1.5 by Aaron Bentley
Implement WorkingTree.store_uncommitted.
464
        tree.store_uncommitted()
465
        return tree
466
467
    def test_store_uncommitted(self):
468
        self.store_uncommitted()
469
        self.assertPathDoesNotExist('tree/file')
470
471
    def test_store_uncommitted_no_change(self):
472
        tree = self.make_branch_and_tree('tree')
473
        tree.commit('get root in there')
474
        tree.store_uncommitted()
6538.1.24 by Aaron Bentley
Eliminate get_stored_uncommitted from API.
475
        self.assertIs(None, tree.branch.get_unshelver(tree))
6538.1.10 by Aaron Bentley
Implement WorkingTree.get_uncommitted_data
476
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
477
    def test_restore_uncommitted(self):
478
        with write_locked(self.store_uncommitted()) as tree:
479
            tree.restore_uncommitted()
480
            self.assertPathExists('tree/file')
6538.1.24 by Aaron Bentley
Eliminate get_stored_uncommitted from API.
481
            self.assertIs(None, tree.branch.get_unshelver(tree))
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
482
483
    def test_restore_uncommitted_none(self):
484
        tree = self.make_branch_and_tree('tree')
485
        tree.restore_uncommitted()