~bzr-pqm/bzr/bzr.dev

5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2005-2011 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
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
18
from bzrlib import (
19
    bzrdir,
20
    conflicts,
21
    errors,
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,
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
24
    workingtree_3,
5816.5.7 by Jelmer Vernooij
Fix more imports.
25
    workingtree_4,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
26
    )
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
27
from bzrlib.lock import write_locked
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
28
from bzrlib.lockdir import LockDir
1986.1.8 by Robert Collins
Update to bzr.dev, which involves adding lock_tree_write to MutableTree and MemoryTree.
29
from bzrlib.mutabletree import needs_tree_write_lock
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
30
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
31
from bzrlib.workingtree import (
32
    TreeEntry,
33
    TreeDirectory,
34
    TreeFile,
35
    TreeLink,
36
    )
1399.1.12 by Robert Collins
add new test script
37
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
38
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
39
class TestTreeDirectory(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
40
41
    def test_kind_character(self):
42
        self.assertEqual(TreeDirectory().kind_character(), '/')
43
44
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
45
class TestTreeEntry(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
46
47
    def test_kind_character(self):
48
        self.assertEqual(TreeEntry().kind_character(), '???')
49
50
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
51
class TestTreeFile(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
52
53
    def test_kind_character(self):
54
        self.assertEqual(TreeFile().kind_character(), '')
55
56
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
57
class TestTreeLink(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
58
59
    def test_kind_character(self):
60
        self.assertEqual(TreeLink().kind_character(), '')
61
62
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
63
class TestDefaultFormat(TestCaseWithTransport):
64
65
    def test_get_set_default_format(self):
5662.3.3 by Jelmer Vernooij
add tests
66
        old_format = workingtree.format_registry.get_default()
5816.5.2 by Jelmer Vernooij
Fix comment - default wt format is 6.
67
        # default is 6
5816.5.7 by Jelmer Vernooij
Fix more imports.
68
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
5662.3.3 by Jelmer Vernooij
add tests
69
        workingtree.format_registry.set_default(SampleTreeFormat())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
70
        try:
71
            # the default branch format is used by the meta dir format
72
            # which is not the default bzrdir format at this point
73
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
74
            dir.create_repository()
75
            dir.create_branch()
76
            result = dir.create_workingtree()
77
            self.assertEqual(result, 'A tree')
78
        finally:
5662.3.3 by Jelmer Vernooij
add tests
79
            workingtree.format_registry.set_default(old_format)
80
        self.assertEqual(old_format, workingtree.format_registry.get_default())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
81
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
82
    def test_from_string(self):
83
        self.assertIsInstance(
84
            SampleTreeFormat.from_string("Sample tree format."),
85
            SampleTreeFormat)
6213.1.54 by Jelmer Vernooij
Fix tests.
86
        self.assertRaises(AssertionError,
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
87
            SampleTreeFormat.from_string, "Different format string.")
88
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
89
    def test_get_set_default_format_by_key(self):
90
        old_format = workingtree.format_registry.get_default()
5816.5.7 by Jelmer Vernooij
Fix more imports.
91
        # default is 6
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
92
        format = SampleTreeFormat()
93
        workingtree.format_registry.register(format)
94
        self.addCleanup(workingtree.format_registry.remove, format)
5816.5.7 by Jelmer Vernooij
Fix more imports.
95
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
96
        workingtree.format_registry.set_default_key(format.get_format_string())
97
        try:
98
            # the default branch format is used by the meta dir format
99
            # which is not the default bzrdir format at this point
100
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
101
            dir.create_repository()
102
            dir.create_branch()
103
            result = dir.create_workingtree()
104
            self.assertEqual(result, 'A tree')
105
        finally:
106
            workingtree.format_registry.set_default_key(
107
                old_format.get_format_string())
108
        self.assertEqual(old_format, workingtree.format_registry.get_default())
109
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
110
    def test_open(self):
111
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
112
        open_direct = workingtree.WorkingTree.open('.')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
113
        self.assertEqual(tree.basedir, open_direct.basedir)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
114
        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.
115
        self.assertEqual(tree.basedir, open_no_args.basedir)
116
117
    def test_open_containing(self):
118
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
119
        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.
120
        self.assertEqual(tree.basedir, open_direct.basedir)
121
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
122
        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.
123
        self.assertEqual(tree.basedir, open_no_args.basedir)
124
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
125
        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.
126
        self.assertEqual(tree.basedir, open_subdir.basedir)
127
        self.assertEqual('subdir', relpath)
128
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
129
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
130
class SampleTreeFormat(workingtree.WorkingTreeFormatMetaDir):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
131
    """A sample format
132
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
133
    this format is initializable, unsupported to aid in testing the
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
134
    open and open_downlevel routines.
135
    """
136
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
137
    @classmethod
138
    def get_format_string(cls):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
139
        """See WorkingTreeFormat.get_format_string()."""
140
        return "Sample tree format."
141
3123.5.3 by Aaron Bentley
Get tests passing with accelerator_tree
142
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
3136.1.5 by Aaron Bentley
Fix sample workingtree format
143
                   accelerator_tree=None, hardlink=False):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
144
        """Sample branches cannot be created."""
145
        t = a_bzrdir.get_workingtree_transport(self)
1955.3.13 by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings.
146
        t.put_bytes('format', self.get_format_string())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
147
        return 'A tree'
148
149
    def is_supported(self):
150
        return False
151
152
    def open(self, transport, _found=False):
153
        return "opened tree."
154
155
5642.2.4 by Jelmer Vernooij
add tests.
156
class SampleExtraTreeFormat(workingtree.WorkingTreeFormat):
157
    """A sample format that does not support use in a metadir.
158
159
    """
160
161
    def get_format_string(self):
162
        # Not usable in a metadir, so no format string
163
        return None
164
165
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
166
                   accelerator_tree=None, hardlink=False):
167
        raise NotImplementedError(self.initialize)
168
169
    def is_supported(self):
170
        return False
171
172
    def open(self, transport, _found=False):
173
        raise NotImplementedError(self.open)
174
175
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
176
class TestWorkingTreeFormat(TestCaseWithTransport):
177
    """Tests for the WorkingTreeFormat facility."""
178
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
179
    def test_find_format_string(self):
180
        # is the right format object found for a working tree?
181
        branch = self.make_branch('branch')
182
        self.assertRaises(errors.NoWorkingTree,
6349.2.2 by Jelmer Vernooij
Fix remaining tests.
183
            workingtree.WorkingTreeFormatMetaDir.find_format_string, branch.bzrdir)
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
184
        transport = branch.bzrdir.get_workingtree_transport(None)
185
        transport.mkdir('.')
186
        transport.put_bytes("format", "some format name")
187
        # The format does not have to be known by Bazaar,
188
        # find_format_string just retrieves the name
189
        self.assertEquals("some format name",
6349.2.2 by Jelmer Vernooij
Fix remaining tests.
190
            workingtree.WorkingTreeFormatMetaDir.find_format_string(branch.bzrdir))
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
191
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
192
    def test_find_format(self):
193
        # is the right format object found for a working tree?
194
        # create a branch with a few known format objects.
195
        self.build_tree(["foo/", "bar/"])
196
        def check_format(format, url):
197
            dir = format._matchingbzrdir.initialize(url)
198
            dir.create_repository()
199
            dir.create_branch()
200
            format.initialize(dir)
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
201
            t = transport.get_transport(url)
6349.2.2 by Jelmer Vernooij
Fix remaining tests.
202
            found_format = workingtree.WorkingTreeFormatMetaDir.find_format(dir)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
203
            self.assertIsInstance(found_format, format.__class__)
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
204
        check_format(workingtree_3.WorkingTreeFormat3(), "bar")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
205
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
206
    def test_find_format_no_tree(self):
207
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
208
        self.assertRaises(errors.NoWorkingTree,
6349.2.2 by Jelmer Vernooij
Fix remaining tests.
209
                          workingtree.WorkingTreeFormatMetaDir.find_format,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
210
                          dir)
211
212
    def test_find_format_unknown_format(self):
213
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
214
        dir.create_repository()
215
        dir.create_branch()
216
        SampleTreeFormat().initialize(dir)
217
        self.assertRaises(errors.UnknownFormatError,
6349.2.2 by Jelmer Vernooij
Fix remaining tests.
218
                          workingtree.WorkingTreeFormatMetaDir.find_format,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
219
                          dir)
220
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
221
    def test_find_format_with_features(self):
222
        tree = self.make_branch_and_tree('.', format='2a')
6213.1.58 by Jelmer Vernooij
Use update_feature_flags everywhere.
223
        tree.update_feature_flags({"name": "necessity"})
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
224
        found_format = workingtree.WorkingTreeFormatMetaDir.find_format(
225
            tree.bzrdir)
226
        self.assertIsInstance(found_format, workingtree.WorkingTreeFormat)
227
        self.assertEquals(found_format.features.get("name"), "necessity")
228
        self.assertRaises(errors.MissingFeature, found_format.check_support_status,
229
            True)
230
        self.addCleanup(workingtree.WorkingTreeFormatMetaDir.unregister_feature,
231
            "name")
232
        workingtree.WorkingTreeFormatMetaDir.register_feature("name")
233
        found_format.check_support_status(True)
234
5662.3.3 by Jelmer Vernooij
add tests
235
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
236
class TestWorkingTreeIterEntriesByDir_wSubtrees(TestCaseWithTransport):
237
238
    def make_simple_tree(self):
239
        tree = self.make_branch_and_tree('tree', format='development-subtree')
240
        self.build_tree(['tree/a/', 'tree/a/b/', 'tree/a/b/c'])
241
        tree.set_root_id('root-id')
242
        tree.add(['a', 'a/b', 'a/b/c'], ['a-id', 'b-id', 'c-id'])
243
        tree.commit('initial')
244
        return tree
245
246
    def test_just_directory(self):
247
        tree = self.make_simple_tree()
248
        self.assertEqual([('directory', 'root-id'),
249
                          ('directory', 'a-id'),
250
                          ('directory', 'b-id'),
251
                          ('file', 'c-id')],
252
                         [(ie.kind, ie.file_id)
253
                          for path, ie in tree.iter_entries_by_dir()])
254
        subtree = self.make_branch_and_tree('tree/a/b')
255
        self.assertEqual([('tree-reference', 'b-id')],
256
                         [(ie.kind, ie.file_id)
257
                          for path, ie in tree.iter_entries_by_dir(['b-id'])])
258
259
    def test_direct_subtree(self):
260
        tree = self.make_simple_tree()
261
        subtree = self.make_branch_and_tree('tree/a/b')
262
        self.assertEqual([('directory', 'root-id'),
263
                          ('directory', 'a-id'),
264
                          ('tree-reference', 'b-id')],
265
                         [(ie.kind, ie.file_id)
266
                          for path, ie in tree.iter_entries_by_dir()])
267
268
    def test_indirect_subtree(self):
269
        tree = self.make_simple_tree()
270
        subtree = self.make_branch_and_tree('tree/a')
271
        self.assertEqual([('directory', 'root-id'),
272
                          ('tree-reference', 'a-id')],
273
                         [(ie.kind, ie.file_id)
274
                          for path, ie in tree.iter_entries_by_dir()])
275
276
5662.3.3 by Jelmer Vernooij
add tests
277
class TestWorkingTreeFormatRegistry(TestCase):
278
279
    def setUp(self):
280
        super(TestWorkingTreeFormatRegistry, self).setUp()
281
        self.registry = workingtree.WorkingTreeFormatRegistry()
282
283
    def test_register_unregister_format(self):
284
        format = SampleTreeFormat()
285
        self.registry.register(format)
286
        self.assertEquals(format, self.registry.get("Sample tree format."))
287
        self.registry.remove(format)
288
        self.assertRaises(KeyError, self.registry.get, "Sample tree format.")
289
290
    def test_get_all(self):
291
        format = SampleTreeFormat()
292
        self.assertEquals([], self.registry._get_all())
293
        self.registry.register(format)
294
        self.assertEquals([format], self.registry._get_all())
295
296
    def test_register_extra(self):
5642.2.4 by Jelmer Vernooij
add tests.
297
        format = SampleExtraTreeFormat()
5662.3.3 by Jelmer Vernooij
add tests
298
        self.assertEquals([], self.registry._get_all())
299
        self.registry.register_extra(format)
300
        self.assertEquals([format], self.registry._get_all())
301
302
    def test_register_extra_lazy(self):
303
        self.assertEquals([], self.registry._get_all())
304
        self.registry.register_extra_lazy("bzrlib.tests.test_workingtree",
305
            "SampleExtraTreeFormat")
306
        formats = self.registry._get_all()
307
        self.assertEquals(1, len(formats))
308
        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
309
310
311
class TestWorkingTreeFormat3(TestCaseWithTransport):
312
    """Tests specific to WorkingTreeFormat3."""
313
314
    def test_disk_layout(self):
315
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
316
        control.create_repository()
317
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
318
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
319
        # we want:
320
        # format 'Bazaar-NG Working Tree format 3'
321
        # inventory = blank inventory
322
        # pending-merges = ''
323
        # stat-cache = ??
324
        # no inventory.basis yet
325
        t = control.get_workingtree_transport(None)
1553.5.81 by Martin Pool
Revert change to WorkingTreeFormat3 format string; too many things want it the old way
326
        self.assertEqualDiff('Bazaar-NG Working Tree format 3',
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
327
                             t.get('format').read())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
328
        self.assertEqualDiff(t.get('inventory').read(),
2100.3.12 by Aaron Bentley
Stop generating unique roots for WorkingTree3
329
                              '<inventory format="5">\n'
1731.1.33 by Aaron Bentley
Revert no-special-root changes
330
                              '</inventory>\n',
331
                             )
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
332
        self.assertEqualDiff('### bzr hashcache v5\n',
333
                             t.get('stat-cache').read())
334
        self.assertFalse(t.has('inventory.basis'))
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
335
        # no last-revision file means 'None' or 'NULLREVISION'
336
        self.assertFalse(t.has('last-revision'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
337
        # 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.
338
        # correctly and last-revision file becomes present.
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
339
340
    def test_uses_lockdir(self):
341
        """WorkingTreeFormat3 uses its own LockDir:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
342
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
343
            - lock is a directory
344
            - when the WorkingTree is locked, LockDir can see that
345
        """
346
        t = self.get_transport()
347
        url = self.get_url()
348
        dir = bzrdir.BzrDirMetaFormat1().initialize(url)
349
        repo = dir.create_repository()
350
        branch = dir.create_branch()
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
351
        try:
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
352
            tree = workingtree_3.WorkingTreeFormat3().initialize(dir)
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
353
        except errors.NotLocalUrl:
354
            raise TestSkipped('Not a local URL')
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
355
        self.assertIsDirectory('.bzr', t)
356
        self.assertIsDirectory('.bzr/checkout', t)
357
        self.assertIsDirectory('.bzr/checkout/lock', t)
358
        our_lock = LockDir(t, '.bzr/checkout/lock')
359
        self.assertEquals(our_lock.peek(), None)
1553.5.75 by Martin Pool
Additional WorkingTree LockDir test
360
        tree.lock_write()
361
        self.assertTrue(our_lock.peek())
362
        tree.unlock()
363
        self.assertEquals(our_lock.peek(), None)
1534.10.6 by Aaron Bentley
Conflict serialization working for WorkingTree3
364
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
365
    def test_missing_pending_merges(self):
366
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
367
        control.create_repository()
368
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
369
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
370
        tree._transport.delete("pending-merges")
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
371
        self.assertEqual([], tree.get_parent_ids())
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
372
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
373
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
374
class InstrumentedTree(object):
375
    """A instrumented tree to check the needs_tree_write_lock decorator."""
376
377
    def __init__(self):
378
        self._locks = []
379
380
    def lock_tree_write(self):
381
        self._locks.append('t')
382
383
    @needs_tree_write_lock
384
    def method_with_tree_write_lock(self, *args, **kwargs):
385
        """A lock_tree_write decorated method that returns its arguments."""
386
        return args, kwargs
387
388
    @needs_tree_write_lock
389
    def method_that_raises(self):
390
        """This method causes an exception when called with parameters.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
391
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
392
        This allows the decorator code to be checked - it should still call
393
        unlock.
394
        """
395
396
    def unlock(self):
397
        self._locks.append('u')
398
399
400
class TestInstrumentedTree(TestCase):
401
402
    def test_needs_tree_write_lock(self):
403
        """@needs_tree_write_lock should be semantically transparent."""
404
        tree = InstrumentedTree()
405
        self.assertEqual(
406
            'method_with_tree_write_lock',
407
            tree.method_with_tree_write_lock.__name__)
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
408
        self.assertDocstring(
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
409
            "A lock_tree_write decorated method that returns its arguments.",
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
410
            tree.method_with_tree_write_lock)
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
411
        args = (1, 2, 3)
412
        kwargs = {'a':'b'}
413
        result = tree.method_with_tree_write_lock(1,2,3, a='b')
414
        self.assertEqual((args, kwargs), result)
415
        self.assertEqual(['t', 'u'], tree._locks)
416
        self.assertRaises(TypeError, tree.method_that_raises, 'foo')
417
        self.assertEqual(['t', 'u', 't', 'u'], tree._locks)
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
418
419
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
420
class TestRevert(TestCaseWithTransport):
421
422
    def test_revert_conflicts_recursive(self):
423
        this_tree = self.make_branch_and_tree('this-tree')
424
        self.build_tree_contents([('this-tree/foo/',),
425
                                  ('this-tree/foo/bar', 'bar')])
426
        this_tree.add(['foo', 'foo/bar'])
427
        this_tree.commit('created foo/bar')
428
        other_tree = this_tree.bzrdir.sprout('other-tree').open_workingtree()
429
        self.build_tree_contents([('other-tree/foo/bar', 'baz')])
430
        other_tree.commit('changed bar')
431
        self.build_tree_contents([('this-tree/foo/bar', 'qux')])
432
        this_tree.commit('changed qux')
433
        this_tree.merge_from_branch(other_tree.branch)
434
        self.assertEqual(1, len(this_tree.conflicts()))
435
        this_tree.revert(['foo'])
436
        self.assertEqual(0, len(this_tree.conflicts()))
437
438
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
439
class TestAutoResolve(TestCaseWithTransport):
440
441
    def test_auto_resolve(self):
442
        base = self.make_branch_and_tree('base')
443
        self.build_tree_contents([('base/hello', 'Hello')])
444
        base.add('hello', 'hello_id')
445
        base.commit('Hello')
446
        other = base.bzrdir.sprout('other').open_workingtree()
447
        self.build_tree_contents([('other/hello', 'hELLO')])
448
        other.commit('Case switch')
449
        this = base.bzrdir.sprout('this').open_workingtree()
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
450
        self.assertPathExists('this/hello')
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
451
        self.build_tree_contents([('this/hello', 'Hello World')])
452
        this.commit('Add World')
453
        this.merge_from_branch(other.branch)
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
454
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
455
                         this.conflicts())
456
        this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
457
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
458
                         this.conflicts())
459
        self.build_tree_contents([('this/hello', '<<<<<<<')])
460
        this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
461
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
462
                         this.conflicts())
463
        self.build_tree_contents([('this/hello', '=======')])
464
        this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
465
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
466
                         this.conflicts())
467
        self.build_tree_contents([('this/hello', '\n>>>>>>>')])
468
        remaining, resolved = this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
469
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
470
                         this.conflicts())
471
        self.assertEqual([], resolved)
472
        self.build_tree_contents([('this/hello', 'hELLO wORLD')])
473
        remaining, resolved = this.auto_resolve()
474
        self.assertEqual([], this.conflicts())
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
475
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
476
                         resolved)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
477
        self.assertPathDoesNotExist('this/hello.BASE')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
478
479
    def test_auto_resolve_dir(self):
480
        tree = self.make_branch_and_tree('tree')
481
        self.build_tree(['tree/hello/'])
482
        tree.add('hello', 'hello-id')
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
483
        file_conflict = conflicts.TextConflict('file', 'hello-id')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
484
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
485
        tree.auto_resolve()
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
486
487
488
class TestFindTrees(TestCaseWithTransport):
489
490
    def test_find_trees(self):
491
        self.make_branch_and_tree('foo')
492
        self.make_branch_and_tree('foo/bar')
493
        # Sticking a tree inside a control dir is heinous, so let's skip it
494
        self.make_branch_and_tree('foo/.bzr/baz')
495
        self.make_branch('qux')
496
        trees = workingtree.WorkingTree.find_trees('.')
497
        self.assertEqual(2, len(list(trees)))
6538.1.5 by Aaron Bentley
Implement WorkingTree.store_uncommitted.
498
499
500
class TestStoredUncommitted(TestCaseWithTransport):
501
502
    def store_uncommitted(self):
503
        tree = self.make_branch_and_tree('tree')
504
        tree.commit('get root in there')
505
        self.build_tree_contents([('tree/file', 'content')])
506
        tree.add('file', 'file-id')
507
        tree.store_uncommitted()
508
        return tree
509
510
    def test_store_uncommitted(self):
511
        self.store_uncommitted()
512
        self.assertPathDoesNotExist('tree/file')
513
514
    def test_store_uncommitted_no_change(self):
515
        tree = self.make_branch_and_tree('tree')
516
        tree.commit('get root in there')
517
        tree.store_uncommitted()
6538.1.24 by Aaron Bentley
Eliminate get_stored_uncommitted from API.
518
        self.assertIs(None, tree.branch.get_unshelver(tree))
6538.1.10 by Aaron Bentley
Implement WorkingTree.get_uncommitted_data
519
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
520
    def test_restore_uncommitted(self):
521
        with write_locked(self.store_uncommitted()) as tree:
522
            tree.restore_uncommitted()
523
            self.assertPathExists('tree/file')
6538.1.24 by Aaron Bentley
Eliminate get_stored_uncommitted from API.
524
            self.assertIs(None, tree.branch.get_unshelver(tree))
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
525
526
    def test_restore_uncommitted_none(self):
527
        tree = self.make_branch_and_tree('tree')
528
        tree.restore_uncommitted()