/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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,
5662.3.3 by Jelmer Vernooij
add tests
22
    symbol_versioning,
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
23
    transport,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
24
    workingtree,
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
25
    workingtree_3,
5816.5.7 by Jelmer Vernooij
Fix more imports.
26
    workingtree_4,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
27
    )
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
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
82
    def test_get_set_default_format_by_key(self):
83
        old_format = workingtree.format_registry.get_default()
5816.5.7 by Jelmer Vernooij
Fix more imports.
84
        # default is 6
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
85
        format = SampleTreeFormat()
86
        workingtree.format_registry.register(format)
87
        self.addCleanup(workingtree.format_registry.remove, format)
5816.5.7 by Jelmer Vernooij
Fix more imports.
88
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
89
        workingtree.format_registry.set_default_key(format.get_format_string())
90
        try:
91
            # the default branch format is used by the meta dir format
92
            # which is not the default bzrdir format at this point
93
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
94
            dir.create_repository()
95
            dir.create_branch()
96
            result = dir.create_workingtree()
97
            self.assertEqual(result, 'A tree')
98
        finally:
99
            workingtree.format_registry.set_default_key(
100
                old_format.get_format_string())
101
        self.assertEqual(old_format, workingtree.format_registry.get_default())
102
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
103
    def test_open(self):
104
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
105
        open_direct = workingtree.WorkingTree.open('.')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
106
        self.assertEqual(tree.basedir, open_direct.basedir)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
107
        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.
108
        self.assertEqual(tree.basedir, open_no_args.basedir)
109
110
    def test_open_containing(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, relpath = workingtree.WorkingTree.open_containing('.')
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)
114
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
115
        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.
116
        self.assertEqual(tree.basedir, open_no_args.basedir)
117
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
118
        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.
119
        self.assertEqual(tree.basedir, open_subdir.basedir)
120
        self.assertEqual('subdir', relpath)
121
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
122
123
class SampleTreeFormat(workingtree.WorkingTreeFormat):
124
    """A sample format
125
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
126
    this format is initializable, unsupported to aid in testing the
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
127
    open and open_downlevel routines.
128
    """
129
130
    def get_format_string(self):
131
        """See WorkingTreeFormat.get_format_string()."""
132
        return "Sample tree format."
133
3123.5.3 by Aaron Bentley
Get tests passing with accelerator_tree
134
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
3136.1.5 by Aaron Bentley
Fix sample workingtree format
135
                   accelerator_tree=None, hardlink=False):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
136
        """Sample branches cannot be created."""
137
        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.
138
        t.put_bytes('format', self.get_format_string())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
139
        return 'A tree'
140
141
    def is_supported(self):
142
        return False
143
144
    def open(self, transport, _found=False):
145
        return "opened tree."
146
147
5642.2.4 by Jelmer Vernooij
add tests.
148
class SampleExtraTreeFormat(workingtree.WorkingTreeFormat):
149
    """A sample format that does not support use in a metadir.
150
151
    """
152
153
    def get_format_string(self):
154
        # Not usable in a metadir, so no format string
155
        return None
156
157
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
158
                   accelerator_tree=None, hardlink=False):
159
        raise NotImplementedError(self.initialize)
160
161
    def is_supported(self):
162
        return False
163
164
    def open(self, transport, _found=False):
165
        raise NotImplementedError(self.open)
166
167
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
168
class TestWorkingTreeFormat(TestCaseWithTransport):
169
    """Tests for the WorkingTreeFormat facility."""
170
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
171
    def test_find_format_string(self):
172
        # is the right format object found for a working tree?
173
        branch = self.make_branch('branch')
174
        self.assertRaises(errors.NoWorkingTree,
175
            workingtree.WorkingTreeFormat.find_format_string, branch.bzrdir)
176
        transport = branch.bzrdir.get_workingtree_transport(None)
177
        transport.mkdir('.')
178
        transport.put_bytes("format", "some format name")
179
        # The format does not have to be known by Bazaar,
180
        # find_format_string just retrieves the name
181
        self.assertEquals("some format name",
182
            workingtree.WorkingTreeFormat.find_format_string(branch.bzrdir))
183
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
184
    def test_find_format(self):
185
        # is the right format object found for a working tree?
186
        # create a branch with a few known format objects.
187
        self.build_tree(["foo/", "bar/"])
188
        def check_format(format, url):
189
            dir = format._matchingbzrdir.initialize(url)
190
            dir.create_repository()
191
            dir.create_branch()
192
            format.initialize(dir)
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
193
            t = transport.get_transport(url)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
194
            found_format = workingtree.WorkingTreeFormat.find_format(dir)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
195
            self.assertIsInstance(found_format, format.__class__)
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
196
        check_format(workingtree_3.WorkingTreeFormat3(), "bar")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
197
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
198
    def test_find_format_no_tree(self):
199
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
200
        self.assertRaises(errors.NoWorkingTree,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
201
                          workingtree.WorkingTreeFormat.find_format,
202
                          dir)
203
204
    def test_find_format_unknown_format(self):
205
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
206
        dir.create_repository()
207
        dir.create_branch()
208
        SampleTreeFormat().initialize(dir)
209
        self.assertRaises(errors.UnknownFormatError,
210
                          workingtree.WorkingTreeFormat.find_format,
211
                          dir)
212
213
    def test_register_unregister_format(self):
214
        format = SampleTreeFormat()
215
        # make a control dir
216
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
217
        dir.create_repository()
218
        dir.create_branch()
219
        # make a branch
220
        format.initialize(dir)
221
        # register a format for it.
5662.3.3 by Jelmer Vernooij
add tests
222
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
223
            workingtree.WorkingTreeFormat.register_format, format)
224
        self.assertTrue(format in 
225
            self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
226
                workingtree.WorkingTreeFormat.get_formats))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
227
        # which branch.Open will refuse (not supported)
228
        self.assertRaises(errors.UnsupportedFormatError, workingtree.WorkingTree.open, '.')
229
        # but open_downlevel will work
230
        self.assertEqual(format.open(dir), workingtree.WorkingTree.open_downlevel('.'))
231
        # unregister the format
5662.3.3 by Jelmer Vernooij
add tests
232
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
233
            workingtree.WorkingTreeFormat.unregister_format, format)
234
        self.assertFalse(format in
235
            self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
236
                workingtree.WorkingTreeFormat.get_formats))
237
238
239
class TestWorkingTreeFormatRegistry(TestCase):
240
241
    def setUp(self):
242
        super(TestWorkingTreeFormatRegistry, self).setUp()
243
        self.registry = workingtree.WorkingTreeFormatRegistry()
244
245
    def test_register_unregister_format(self):
246
        format = SampleTreeFormat()
247
        self.registry.register(format)
248
        self.assertEquals(format, self.registry.get("Sample tree format."))
249
        self.registry.remove(format)
250
        self.assertRaises(KeyError, self.registry.get, "Sample tree format.")
251
252
    def test_get_all(self):
253
        format = SampleTreeFormat()
254
        self.assertEquals([], self.registry._get_all())
255
        self.registry.register(format)
256
        self.assertEquals([format], self.registry._get_all())
257
258
    def test_register_extra(self):
5642.2.4 by Jelmer Vernooij
add tests.
259
        format = SampleExtraTreeFormat()
5662.3.3 by Jelmer Vernooij
add tests
260
        self.assertEquals([], self.registry._get_all())
261
        self.registry.register_extra(format)
262
        self.assertEquals([format], self.registry._get_all())
263
264
    def test_register_extra_lazy(self):
265
        self.assertEquals([], self.registry._get_all())
266
        self.registry.register_extra_lazy("bzrlib.tests.test_workingtree",
267
            "SampleExtraTreeFormat")
268
        formats = self.registry._get_all()
269
        self.assertEquals(1, len(formats))
270
        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
271
272
273
class TestWorkingTreeFormat3(TestCaseWithTransport):
274
    """Tests specific to WorkingTreeFormat3."""
275
276
    def test_disk_layout(self):
277
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
278
        control.create_repository()
279
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
280
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
281
        # we want:
282
        # format 'Bazaar-NG Working Tree format 3'
283
        # inventory = blank inventory
284
        # pending-merges = ''
285
        # stat-cache = ??
286
        # no inventory.basis yet
287
        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
288
        self.assertEqualDiff('Bazaar-NG Working Tree format 3',
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
289
                             t.get('format').read())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
290
        self.assertEqualDiff(t.get('inventory').read(),
2100.3.12 by Aaron Bentley
Stop generating unique roots for WorkingTree3
291
                              '<inventory format="5">\n'
1731.1.33 by Aaron Bentley
Revert no-special-root changes
292
                              '</inventory>\n',
293
                             )
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
294
        self.assertEqualDiff('### bzr hashcache v5\n',
295
                             t.get('stat-cache').read())
296
        self.assertFalse(t.has('inventory.basis'))
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
297
        # no last-revision file means 'None' or 'NULLREVISION'
298
        self.assertFalse(t.has('last-revision'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
299
        # 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.
300
        # correctly and last-revision file becomes present.
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
301
302
    def test_uses_lockdir(self):
303
        """WorkingTreeFormat3 uses its own LockDir:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
304
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
305
            - lock is a directory
306
            - when the WorkingTree is locked, LockDir can see that
307
        """
308
        t = self.get_transport()
309
        url = self.get_url()
310
        dir = bzrdir.BzrDirMetaFormat1().initialize(url)
311
        repo = dir.create_repository()
312
        branch = dir.create_branch()
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
313
        try:
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
314
            tree = workingtree_3.WorkingTreeFormat3().initialize(dir)
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
315
        except errors.NotLocalUrl:
316
            raise TestSkipped('Not a local URL')
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
317
        self.assertIsDirectory('.bzr', t)
318
        self.assertIsDirectory('.bzr/checkout', t)
319
        self.assertIsDirectory('.bzr/checkout/lock', t)
320
        our_lock = LockDir(t, '.bzr/checkout/lock')
321
        self.assertEquals(our_lock.peek(), None)
1553.5.75 by Martin Pool
Additional WorkingTree LockDir test
322
        tree.lock_write()
323
        self.assertTrue(our_lock.peek())
324
        tree.unlock()
325
        self.assertEquals(our_lock.peek(), None)
1534.10.6 by Aaron Bentley
Conflict serialization working for WorkingTree3
326
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
327
    def test_missing_pending_merges(self):
328
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
329
        control.create_repository()
330
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
331
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
332
        tree._transport.delete("pending-merges")
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
333
        self.assertEqual([], tree.get_parent_ids())
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
334
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
335
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
336
class InstrumentedTree(object):
337
    """A instrumented tree to check the needs_tree_write_lock decorator."""
338
339
    def __init__(self):
340
        self._locks = []
341
342
    def lock_tree_write(self):
343
        self._locks.append('t')
344
345
    @needs_tree_write_lock
346
    def method_with_tree_write_lock(self, *args, **kwargs):
347
        """A lock_tree_write decorated method that returns its arguments."""
348
        return args, kwargs
349
350
    @needs_tree_write_lock
351
    def method_that_raises(self):
352
        """This method causes an exception when called with parameters.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
353
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
354
        This allows the decorator code to be checked - it should still call
355
        unlock.
356
        """
357
358
    def unlock(self):
359
        self._locks.append('u')
360
361
362
class TestInstrumentedTree(TestCase):
363
364
    def test_needs_tree_write_lock(self):
365
        """@needs_tree_write_lock should be semantically transparent."""
366
        tree = InstrumentedTree()
367
        self.assertEqual(
368
            'method_with_tree_write_lock',
369
            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
370
        self.assertDocstring(
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
371
            "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
372
            tree.method_with_tree_write_lock)
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
373
        args = (1, 2, 3)
374
        kwargs = {'a':'b'}
375
        result = tree.method_with_tree_write_lock(1,2,3, a='b')
376
        self.assertEqual((args, kwargs), result)
377
        self.assertEqual(['t', 'u'], tree._locks)
378
        self.assertRaises(TypeError, tree.method_that_raises, 'foo')
379
        self.assertEqual(['t', 'u', 't', 'u'], tree._locks)
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
380
381
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
382
class TestRevert(TestCaseWithTransport):
383
384
    def test_revert_conflicts_recursive(self):
385
        this_tree = self.make_branch_and_tree('this-tree')
386
        self.build_tree_contents([('this-tree/foo/',),
387
                                  ('this-tree/foo/bar', 'bar')])
388
        this_tree.add(['foo', 'foo/bar'])
389
        this_tree.commit('created foo/bar')
390
        other_tree = this_tree.bzrdir.sprout('other-tree').open_workingtree()
391
        self.build_tree_contents([('other-tree/foo/bar', 'baz')])
392
        other_tree.commit('changed bar')
393
        self.build_tree_contents([('this-tree/foo/bar', 'qux')])
394
        this_tree.commit('changed qux')
395
        this_tree.merge_from_branch(other_tree.branch)
396
        self.assertEqual(1, len(this_tree.conflicts()))
397
        this_tree.revert(['foo'])
398
        self.assertEqual(0, len(this_tree.conflicts()))
399
400
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
401
class TestAutoResolve(TestCaseWithTransport):
402
403
    def test_auto_resolve(self):
404
        base = self.make_branch_and_tree('base')
405
        self.build_tree_contents([('base/hello', 'Hello')])
406
        base.add('hello', 'hello_id')
407
        base.commit('Hello')
408
        other = base.bzrdir.sprout('other').open_workingtree()
409
        self.build_tree_contents([('other/hello', 'hELLO')])
410
        other.commit('Case switch')
411
        this = base.bzrdir.sprout('this').open_workingtree()
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
412
        self.assertPathExists('this/hello')
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
413
        self.build_tree_contents([('this/hello', 'Hello World')])
414
        this.commit('Add World')
415
        this.merge_from_branch(other.branch)
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
416
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
417
                         this.conflicts())
418
        this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
419
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
420
                         this.conflicts())
421
        self.build_tree_contents([('this/hello', '<<<<<<<')])
422
        this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
423
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
424
                         this.conflicts())
425
        self.build_tree_contents([('this/hello', '=======')])
426
        this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
427
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
428
                         this.conflicts())
429
        self.build_tree_contents([('this/hello', '\n>>>>>>>')])
430
        remaining, resolved = this.auto_resolve()
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
431
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
432
                         this.conflicts())
433
        self.assertEqual([], resolved)
434
        self.build_tree_contents([('this/hello', 'hELLO wORLD')])
435
        remaining, resolved = this.auto_resolve()
436
        self.assertEqual([], this.conflicts())
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
437
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
438
                         resolved)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
439
        self.assertPathDoesNotExist('this/hello.BASE')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
440
441
    def test_auto_resolve_dir(self):
442
        tree = self.make_branch_and_tree('tree')
443
        self.build_tree(['tree/hello/'])
444
        tree.add('hello', 'hello-id')
5050.51.3 by Vincent Ladeuil
Fix test failing on pqm.
445
        file_conflict = conflicts.TextConflict('file', 'hello-id')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
446
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
447
        tree.auto_resolve()
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
448
449
450
class TestFindTrees(TestCaseWithTransport):
451
452
    def test_find_trees(self):
453
        self.make_branch_and_tree('foo')
454
        self.make_branch_and_tree('foo/bar')
455
        # Sticking a tree inside a control dir is heinous, so let's skip it
456
        self.make_branch_and_tree('foo/.bzr/baz')
457
        self.make_branch('qux')
458
        trees = workingtree.WorkingTree.find_trees('.')
459
        self.assertEqual(2, len(list(trees)))