~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_workingtree.py

(jelmer) Remove config argument from VersionedFileRepository.add_revision()
 (Jelmer Vernooij)

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
 
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
17
 
21
18
from bzrlib import (
22
19
    bzrdir,
23
20
    conflicts,
24
21
    errors,
 
22
    symbol_versioning,
 
23
    transport,
25
24
    workingtree,
 
25
    workingtree_3,
 
26
    workingtree_4,
26
27
    )
27
 
from bzrlib.branch import Branch
28
 
from bzrlib.bzrdir import BzrDir
29
28
from bzrlib.lockdir import LockDir
30
29
from bzrlib.mutabletree import needs_tree_write_lock
31
 
from bzrlib.symbol_versioning import zero_thirteen
32
30
from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
33
 
from bzrlib.transport import get_transport
34
31
from bzrlib.workingtree import (
35
32
    TreeEntry,
36
33
    TreeDirectory,
66
63
class TestDefaultFormat(TestCaseWithTransport):
67
64
 
68
65
    def test_get_set_default_format(self):
69
 
        old_format = workingtree.WorkingTreeFormat.get_default_format()
70
 
        # default is 3
71
 
        self.assertTrue(isinstance(old_format, workingtree.WorkingTreeFormat3))
72
 
        workingtree.WorkingTreeFormat.set_default_format(SampleTreeFormat())
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:
82
 
            workingtree.WorkingTreeFormat.set_default_format(old_format)
83
 
        self.assertEqual(old_format, workingtree.WorkingTreeFormat.get_default_format())
84
 
 
85
 
 
86
 
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(AssertionError,
 
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):
87
131
    """A sample format
88
132
 
89
 
    this format is initializable, unsupported to aid in testing the 
 
133
    this format is initializable, unsupported to aid in testing the
90
134
    open and open_downlevel routines.
91
135
    """
92
136
 
93
 
    def get_format_string(self):
 
137
    @classmethod
 
138
    def get_format_string(cls):
94
139
        """See WorkingTreeFormat.get_format_string()."""
95
140
        return "Sample tree format."
96
141
 
97
 
    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):
98
144
        """Sample branches cannot be created."""
99
145
        t = a_bzrdir.get_workingtree_transport(self)
100
146
        t.put_bytes('format', self.get_format_string())
107
153
        return "opened tree."
108
154
 
109
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
 
110
176
class TestWorkingTreeFormat(TestCaseWithTransport):
111
177
    """Tests for the WorkingTreeFormat facility."""
112
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
 
113
192
    def test_find_format(self):
114
193
        # is the right format object found for a working tree?
115
194
        # create a branch with a few known format objects.
119
198
            dir.create_repository()
120
199
            dir.create_branch()
121
200
            format.initialize(dir)
122
 
            t = get_transport(url)
123
 
            found_format = workingtree.WorkingTreeFormat.find_format(dir)
124
 
            self.failUnless(isinstance(found_format, format.__class__))
125
 
        check_format(workingtree.WorkingTreeFormat3(), "bar")
126
 
        
 
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
 
127
206
    def test_find_format_no_tree(self):
128
207
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
129
208
        self.assertRaises(errors.NoWorkingTree,
130
 
                          workingtree.WorkingTreeFormat.find_format,
 
209
                          workingtree.WorkingTreeFormatMetaDir.find_format,
131
210
                          dir)
132
211
 
133
212
    def test_find_format_unknown_format(self):
136
215
        dir.create_branch()
137
216
        SampleTreeFormat().initialize(dir)
138
217
        self.assertRaises(errors.UnknownFormatError,
139
 
                          workingtree.WorkingTreeFormat.find_format,
 
218
                          workingtree.WorkingTreeFormatMetaDir.find_format,
140
219
                          dir)
141
220
 
142
221
    def test_register_unregister_format(self):
148
227
        # make a branch
149
228
        format.initialize(dir)
150
229
        # register a format for it.
151
 
        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))
152
235
        # which branch.Open will refuse (not supported)
153
236
        self.assertRaises(errors.UnsupportedFormatError, workingtree.WorkingTree.open, '.')
154
237
        # but open_downlevel will work
155
238
        self.assertEqual(format.open(dir), workingtree.WorkingTree.open_downlevel('.'))
156
239
        # unregister the format
157
 
        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
    def test_find_format_with_features(self):
 
247
        tree = self.make_branch_and_tree('.', format='2a')
 
248
        tree.update_feature_flags({"name": "necessity"})
 
249
        found_format = workingtree.WorkingTreeFormatMetaDir.find_format(
 
250
            tree.bzrdir)
 
251
        self.assertIsInstance(found_format, workingtree.WorkingTreeFormat)
 
252
        self.assertEquals(found_format.features.get("name"), "necessity")
 
253
        self.assertRaises(errors.MissingFeature, found_format.check_support_status,
 
254
            True)
 
255
        self.addCleanup(workingtree.WorkingTreeFormatMetaDir.unregister_feature,
 
256
            "name")
 
257
        workingtree.WorkingTreeFormatMetaDir.register_feature("name")
 
258
        found_format.check_support_status(True)
 
259
 
 
260
 
 
261
class TestWorkingTreeIterEntriesByDir_wSubtrees(TestCaseWithTransport):
 
262
 
 
263
    def make_simple_tree(self):
 
264
        tree = self.make_branch_and_tree('tree', format='development-subtree')
 
265
        self.build_tree(['tree/a/', 'tree/a/b/', 'tree/a/b/c'])
 
266
        tree.set_root_id('root-id')
 
267
        tree.add(['a', 'a/b', 'a/b/c'], ['a-id', 'b-id', 'c-id'])
 
268
        tree.commit('initial')
 
269
        return tree
 
270
 
 
271
    def test_just_directory(self):
 
272
        tree = self.make_simple_tree()
 
273
        self.assertEqual([('directory', 'root-id'),
 
274
                          ('directory', 'a-id'),
 
275
                          ('directory', 'b-id'),
 
276
                          ('file', 'c-id')],
 
277
                         [(ie.kind, ie.file_id)
 
278
                          for path, ie in tree.iter_entries_by_dir()])
 
279
        subtree = self.make_branch_and_tree('tree/a/b')
 
280
        self.assertEqual([('tree-reference', 'b-id')],
 
281
                         [(ie.kind, ie.file_id)
 
282
                          for path, ie in tree.iter_entries_by_dir(['b-id'])])
 
283
 
 
284
    def test_direct_subtree(self):
 
285
        tree = self.make_simple_tree()
 
286
        subtree = self.make_branch_and_tree('tree/a/b')
 
287
        self.assertEqual([('directory', 'root-id'),
 
288
                          ('directory', 'a-id'),
 
289
                          ('tree-reference', 'b-id')],
 
290
                         [(ie.kind, ie.file_id)
 
291
                          for path, ie in tree.iter_entries_by_dir()])
 
292
 
 
293
    def test_indirect_subtree(self):
 
294
        tree = self.make_simple_tree()
 
295
        subtree = self.make_branch_and_tree('tree/a')
 
296
        self.assertEqual([('directory', 'root-id'),
 
297
                          ('tree-reference', 'a-id')],
 
298
                         [(ie.kind, ie.file_id)
 
299
                          for path, ie in tree.iter_entries_by_dir()])
 
300
 
 
301
 
 
302
class TestWorkingTreeFormatRegistry(TestCase):
 
303
 
 
304
    def setUp(self):
 
305
        super(TestWorkingTreeFormatRegistry, self).setUp()
 
306
        self.registry = workingtree.WorkingTreeFormatRegistry()
 
307
 
 
308
    def test_register_unregister_format(self):
 
309
        format = SampleTreeFormat()
 
310
        self.registry.register(format)
 
311
        self.assertEquals(format, self.registry.get("Sample tree format."))
 
312
        self.registry.remove(format)
 
313
        self.assertRaises(KeyError, self.registry.get, "Sample tree format.")
 
314
 
 
315
    def test_get_all(self):
 
316
        format = SampleTreeFormat()
 
317
        self.assertEquals([], self.registry._get_all())
 
318
        self.registry.register(format)
 
319
        self.assertEquals([format], self.registry._get_all())
 
320
 
 
321
    def test_register_extra(self):
 
322
        format = SampleExtraTreeFormat()
 
323
        self.assertEquals([], self.registry._get_all())
 
324
        self.registry.register_extra(format)
 
325
        self.assertEquals([format], self.registry._get_all())
 
326
 
 
327
    def test_register_extra_lazy(self):
 
328
        self.assertEquals([], self.registry._get_all())
 
329
        self.registry.register_extra_lazy("bzrlib.tests.test_workingtree",
 
330
            "SampleExtraTreeFormat")
 
331
        formats = self.registry._get_all()
 
332
        self.assertEquals(1, len(formats))
 
333
        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
158
334
 
159
335
 
160
336
class TestWorkingTreeFormat3(TestCaseWithTransport):
164
340
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
165
341
        control.create_repository()
166
342
        control.create_branch()
167
 
        tree = workingtree.WorkingTreeFormat3().initialize(control)
 
343
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
168
344
        # we want:
169
345
        # format 'Bazaar-NG Working Tree format 3'
170
346
        # inventory = blank inventory
174
350
        t = control.get_workingtree_transport(None)
175
351
        self.assertEqualDiff('Bazaar-NG Working Tree format 3',
176
352
                             t.get('format').read())
177
 
        self.assertEqualDiff(t.get('inventory').read(), 
 
353
        self.assertEqualDiff(t.get('inventory').read(),
178
354
                              '<inventory format="5">\n'
179
355
                              '</inventory>\n',
180
356
                             )
183
359
        self.assertFalse(t.has('inventory.basis'))
184
360
        # no last-revision file means 'None' or 'NULLREVISION'
185
361
        self.assertFalse(t.has('last-revision'))
186
 
        # TODO RBC 20060210 do a commit, check the inventory.basis is created 
 
362
        # TODO RBC 20060210 do a commit, check the inventory.basis is created
187
363
        # correctly and last-revision file becomes present.
188
364
 
189
365
    def test_uses_lockdir(self):
190
366
        """WorkingTreeFormat3 uses its own LockDir:
191
 
            
 
367
 
192
368
            - lock is a directory
193
369
            - when the WorkingTree is locked, LockDir can see that
194
370
        """
198
374
        repo = dir.create_repository()
199
375
        branch = dir.create_branch()
200
376
        try:
201
 
            tree = workingtree.WorkingTreeFormat3().initialize(dir)
 
377
            tree = workingtree_3.WorkingTreeFormat3().initialize(dir)
202
378
        except errors.NotLocalUrl:
203
379
            raise TestSkipped('Not a local URL')
204
380
        self.assertIsDirectory('.bzr', t)
215
391
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
216
392
        control.create_repository()
217
393
        control.create_branch()
218
 
        tree = workingtree.WorkingTreeFormat3().initialize(control)
219
 
        tree._control_files._transport.delete("pending-merges")
 
394
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
 
395
        tree._transport.delete("pending-merges")
220
396
        self.assertEqual([], tree.get_parent_ids())
221
397
 
222
398
 
223
 
class TestFormat2WorkingTree(TestCaseWithTransport):
224
 
    """Tests that are specific to format 2 trees."""
225
 
 
226
 
    def create_format2_tree(self, url):
227
 
        return self.make_branch_and_tree(
228
 
            url, format=bzrdir.BzrDirFormat6())
229
 
 
230
 
    def test_conflicts(self):
231
 
        # test backwards compatability
232
 
        tree = self.create_format2_tree('.')
233
 
        self.assertRaises(errors.UnsupportedOperation, tree.set_conflicts,
234
 
                          None)
235
 
        file('lala.BASE', 'wb').write('labase')
236
 
        expected = conflicts.ContentsConflict('lala')
237
 
        self.assertEqual(list(tree.conflicts()), [expected])
238
 
        file('lala', 'wb').write('la')
239
 
        tree.add('lala', 'lala-id')
240
 
        expected = conflicts.ContentsConflict('lala', file_id='lala-id')
241
 
        self.assertEqual(list(tree.conflicts()), [expected])
242
 
        file('lala.THIS', 'wb').write('lathis')
243
 
        file('lala.OTHER', 'wb').write('laother')
244
 
        # When "text conflict"s happen, stem, THIS and OTHER are text
245
 
        expected = conflicts.TextConflict('lala', file_id='lala-id')
246
 
        self.assertEqual(list(tree.conflicts()), [expected])
247
 
        os.unlink('lala.OTHER')
248
 
        os.mkdir('lala.OTHER')
249
 
        expected = conflicts.ContentsConflict('lala', file_id='lala-id')
250
 
        self.assertEqual(list(tree.conflicts()), [expected])
251
 
 
252
 
 
253
 
class TestNonFormatSpecificCode(TestCaseWithTransport):
254
 
    """This class contains tests of workingtree that are not format specific."""
255
 
 
256
 
    def test_gen_file_id(self):
257
 
        file_id = self.applyDeprecated(zero_thirteen, workingtree.gen_file_id,
258
 
                                      'filename')
259
 
        self.assertStartsWith(file_id, 'filename-')
260
 
 
261
 
    def test_gen_root_id(self):
262
 
        file_id = self.applyDeprecated(zero_thirteen, workingtree.gen_root_id)
263
 
        self.assertStartsWith(file_id, 'tree_root-')
264
 
        
265
 
 
266
399
class InstrumentedTree(object):
267
400
    """A instrumented tree to check the needs_tree_write_lock decorator."""
268
401
 
280
413
    @needs_tree_write_lock
281
414
    def method_that_raises(self):
282
415
        """This method causes an exception when called with parameters.
283
 
        
 
416
 
284
417
        This allows the decorator code to be checked - it should still call
285
418
        unlock.
286
419
        """
297
430
        self.assertEqual(
298
431
            'method_with_tree_write_lock',
299
432
            tree.method_with_tree_write_lock.__name__)
300
 
        self.assertEqual(
 
433
        self.assertDocstring(
301
434
            "A lock_tree_write decorated method that returns its arguments.",
302
 
            tree.method_with_tree_write_lock.__doc__)
 
435
            tree.method_with_tree_write_lock)
303
436
        args = (1, 2, 3)
304
437
        kwargs = {'a':'b'}
305
438
        result = tree.method_with_tree_write_lock(1,2,3, a='b')
309
442
        self.assertEqual(['t', 'u', 't', 'u'], tree._locks)
310
443
 
311
444
 
 
445
class TestRevert(TestCaseWithTransport):
 
446
 
 
447
    def test_revert_conflicts_recursive(self):
 
448
        this_tree = self.make_branch_and_tree('this-tree')
 
449
        self.build_tree_contents([('this-tree/foo/',),
 
450
                                  ('this-tree/foo/bar', 'bar')])
 
451
        this_tree.add(['foo', 'foo/bar'])
 
452
        this_tree.commit('created foo/bar')
 
453
        other_tree = this_tree.bzrdir.sprout('other-tree').open_workingtree()
 
454
        self.build_tree_contents([('other-tree/foo/bar', 'baz')])
 
455
        other_tree.commit('changed bar')
 
456
        self.build_tree_contents([('this-tree/foo/bar', 'qux')])
 
457
        this_tree.commit('changed qux')
 
458
        this_tree.merge_from_branch(other_tree.branch)
 
459
        self.assertEqual(1, len(this_tree.conflicts()))
 
460
        this_tree.revert(['foo'])
 
461
        self.assertEqual(0, len(this_tree.conflicts()))
 
462
 
 
463
 
312
464
class TestAutoResolve(TestCaseWithTransport):
313
465
 
314
466
    def test_auto_resolve(self):
320
472
        self.build_tree_contents([('other/hello', 'hELLO')])
321
473
        other.commit('Case switch')
322
474
        this = base.bzrdir.sprout('this').open_workingtree()
323
 
        self.failUnlessExists('this/hello')
 
475
        self.assertPathExists('this/hello')
324
476
        self.build_tree_contents([('this/hello', 'Hello World')])
325
477
        this.commit('Add World')
326
478
        this.merge_from_branch(other.branch)
327
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
479
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
328
480
                         this.conflicts())
329
481
        this.auto_resolve()
330
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
482
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
331
483
                         this.conflicts())
332
484
        self.build_tree_contents([('this/hello', '<<<<<<<')])
333
485
        this.auto_resolve()
334
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
486
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
335
487
                         this.conflicts())
336
488
        self.build_tree_contents([('this/hello', '=======')])
337
489
        this.auto_resolve()
338
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
490
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
339
491
                         this.conflicts())
340
492
        self.build_tree_contents([('this/hello', '\n>>>>>>>')])
341
493
        remaining, resolved = this.auto_resolve()
342
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
494
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
343
495
                         this.conflicts())
344
496
        self.assertEqual([], resolved)
345
497
        self.build_tree_contents([('this/hello', 'hELLO wORLD')])
346
498
        remaining, resolved = this.auto_resolve()
347
499
        self.assertEqual([], this.conflicts())
348
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
500
        self.assertEqual([conflicts.TextConflict('hello', 'hello_id')],
349
501
                         resolved)
350
 
        self.failIfExists('this/hello.BASE')
 
502
        self.assertPathDoesNotExist('this/hello.BASE')
351
503
 
352
504
    def test_auto_resolve_dir(self):
353
505
        tree = self.make_branch_and_tree('tree')
354
506
        self.build_tree(['tree/hello/'])
355
507
        tree.add('hello', 'hello-id')
356
 
        file_conflict = conflicts.TextConflict('file', None, 'hello-id')
 
508
        file_conflict = conflicts.TextConflict('file', 'hello-id')
357
509
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
358
510
        tree.auto_resolve()
 
511
 
 
512
 
 
513
class TestFindTrees(TestCaseWithTransport):
 
514
 
 
515
    def test_find_trees(self):
 
516
        self.make_branch_and_tree('foo')
 
517
        self.make_branch_and_tree('foo/bar')
 
518
        # Sticking a tree inside a control dir is heinous, so let's skip it
 
519
        self.make_branch_and_tree('foo/.bzr/baz')
 
520
        self.make_branch('qux')
 
521
        trees = workingtree.WorkingTree.find_trees('.')
 
522
        self.assertEqual(2, len(list(trees)))