/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_workingtree.py

(gz) Fix bzr mv error report on bzr mv of a removed non-ascii file (Martin
 Packman)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
# Authors:  Robert Collins <robert.collins@canonical.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
13
13
#
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
 
18
 
from cStringIO import StringIO
19
 
import os
20
 
 
21
 
import bzrlib
22
 
from bzrlib.branch import Branch
23
 
import bzrlib.bzrdir as bzrdir
24
 
from bzrlib.bzrdir import BzrDir
25
 
from bzrlib.conflicts import *
26
 
import bzrlib.errors as errors
27
 
from bzrlib.errors import NotBranchError, NotVersionedError
 
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 
 
18
from bzrlib import (
 
19
    bzrdir,
 
20
    conflicts,
 
21
    errors,
 
22
    symbol_versioning,
 
23
    transport,
 
24
    workingtree,
 
25
    workingtree_3,
 
26
    workingtree_4,
 
27
    )
28
28
from bzrlib.lockdir import LockDir
29
 
from bzrlib.osutils import pathjoin, getcwd, has_symlinks
30
 
from bzrlib.tests import TestCaseWithTransport, TestSkipped
31
 
from bzrlib.trace import mutter
32
 
from bzrlib.transport import get_transport
33
 
import bzrlib.workingtree as workingtree
34
 
from bzrlib.workingtree import (TreeEntry, TreeDirectory, TreeFile, TreeLink,
35
 
                                WorkingTree)
 
29
from bzrlib.mutabletree import needs_tree_write_lock
 
30
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
 
31
from bzrlib.workingtree import (
 
32
    TreeEntry,
 
33
    TreeDirectory,
 
34
    TreeFile,
 
35
    TreeLink,
 
36
    )
 
37
 
36
38
 
37
39
class TestTreeDirectory(TestCaseWithTransport):
38
40
 
61
63
class TestDefaultFormat(TestCaseWithTransport):
62
64
 
63
65
    def test_get_set_default_format(self):
64
 
        old_format = workingtree.WorkingTreeFormat.get_default_format()
65
 
        # default is 3
66
 
        self.assertTrue(isinstance(old_format, workingtree.WorkingTreeFormat3))
67
 
        workingtree.WorkingTreeFormat.set_default_format(SampleTreeFormat())
68
 
        try:
69
 
            # the default branch format is used by the meta dir format
70
 
            # which is not the default bzrdir format at this point
71
 
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
72
 
            dir.create_repository()
73
 
            dir.create_branch()
74
 
            result = dir.create_workingtree()
75
 
            self.assertEqual(result, 'A tree')
76
 
        finally:
77
 
            workingtree.WorkingTreeFormat.set_default_format(old_format)
78
 
        self.assertEqual(old_format, workingtree.WorkingTreeFormat.get_default_format())
79
 
 
80
 
 
81
 
class SampleTreeFormat(workingtree.WorkingTreeFormat):
 
66
        old_format = workingtree.format_registry.get_default()
 
67
        # default is 6
 
68
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
 
69
        workingtree.format_registry.set_default(SampleTreeFormat())
 
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:
 
79
            workingtree.format_registry.set_default(old_format)
 
80
        self.assertEqual(old_format, workingtree.format_registry.get_default())
 
81
 
 
82
    def test_from_string(self):
 
83
        self.assertIsInstance(
 
84
            SampleTreeFormat.from_string("Sample tree format."),
 
85
            SampleTreeFormat)
 
86
        self.assertRaises(ValueError,
 
87
            SampleTreeFormat.from_string, "Different format string.")
 
88
 
 
89
    def test_get_set_default_format_by_key(self):
 
90
        old_format = workingtree.format_registry.get_default()
 
91
        # default is 6
 
92
        format = SampleTreeFormat()
 
93
        workingtree.format_registry.register(format)
 
94
        self.addCleanup(workingtree.format_registry.remove, format)
 
95
        self.assertTrue(isinstance(old_format, workingtree_4.WorkingTreeFormat6))
 
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
 
 
110
    def test_open(self):
 
111
        tree = self.make_branch_and_tree('.')
 
112
        open_direct = workingtree.WorkingTree.open('.')
 
113
        self.assertEqual(tree.basedir, open_direct.basedir)
 
114
        open_no_args = workingtree.WorkingTree.open()
 
115
        self.assertEqual(tree.basedir, open_no_args.basedir)
 
116
 
 
117
    def test_open_containing(self):
 
118
        tree = self.make_branch_and_tree('.')
 
119
        open_direct, relpath = workingtree.WorkingTree.open_containing('.')
 
120
        self.assertEqual(tree.basedir, open_direct.basedir)
 
121
        self.assertEqual('', relpath)
 
122
        open_no_args, relpath = workingtree.WorkingTree.open_containing()
 
123
        self.assertEqual(tree.basedir, open_no_args.basedir)
 
124
        self.assertEqual('', relpath)
 
125
        open_subdir, relpath = workingtree.WorkingTree.open_containing('subdir')
 
126
        self.assertEqual(tree.basedir, open_subdir.basedir)
 
127
        self.assertEqual('subdir', relpath)
 
128
 
 
129
 
 
130
class SampleTreeFormat(workingtree.WorkingTreeFormatMetaDir):
82
131
    """A sample format
83
132
 
84
 
    this format is initializable, unsupported to aid in testing the 
 
133
    this format is initializable, unsupported to aid in testing the
85
134
    open and open_downlevel routines.
86
135
    """
87
136
 
88
 
    def get_format_string(self):
 
137
    @classmethod
 
138
    def get_format_string(cls):
89
139
        """See WorkingTreeFormat.get_format_string()."""
90
140
        return "Sample tree format."
91
141
 
92
 
    def initialize(self, a_bzrdir, revision_id=None):
 
142
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
 
143
                   accelerator_tree=None, hardlink=False):
93
144
        """Sample branches cannot be created."""
94
145
        t = a_bzrdir.get_workingtree_transport(self)
95
 
        t.put('format', StringIO(self.get_format_string()))
 
146
        t.put_bytes('format', self.get_format_string())
96
147
        return 'A tree'
97
148
 
98
149
    def is_supported(self):
102
153
        return "opened tree."
103
154
 
104
155
 
 
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
 
105
176
class TestWorkingTreeFormat(TestCaseWithTransport):
106
177
    """Tests for the WorkingTreeFormat facility."""
107
178
 
 
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,
 
183
            workingtree.WorkingTreeFormatMetaDir.find_format_string, branch.bzrdir)
 
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",
 
190
            workingtree.WorkingTreeFormatMetaDir.find_format_string(branch.bzrdir))
 
191
 
108
192
    def test_find_format(self):
109
193
        # is the right format object found for a working tree?
110
194
        # create a branch with a few known format objects.
114
198
            dir.create_repository()
115
199
            dir.create_branch()
116
200
            format.initialize(dir)
117
 
            t = get_transport(url)
118
 
            found_format = workingtree.WorkingTreeFormat.find_format(dir)
119
 
            self.failUnless(isinstance(found_format, format.__class__))
120
 
        check_format(workingtree.WorkingTreeFormat3(), "bar")
121
 
        
 
201
            t = transport.get_transport(url)
 
202
            found_format = workingtree.WorkingTreeFormatMetaDir.find_format(dir)
 
203
            self.assertIsInstance(found_format, format.__class__)
 
204
        check_format(workingtree_3.WorkingTreeFormat3(), "bar")
 
205
 
122
206
    def test_find_format_no_tree(self):
123
207
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
124
208
        self.assertRaises(errors.NoWorkingTree,
125
 
                          workingtree.WorkingTreeFormat.find_format,
 
209
                          workingtree.WorkingTreeFormatMetaDir.find_format,
126
210
                          dir)
127
211
 
128
212
    def test_find_format_unknown_format(self):
131
215
        dir.create_branch()
132
216
        SampleTreeFormat().initialize(dir)
133
217
        self.assertRaises(errors.UnknownFormatError,
134
 
                          workingtree.WorkingTreeFormat.find_format,
 
218
                          workingtree.WorkingTreeFormatMetaDir.find_format,
135
219
                          dir)
136
220
 
137
221
    def test_register_unregister_format(self):
143
227
        # make a branch
144
228
        format.initialize(dir)
145
229
        # register a format for it.
146
 
        workingtree.WorkingTreeFormat.register_format(format)
 
230
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
 
231
            workingtree.WorkingTreeFormat.register_format, format)
 
232
        self.assertTrue(format in 
 
233
            self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
 
234
                workingtree.WorkingTreeFormat.get_formats))
147
235
        # which branch.Open will refuse (not supported)
148
236
        self.assertRaises(errors.UnsupportedFormatError, workingtree.WorkingTree.open, '.')
149
237
        # but open_downlevel will work
150
238
        self.assertEqual(format.open(dir), workingtree.WorkingTree.open_downlevel('.'))
151
239
        # unregister the format
152
 
        workingtree.WorkingTreeFormat.unregister_format(format)
 
240
        self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
 
241
            workingtree.WorkingTreeFormat.unregister_format, format)
 
242
        self.assertFalse(format in
 
243
            self.applyDeprecated(symbol_versioning.deprecated_in((2, 4, 0)),
 
244
                workingtree.WorkingTreeFormat.get_formats))
 
245
 
 
246
 
 
247
class TestWorkingTreeIterEntriesByDir_wSubtrees(TestCaseWithTransport):
 
248
 
 
249
    def make_simple_tree(self):
 
250
        tree = self.make_branch_and_tree('tree', format='development-subtree')
 
251
        self.build_tree(['tree/a/', 'tree/a/b/', 'tree/a/b/c'])
 
252
        tree.set_root_id('root-id')
 
253
        tree.add(['a', 'a/b', 'a/b/c'], ['a-id', 'b-id', 'c-id'])
 
254
        tree.commit('initial')
 
255
        return tree
 
256
 
 
257
    def test_just_directory(self):
 
258
        tree = self.make_simple_tree()
 
259
        self.assertEqual([('directory', 'root-id'),
 
260
                          ('directory', 'a-id'),
 
261
                          ('directory', 'b-id'),
 
262
                          ('file', 'c-id')],
 
263
                         [(ie.kind, ie.file_id)
 
264
                          for path, ie in tree.iter_entries_by_dir()])
 
265
        subtree = self.make_branch_and_tree('tree/a/b')
 
266
        self.assertEqual([('tree-reference', 'b-id')],
 
267
                         [(ie.kind, ie.file_id)
 
268
                          for path, ie in tree.iter_entries_by_dir(['b-id'])])
 
269
 
 
270
    def test_direct_subtree(self):
 
271
        tree = self.make_simple_tree()
 
272
        subtree = self.make_branch_and_tree('tree/a/b')
 
273
        self.assertEqual([('directory', 'root-id'),
 
274
                          ('directory', 'a-id'),
 
275
                          ('tree-reference', 'b-id')],
 
276
                         [(ie.kind, ie.file_id)
 
277
                          for path, ie in tree.iter_entries_by_dir()])
 
278
 
 
279
    def test_indirect_subtree(self):
 
280
        tree = self.make_simple_tree()
 
281
        subtree = self.make_branch_and_tree('tree/a')
 
282
        self.assertEqual([('directory', 'root-id'),
 
283
                          ('tree-reference', 'a-id')],
 
284
                         [(ie.kind, ie.file_id)
 
285
                          for path, ie in tree.iter_entries_by_dir()])
 
286
 
 
287
 
 
288
class TestWorkingTreeFormatRegistry(TestCase):
 
289
 
 
290
    def setUp(self):
 
291
        super(TestWorkingTreeFormatRegistry, self).setUp()
 
292
        self.registry = workingtree.WorkingTreeFormatRegistry()
 
293
 
 
294
    def test_register_unregister_format(self):
 
295
        format = SampleTreeFormat()
 
296
        self.registry.register(format)
 
297
        self.assertEquals(format, self.registry.get("Sample tree format."))
 
298
        self.registry.remove(format)
 
299
        self.assertRaises(KeyError, self.registry.get, "Sample tree format.")
 
300
 
 
301
    def test_get_all(self):
 
302
        format = SampleTreeFormat()
 
303
        self.assertEquals([], self.registry._get_all())
 
304
        self.registry.register(format)
 
305
        self.assertEquals([format], self.registry._get_all())
 
306
 
 
307
    def test_register_extra(self):
 
308
        format = SampleExtraTreeFormat()
 
309
        self.assertEquals([], self.registry._get_all())
 
310
        self.registry.register_extra(format)
 
311
        self.assertEquals([format], self.registry._get_all())
 
312
 
 
313
    def test_register_extra_lazy(self):
 
314
        self.assertEquals([], self.registry._get_all())
 
315
        self.registry.register_extra_lazy("bzrlib.tests.test_workingtree",
 
316
            "SampleExtraTreeFormat")
 
317
        formats = self.registry._get_all()
 
318
        self.assertEquals(1, len(formats))
 
319
        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
153
320
 
154
321
 
155
322
class TestWorkingTreeFormat3(TestCaseWithTransport):
159
326
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
160
327
        control.create_repository()
161
328
        control.create_branch()
162
 
        tree = workingtree.WorkingTreeFormat3().initialize(control)
 
329
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
163
330
        # we want:
164
331
        # format 'Bazaar-NG Working Tree format 3'
165
332
        # inventory = blank inventory
169
336
        t = control.get_workingtree_transport(None)
170
337
        self.assertEqualDiff('Bazaar-NG Working Tree format 3',
171
338
                             t.get('format').read())
172
 
        self.assertEqualDiff('<inventory format="5">\n'
173
 
                             '</inventory>\n',
174
 
                             t.get('inventory').read())
 
339
        self.assertEqualDiff(t.get('inventory').read(),
 
340
                              '<inventory format="5">\n'
 
341
                              '</inventory>\n',
 
342
                             )
175
343
        self.assertEqualDiff('### bzr hashcache v5\n',
176
344
                             t.get('stat-cache').read())
177
345
        self.assertFalse(t.has('inventory.basis'))
178
346
        # no last-revision file means 'None' or 'NULLREVISION'
179
347
        self.assertFalse(t.has('last-revision'))
180
 
        # TODO RBC 20060210 do a commit, check the inventory.basis is created 
 
348
        # TODO RBC 20060210 do a commit, check the inventory.basis is created
181
349
        # correctly and last-revision file becomes present.
182
350
 
183
351
    def test_uses_lockdir(self):
184
352
        """WorkingTreeFormat3 uses its own LockDir:
185
 
            
 
353
 
186
354
            - lock is a directory
187
355
            - when the WorkingTree is locked, LockDir can see that
188
356
        """
192
360
        repo = dir.create_repository()
193
361
        branch = dir.create_branch()
194
362
        try:
195
 
            tree = workingtree.WorkingTreeFormat3().initialize(dir)
 
363
            tree = workingtree_3.WorkingTreeFormat3().initialize(dir)
196
364
        except errors.NotLocalUrl:
197
365
            raise TestSkipped('Not a local URL')
198
366
        self.assertIsDirectory('.bzr', t)
205
373
        tree.unlock()
206
374
        self.assertEquals(our_lock.peek(), None)
207
375
 
208
 
    def create_format2_tree(self, url):
209
 
        return BzrDir.create_standalone_workingtree(url)
210
 
 
211
 
    def test_conflicts_format2(self):
212
 
        # test backwards compatability
213
 
        tree = self.create_format2_tree('.')
214
 
        self.assertRaises(errors.UnsupportedOperation, tree.set_conflicts,
215
 
                          None)
216
 
        file('lala.BASE', 'wb').write('labase')
217
 
        expected = ContentsConflict('lala')
218
 
        self.assertEqual(list(tree.conflicts()), [expected])
219
 
        file('lala', 'wb').write('la')
220
 
        tree.add('lala', 'lala-id')
221
 
        expected = ContentsConflict('lala', file_id='lala-id')
222
 
        self.assertEqual(list(tree.conflicts()), [expected])
223
 
        file('lala.THIS', 'wb').write('lathis')
224
 
        file('lala.OTHER', 'wb').write('laother')
225
 
        # When "text conflict"s happen, stem, THIS and OTHER are text
226
 
        expected = TextConflict('lala', file_id='lala-id')
227
 
        self.assertEqual(list(tree.conflicts()), [expected])
228
 
        os.unlink('lala.OTHER')
229
 
        os.mkdir('lala.OTHER')
230
 
        expected = ContentsConflict('lala', file_id='lala-id')
231
 
        self.assertEqual(list(tree.conflicts()), [expected])
 
376
    def test_missing_pending_merges(self):
 
377
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
 
378
        control.create_repository()
 
379
        control.create_branch()
 
380
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
 
381
        tree._transport.delete("pending-merges")
 
382
        self.assertEqual([], tree.get_parent_ids())
 
383
 
 
384
 
 
385
class InstrumentedTree(object):
 
386
    """A instrumented tree to check the needs_tree_write_lock decorator."""
 
387
 
 
388
    def __init__(self):
 
389
        self._locks = []
 
390
 
 
391
    def lock_tree_write(self):
 
392
        self._locks.append('t')
 
393
 
 
394
    @needs_tree_write_lock
 
395
    def method_with_tree_write_lock(self, *args, **kwargs):
 
396
        """A lock_tree_write decorated method that returns its arguments."""
 
397
        return args, kwargs
 
398
 
 
399
    @needs_tree_write_lock
 
400
    def method_that_raises(self):
 
401
        """This method causes an exception when called with parameters.
 
402
 
 
403
        This allows the decorator code to be checked - it should still call
 
404
        unlock.
 
405
        """
 
406
 
 
407
    def unlock(self):
 
408
        self._locks.append('u')
 
409
 
 
410
 
 
411
class TestInstrumentedTree(TestCase):
 
412
 
 
413
    def test_needs_tree_write_lock(self):
 
414
        """@needs_tree_write_lock should be semantically transparent."""
 
415
        tree = InstrumentedTree()
 
416
        self.assertEqual(
 
417
            'method_with_tree_write_lock',
 
418
            tree.method_with_tree_write_lock.__name__)
 
419
        self.assertDocstring(
 
420
            "A lock_tree_write decorated method that returns its arguments.",
 
421
            tree.method_with_tree_write_lock)
 
422
        args = (1, 2, 3)
 
423
        kwargs = {'a':'b'}
 
424
        result = tree.method_with_tree_write_lock(1,2,3, a='b')
 
425
        self.assertEqual((args, kwargs), result)
 
426
        self.assertEqual(['t', 'u'], tree._locks)
 
427
        self.assertRaises(TypeError, tree.method_that_raises, 'foo')
 
428
        self.assertEqual(['t', 'u', 't', 'u'], tree._locks)
 
429
 
 
430
 
 
431
class TestRevert(TestCaseWithTransport):
 
432
 
 
433
    def test_revert_conflicts_recursive(self):
 
434
        this_tree = self.make_branch_and_tree('this-tree')
 
435
        self.build_tree_contents([('this-tree/foo/',),
 
436
                                  ('this-tree/foo/bar', 'bar')])
 
437
        this_tree.add(['foo', 'foo/bar'])
 
438
        this_tree.commit('created foo/bar')
 
439
        other_tree = this_tree.bzrdir.sprout('other-tree').open_workingtree()
 
440
        self.build_tree_contents([('other-tree/foo/bar', 'baz')])
 
441
        other_tree.commit('changed bar')
 
442
        self.build_tree_contents([('this-tree/foo/bar', 'qux')])
 
443
        this_tree.commit('changed qux')
 
444
        this_tree.merge_from_branch(other_tree.branch)
 
445
        self.assertEqual(1, len(this_tree.conflicts()))
 
446
        this_tree.revert(['foo'])
 
447
        self.assertEqual(0, len(this_tree.conflicts()))
 
448
 
 
449
 
 
450
class TestAutoResolve(TestCaseWithTransport):
 
451
 
 
452
    def test_auto_resolve(self):
 
453
        base = self.make_branch_and_tree('base')
 
454
        self.build_tree_contents([('base/hello', 'Hello')])
 
455
        base.add('hello', 'hello_id')
 
456
        base.commit('Hello')
 
457
        other = base.bzrdir.sprout('other').open_workingtree()
 
458
        self.build_tree_contents([('other/hello', 'hELLO')])
 
459
        other.commit('Case switch')
 
460
        this = base.bzrdir.sprout('this').open_workingtree()
 
461
        self.assertPathExists('this/hello')
 
462
        self.build_tree_contents([('this/hello', 'Hello World')])
 
463
        this.commit('Add World')
 
464
        this.merge_from_branch(other.branch)
 
465
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
 
466
                         this.conflicts())
 
467
        this.auto_resolve()
 
468
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
 
469
                         this.conflicts())
 
470
        self.build_tree_contents([('this/hello', '<<<<<<<')])
 
471
        this.auto_resolve()
 
472
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
 
473
                         this.conflicts())
 
474
        self.build_tree_contents([('this/hello', '=======')])
 
475
        this.auto_resolve()
 
476
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
 
477
                         this.conflicts())
 
478
        self.build_tree_contents([('this/hello', '\n>>>>>>>')])
 
479
        remaining, resolved = this.auto_resolve()
 
480
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
 
481
                         this.conflicts())
 
482
        self.assertEqual([], resolved)
 
483
        self.build_tree_contents([('this/hello', 'hELLO wORLD')])
 
484
        remaining, resolved = this.auto_resolve()
 
485
        self.assertEqual([], this.conflicts())
 
486
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
 
487
                         resolved)
 
488
        self.assertPathDoesNotExist('this/hello.BASE')
 
489
 
 
490
    def test_auto_resolve_dir(self):
 
491
        tree = self.make_branch_and_tree('tree')
 
492
        self.build_tree(['tree/hello/'])
 
493
        tree.add('hello', 'hello-id')
 
494
        file_conflict = conflicts.TextConflict('file', 'hello-id')
 
495
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
 
496
        tree.auto_resolve()
 
497
 
 
498
 
 
499
class TestFindTrees(TestCaseWithTransport):
 
500
 
 
501
    def test_find_trees(self):
 
502
        self.make_branch_and_tree('foo')
 
503
        self.make_branch_and_tree('foo/bar')
 
504
        # Sticking a tree inside a control dir is heinous, so let's skip it
 
505
        self.make_branch_and_tree('foo/.bzr/baz')
 
506
        self.make_branch('qux')
 
507
        trees = workingtree.WorkingTree.find_trees('.')
 
508
        self.assertEqual(2, len(list(trees)))