81
82
            workingtree.WorkingTreeFormat.set_default_format(old_format)
 
82
83
        self.assertEqual(old_format, workingtree.WorkingTreeFormat.get_default_format())
 
85
 
        tree = self.make_branch_and_tree('.')
 
86
 
        open_direct = workingtree.WorkingTree.open('.')
 
87
 
        self.assertEqual(tree.basedir, open_direct.basedir)
 
88
 
        open_no_args = workingtree.WorkingTree.open()
 
89
 
        self.assertEqual(tree.basedir, open_no_args.basedir)
 
91
 
    def test_open_containing(self):
 
92
 
        tree = self.make_branch_and_tree('.')
 
93
 
        open_direct, relpath = workingtree.WorkingTree.open_containing('.')
 
94
 
        self.assertEqual(tree.basedir, open_direct.basedir)
 
95
 
        self.assertEqual('', relpath)
 
96
 
        open_no_args, relpath = workingtree.WorkingTree.open_containing()
 
97
 
        self.assertEqual(tree.basedir, open_no_args.basedir)
 
98
 
        self.assertEqual('', relpath)
 
99
 
        open_subdir, relpath = workingtree.WorkingTree.open_containing('subdir')
 
100
 
        self.assertEqual(tree.basedir, open_subdir.basedir)
 
101
 
        self.assertEqual('subdir', relpath)
 
104
86
class SampleTreeFormat(workingtree.WorkingTreeFormat):
 
105
87
    """A sample format
 
107
 
    this format is initializable, unsupported to aid in testing the
 
 
89
    this format is initializable, unsupported to aid in testing the 
 
108
90
    open and open_downlevel routines.
 
 
235
216
        control.create_repository()
 
236
217
        control.create_branch()
 
237
218
        tree = workingtree.WorkingTreeFormat3().initialize(control)
 
238
 
        tree._transport.delete("pending-merges")
 
 
219
        tree._control_files._transport.delete("pending-merges")
 
239
220
        self.assertEqual([], tree.get_parent_ids())
 
 
223
class TestWorkingTreeFormatAB1(TestCaseWithTransport):
 
 
224
    """Tests specific to WorkingTreeFormat3."""
 
 
226
    def test_disk_layout(self):
 
 
227
        tree = self.make_branch_and_tree('.', format='experimental-knit3')
 
 
228
        control = tree.bzrdir
 
 
230
        # format 'Bazaar-NG Working Tree format AB1'
 
 
231
        # inventory = 1 entry for root
 
 
232
        # pending-merges = ''
 
 
233
        # no inventory.basis yet
 
 
234
        t = control.get_workingtree_transport(None)
 
 
235
        self.assertEqualDiff('Bazaar-NG Working Tree format AB1',
 
 
236
                             t.get('format').read())
 
 
237
        self.assertContainsRe(t.get('inventory').read(), 
 
 
238
                              '<inventory format="7">\n'
 
 
239
                              '<directory file_id="[^"]*" name="" />\n'
 
 
242
        self.assertEqualDiff('### bzr hashcache v5\n',
 
 
243
                             t.get('stat-cache').read())
 
 
244
        self.assertFalse(t.has('basis-inventory-cache'))
 
 
245
        # no last-revision file means 'None' or 'NULLREVISION'
 
 
246
        self.assertFalse(t.has('last-revision'))
 
 
247
        tree.set_root_id('my-root-id')
 
 
248
        tree.commit('test', rev_id='revision-1')
 
 
249
        self.assertTrue(t.has('basis-inventory-cache'))
 
 
250
        self.assertTrue(t.has('last-revision'))
 
 
251
        self.assertEqualDiff(t.get('basis-inventory-cache').read(), 
 
 
252
            '<inventory format="7" revision_id="revision-1">\n'
 
 
253
            '<directory file_id="my-root-id" name="" revision="revision-1" />\n'
 
 
256
    def test_incompatible_repo(self):
 
 
257
        control = bzrdir.format_registry.make_bzrdir('knit')
 
 
258
        control.workingtree_format = workingtree.WorkingTreeFormatAB1()
 
 
259
        tree = self.make_branch_and_tree('.', format=control)
 
 
260
        self.assertRaises(errors.RootNotRich, tree.commit)
 
 
262
    def test_compatible_repo(self):
 
 
263
        tree = self.make_branch_and_tree('.', format='experimental-knit3')
 
 
264
        tree.set_root_id('my-root-id')
 
 
265
        tree.commit('test', rev_id='revision-1')
 
 
266
        tree.commit('test', rev_id='revision-2')
 
 
267
        revision_tree = tree.branch.repository.revision_tree('revision-2')
 
 
268
        self.assertEqual('revision-1', 
 
 
269
                         revision_tree.inventory['my-root-id'].revision)
 
242
272
class TestFormat2WorkingTree(TestCaseWithTransport):
 
243
273
    """Tests that are specific to format 2 trees."""
 
 
269
299
        self.assertEqual(list(tree.conflicts()), [expected])
 
 
302
class TestNonFormatSpecificCode(TestCaseWithTransport):
 
 
303
    """This class contains tests of workingtree that are not format specific."""
 
 
305
    def test_gen_file_id(self):
 
 
306
        file_id = self.applyDeprecated(zero_thirteen, workingtree.gen_file_id,
 
 
308
        self.assertStartsWith(file_id, 'filename-')
 
 
310
    def test_gen_root_id(self):
 
 
311
        file_id = self.applyDeprecated(zero_thirteen, workingtree.gen_root_id)
 
 
312
        self.assertStartsWith(file_id, 'tree_root-')
 
272
315
class InstrumentedTree(object):
 
273
316
    """A instrumented tree to check the needs_tree_write_lock decorator."""
 
 
313
356
        self.assertEqual(['t', 'u'], tree._locks)
 
314
357
        self.assertRaises(TypeError, tree.method_that_raises, 'foo')
 
315
358
        self.assertEqual(['t', 'u', 't', 'u'], tree._locks)
 
318
 
class TestRevert(TestCaseWithTransport):
 
320
 
    def test_revert_conflicts_recursive(self):
 
321
 
        this_tree = self.make_branch_and_tree('this-tree')
 
322
 
        self.build_tree_contents([('this-tree/foo/',),
 
323
 
                                  ('this-tree/foo/bar', 'bar')])
 
324
 
        this_tree.add(['foo', 'foo/bar'])
 
325
 
        this_tree.commit('created foo/bar')
 
326
 
        other_tree = this_tree.bzrdir.sprout('other-tree').open_workingtree()
 
327
 
        self.build_tree_contents([('other-tree/foo/bar', 'baz')])
 
328
 
        other_tree.commit('changed bar')
 
329
 
        self.build_tree_contents([('this-tree/foo/bar', 'qux')])
 
330
 
        this_tree.commit('changed qux')
 
331
 
        this_tree.merge_from_branch(other_tree.branch)
 
332
 
        self.assertEqual(1, len(this_tree.conflicts()))
 
333
 
        this_tree.revert(['foo'])
 
334
 
        self.assertEqual(0, len(this_tree.conflicts()))
 
337
 
class TestAutoResolve(TestCaseWithTransport):
 
339
 
    def test_auto_resolve(self):
 
340
 
        base = self.make_branch_and_tree('base')
 
341
 
        self.build_tree_contents([('base/hello', 'Hello')])
 
342
 
        base.add('hello', 'hello_id')
 
344
 
        other = base.bzrdir.sprout('other').open_workingtree()
 
345
 
        self.build_tree_contents([('other/hello', 'hELLO')])
 
346
 
        other.commit('Case switch')
 
347
 
        this = base.bzrdir.sprout('this').open_workingtree()
 
348
 
        self.failUnlessExists('this/hello')
 
349
 
        self.build_tree_contents([('this/hello', 'Hello World')])
 
350
 
        this.commit('Add World')
 
351
 
        this.merge_from_branch(other.branch)
 
352
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
355
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
357
 
        self.build_tree_contents([('this/hello', '<<<<<<<')])
 
359
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
361
 
        self.build_tree_contents([('this/hello', '=======')])
 
363
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
365
 
        self.build_tree_contents([('this/hello', '\n>>>>>>>')])
 
366
 
        remaining, resolved = this.auto_resolve()
 
367
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
369
 
        self.assertEqual([], resolved)
 
370
 
        self.build_tree_contents([('this/hello', 'hELLO wORLD')])
 
371
 
        remaining, resolved = this.auto_resolve()
 
372
 
        self.assertEqual([], this.conflicts())
 
373
 
        self.assertEqual([conflicts.TextConflict('hello', None, 'hello_id')],
 
375
 
        self.failIfExists('this/hello.BASE')
 
377
 
    def test_auto_resolve_dir(self):
 
378
 
        tree = self.make_branch_and_tree('tree')
 
379
 
        self.build_tree(['tree/hello/'])
 
380
 
        tree.add('hello', 'hello-id')
 
381
 
        file_conflict = conflicts.TextConflict('file', None, 'hello-id')
 
382
 
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
 
386
 
class TestFindTrees(TestCaseWithTransport):
 
388
 
    def test_find_trees(self):
 
389
 
        self.make_branch_and_tree('foo')
 
390
 
        self.make_branch_and_tree('foo/bar')
 
391
 
        # Sticking a tree inside a control dir is heinous, so let's skip it
 
392
 
        self.make_branch_and_tree('foo/.bzr/baz')
 
393
 
        self.make_branch('qux')
 
394
 
        trees = workingtree.WorkingTree.find_trees('.')
 
395
 
        self.assertEqual(2, len(list(trees)))