~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_workingtree_4.py

  • Committer: Vincent Ladeuil
  • Date: 2011-07-06 09:22:00 UTC
  • mfrom: (6008 +trunk)
  • mto: (6012.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 6013.
  • Revision ID: v.ladeuil+lp@free.fr-20110706092200-7iai2mwzc0sqdsvf
MergingĀ inĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007-2010 Canonical Ltd
 
1
# Copyright (C) 2007-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
57
57
        finally:
58
58
            state.unlock()
59
59
 
 
60
    def test_resets_ignores_on_last_unlock(self):
 
61
        # Only the last unlock call will actually reset the
 
62
        # ignores. (bug #785671)
 
63
        tree = self.make_workingtree()
 
64
        tree.lock_read()
 
65
        try:
 
66
            tree.lock_read()
 
67
            try:
 
68
                tree.is_ignored("foo")
 
69
            finally:
 
70
                tree.unlock()
 
71
            self.assertIsNot(None, tree._ignoreglobster)
 
72
        finally:
 
73
            tree.unlock()
 
74
        self.assertIs(None, tree._ignoreglobster)
 
75
 
60
76
    def test_uses_lockdir(self):
61
77
        """WorkingTreeFormat4 uses its own LockDir:
62
78
 
174
190
        # it's given; any calls to forbidden methods will raise an
175
191
        # AssertionError
176
192
        repo = tree.branch.repository
177
 
        repo.get_revision = self.fail
178
 
        repo.get_inventory = self.fail
179
 
        repo._get_inventory_xml = self.fail
 
193
        self.overrideAttr(repo, "get_revision", self.fail)
 
194
        self.overrideAttr(repo, "get_inventory", self.fail)
 
195
        self.overrideAttr(repo, "_get_inventory_xml", self.fail)
180
196
        # try to set the parent trees.
181
197
        tree.set_parent_trees([(rev1, rev1_tree)])
182
198
 
214
230
        # answer 'get_parent_ids' for the revision tree- dirstate does not
215
231
        # cache the parents of a parent tree at this point.
216
232
        #repo.get_revision = self.fail
217
 
        repo.get_inventory = self.fail
218
 
        repo._get_inventory_xml = self.fail
 
233
        self.overrideAttr(repo, "get_inventory", self.fail)
 
234
        self.overrideAttr(repo, "_get_inventory_xml", self.fail)
219
235
        # set the parent trees.
220
236
        tree.set_parent_trees([(rev1, rev1_tree), (rev2, rev2_tree)])
221
237
        # read the first tree
258
274
        lock_and_call_current_dirstate(tree, 'lock_tree_write')
259
275
        self.assertRaises(errors.ObjectNotLocked, tree.current_dirstate)
260
276
 
 
277
    def test_set_parent_trees_uses_update_basis_by_delta(self):
 
278
        builder = self.make_branch_builder('source')
 
279
        builder.start_series()
 
280
        self.addCleanup(builder.finish_series)
 
281
        builder.build_snapshot('A', [], [
 
282
            ('add', ('', 'root-id', 'directory', None)),
 
283
            ('add', ('a', 'a-id', 'file', 'content\n'))])
 
284
        builder.build_snapshot('B', ['A'], [
 
285
            ('modify', ('a-id', 'new content\nfor a\n')),
 
286
            ('add', ('b', 'b-id', 'file', 'b-content\n'))])
 
287
        tree = self.make_workingtree('tree')
 
288
        source_branch = builder.get_branch()
 
289
        tree.branch.repository.fetch(source_branch.repository, 'B')
 
290
        tree.pull(source_branch, stop_revision='A')
 
291
        tree.lock_write()
 
292
        self.addCleanup(tree.unlock)
 
293
        state = tree.current_dirstate()
 
294
        called = []
 
295
        orig_update = state.update_basis_by_delta
 
296
        def log_update_basis_by_delta(delta, new_revid):
 
297
            called.append(new_revid)
 
298
            return orig_update(delta, new_revid)
 
299
        state.update_basis_by_delta = log_update_basis_by_delta
 
300
        basis = tree.basis_tree()
 
301
        self.assertEqual('a-id', basis.path2id('a'))
 
302
        self.assertEqual(None, basis.path2id('b'))
 
303
        def fail_set_parent_trees(trees, ghosts):
 
304
            raise AssertionError('dirstate.set_parent_trees() was called')
 
305
        state.set_parent_trees = fail_set_parent_trees
 
306
        repo = tree.branch.repository
 
307
        tree.pull(source_branch, stop_revision='B')
 
308
        self.assertEqual(['B'], called)
 
309
        basis = tree.basis_tree()
 
310
        self.assertEqual('a-id', basis.path2id('a'))
 
311
        self.assertEqual('b-id', basis.path2id('b'))
 
312
 
 
313
    def test_set_parent_trees_handles_missing_basis(self):
 
314
        builder = self.make_branch_builder('source')
 
315
        builder.start_series()
 
316
        self.addCleanup(builder.finish_series)
 
317
        builder.build_snapshot('A', [], [
 
318
            ('add', ('', 'root-id', 'directory', None)),
 
319
            ('add', ('a', 'a-id', 'file', 'content\n'))])
 
320
        builder.build_snapshot('B', ['A'], [
 
321
            ('modify', ('a-id', 'new content\nfor a\n')),
 
322
            ('add', ('b', 'b-id', 'file', 'b-content\n'))])
 
323
        builder.build_snapshot('C', ['A'], [
 
324
            ('add', ('c', 'c-id', 'file', 'c-content\n'))])
 
325
        b_c = self.make_branch('branch_with_c')
 
326
        b_c.pull(builder.get_branch(), stop_revision='C')
 
327
        b_b = self.make_branch('branch_with_b')
 
328
        b_b.pull(builder.get_branch(), stop_revision='B')
 
329
        # This is reproducing some of what 'switch' does, just to isolate the
 
330
        # set_parent_trees() step.
 
331
        wt = b_b.create_checkout('tree', lightweight=True)
 
332
        fmt = wt.bzrdir.find_branch_format()
 
333
        fmt.set_reference(wt.bzrdir, None, b_c)
 
334
        # Re-open with the new reference
 
335
        wt = wt.bzrdir.open_workingtree()
 
336
        wt.set_parent_trees([('C', b_c.repository.revision_tree('C'))])
 
337
        self.assertEqual(None, wt.basis_tree().path2id('b'))
 
338
 
261
339
    def test_new_dirstate_on_new_lock(self):
262
340
        # until we have detection for when a dirstate can be reused, we
263
341
        # want to reparse dirstate on every new lock.
597
675
 
598
676
    def get_tree_with_cachable_file_foo(self):
599
677
        tree = self.make_branch_and_tree('.')
600
 
        self.build_tree(['foo'])
 
678
        tree.lock_write()
 
679
        self.addCleanup(tree.unlock)
 
680
        self.build_tree_contents([('foo', 'a bit of content for foo\n')])
601
681
        tree.add(['foo'], ['foo-id'])
602
 
        # a 4 second old timestamp is always hashable - sucks to delay
603
 
        # the test suite, but not testing this is worse.
604
 
        time.sleep(4)
 
682
        tree.current_dirstate()._cutoff_time = time.time() + 60
605
683
        return tree
606
684
 
607
685
    def test_commit_updates_hash_cache(self):
608
686
        tree = self.get_tree_with_cachable_file_foo()
609
687
        revid = tree.commit('a commit')
610
688
        # tree's dirstate should now have a valid stat entry for foo.
611
 
        tree.lock_read()
612
 
        self.addCleanup(tree.unlock)
613
689
        entry = tree._get_entry(path='foo')
614
690
        expected_sha1 = osutils.sha_file_by_name('foo')
615
691
        self.assertEqual(expected_sha1, entry[1][0][1])
 
692
        self.assertEqual(len('a bit of content for foo\n'), entry[1][0][2])
616
693
 
617
694
    def test_observed_sha1_cachable(self):
618
695
        tree = self.get_tree_with_cachable_file_foo()
619
696
        expected_sha1 = osutils.sha_file_by_name('foo')
620
697
        statvalue = os.lstat("foo")
621
 
        tree.lock_write()
622
 
        try:
623
 
            tree._observed_sha1("foo-id", "foo", (expected_sha1, statvalue))
624
 
            self.assertEqual(expected_sha1,
625
 
                tree._get_entry(path="foo")[1][0][1])
626
 
        finally:
627
 
            tree.unlock()
 
698
        tree._observed_sha1("foo-id", "foo", (expected_sha1, statvalue))
 
699
        entry = tree._get_entry(path="foo")
 
700
        entry_state = entry[1][0]
 
701
        self.assertEqual(expected_sha1, entry_state[1])
 
702
        self.assertEqual(statvalue.st_size, entry_state[2])
 
703
        tree.unlock()
 
704
        tree.lock_read()
628
705
        tree = tree.bzrdir.open_workingtree()
629
706
        tree.lock_read()
630
707
        self.addCleanup(tree.unlock)
631
 
        self.assertEqual(expected_sha1, tree._get_entry(path="foo")[1][0][1])
 
708
        entry = tree._get_entry(path="foo")
 
709
        entry_state = entry[1][0]
 
710
        self.assertEqual(expected_sha1, entry_state[1])
 
711
        self.assertEqual(statvalue.st_size, entry_state[2])
632
712
 
633
713
    def test_observed_sha1_new_file(self):
634
714
        tree = self.make_branch_and_tree('.')