125
125
# permit lock upgrading.
126
126
subtree.lock_write()
127
127
self.addCleanup(subtree.unlock)
128
self.build_tree(['subdir/file-a',])
128
self.build_tree(['subdir/file-a', ])
129
129
subtree.add(['file-a'], [b'id-a'])
130
130
rev1 = subtree.commit('commit in subdir')
297
297
state = tree.current_dirstate()
299
299
orig_update = state.update_basis_by_delta
300
301
def log_update_basis_by_delta(delta, new_revid):
301
302
called.append(new_revid)
302
303
return orig_update(delta, new_revid)
304
305
basis = tree.basis_tree()
305
306
self.assertEqual(b'a-id', basis.path2id('a'))
306
307
self.assertFalse(basis.is_versioned('b'))
307
309
def fail_set_parent_trees(trees, ghosts):
308
310
raise AssertionError('dirstate.set_parent_trees() was called')
309
311
state.set_parent_trees = fail_set_parent_trees
347
349
# until we have detection for when a dirstate can be reused, we
348
350
# want to reparse dirstate on every new lock.
349
351
known_dirstates = set()
350
353
def lock_and_compare_all_current_dirstate(tree, lock_method):
351
354
getattr(tree, lock_method)()
352
355
state = tree.current_dirstate()
388
391
rev_tree2 = tree.branch.repository.revision_tree(rev_id2)
389
392
optimiser = InterTree.get(rev_tree, rev_tree2)
390
393
self.assertIsInstance(optimiser, InterTree)
391
self.assertFalse(isinstance(optimiser, workingtree_4.InterDirStateTree))
394
self.assertFalse(isinstance(
395
optimiser, workingtree_4.InterDirStateTree))
392
396
optimiser = InterTree.get(rev_tree2, rev_tree)
393
397
self.assertIsInstance(optimiser, InterTree)
394
self.assertFalse(isinstance(optimiser, workingtree_4.InterDirStateTree))
398
self.assertFalse(isinstance(
399
optimiser, workingtree_4.InterDirStateTree))
396
401
def test_revtree_not_in_dirstate_to_dirstate_not_interdirstate(self):
397
402
# we should not get a dirstate optimiser when the revision id for of
404
409
optimiser = InterTree.get(rev_tree, tree)
405
410
self.assertIsInstance(optimiser, InterTree)
406
self.assertFalse(isinstance(optimiser, workingtree_4.InterDirStateTree))
411
self.assertFalse(isinstance(
412
optimiser, workingtree_4.InterDirStateTree))
407
413
optimiser = InterTree.get(tree, rev_tree)
408
414
self.assertIsInstance(optimiser, InterTree)
409
self.assertFalse(isinstance(optimiser, workingtree_4.InterDirStateTree))
415
self.assertFalse(isinstance(
416
optimiser, workingtree_4.InterDirStateTree))
412
419
def test_empty_basis_to_dirstate_tree(self):
525
532
# each time you initialize a new tree, it gets a different root id
526
533
format_name = 'development-subtree'
527
534
tree1 = self.make_branch_and_tree('tree1',
529
536
tree2 = self.make_branch_and_tree('tree2',
531
538
self.assertNotEqual(tree1.get_root_id(), tree2.get_root_id())
532
539
# when you branch, it inherits the same root id
533
540
rev1 = tree1.commit('first post')
579
586
# the root is new too).
581
588
expected = [(b'dir-id',
589
(b'root', (None, u''), True, (False, True), (None, None),
590
(None, u''), (None, 'directory'), (None, 0))]
596
(b'root', (None, u''), True, (False, True), (None, None),
597
(None, u''), (None, 'directory'), (None, 0))]
591
598
self.assertEqual(expected, list(tree.iter_changes(tree.basis_tree(),
592
specific_files=['dir'])))
599
specific_files=['dir'])))
594
601
# do a commit, we want to trigger the dirstate fast-path too
595
602
tree.commit('first post')
635
642
'versioned2/unversioned/',
636
643
'versioned2/unversioned/a',
637
644
'versioned2/unversioned/b/',
639
646
tree.add(['versioned', 'versioned2', 'versioned2/a'])
640
647
tree.commit('one', rev_id=b'rev-1')
641
648
# Trap osutils._walkdirs_utf8 to spy on what dirs have been accessed.
643
651
def walkdirs_spy(*args, **kwargs):
644
652
for val in orig(*args, **kwargs):
645
653
returned.append(val[0][0])
656
664
self.assertEqual([(None, 'unversioned'),
657
665
(None, 'versioned/unversioned'),
658
666
(None, 'versioned2/unversioned'),
660
668
self.assertEqual([b'', b'versioned', b'versioned2'], returned)
661
del returned[:] # reset
669
del returned[:] # reset
662
670
changes = [c[1] for c in tree.iter_changes(basis)]
663
671
self.assertEqual([], changes)
664
672
self.assertEqual([b'', b'versioned', b'versioned2'], returned)
672
680
tree.add(['bar'], [b'bar-id'])
674
682
self.addCleanup(tree.unlock)
675
tree_iter_changes = lambda files: [
684
def tree_iter_changes(files): return [
676
685
c for c in tree.iter_changes(tree.basis_tree(), specific_files=files,
677
686
require_versioned=True)
686
695
tree = self.make_branch_and_tree('.')
687
696
self.build_tree_contents([('f', b'')])
688
697
tree.add(['f'], [b'f-id'])
689
699
def tree_iter_changes(tree, files):
690
700
return list(tree.iter_changes(tree.basis_tree(),
691
specific_files=files, require_versioned=True))
701
specific_files=files, require_versioned=True))
693
703
self.addCleanup(tree.unlock)
694
704
e = self.assertRaises(errors.PathsNotVersionedError,
695
tree_iter_changes, tree, [u'\xa7', u'\u03c0'])
705
tree_iter_changes, tree, [u'\xa7', u'\u03c0'])
696
706
self.assertEqual(set(e.paths), set([u'\xa7', u'\u03c0']))
698
708
def get_tree_with_cachable_file_foo(self):
740
750
current_sha1 = tree._get_entry(path="foo")[1][0][1]
741
751
with tree.lock_write():
742
752
tree._observed_sha1(b"foo-id", "foo",
743
(osutils.sha_file_by_name('foo'), os.lstat("foo")))
753
(osutils.sha_file_by_name('foo'), os.lstat("foo")))
744
754
# Must not have changed
745
755
self.assertEqual(current_sha1,
746
tree._get_entry(path="foo")[1][0][1])
756
tree._get_entry(path="foo")[1][0][1])
748
758
def test_get_file_with_stat_id_only(self):
749
759
# Explicit test to ensure we get a lstat value from WT4 trees.
778
788
state._read_dirblocks_if_needed()
779
789
# Now add in an invalid entry, a rename with a dangling pointer
780
790
state._dirblocks[1][1].append(((b'', b'foo', b'foo-id'),
781
[(b'f', b'', 0, False, b''),
782
(b'r', b'bar', 0, False, b'')]))
791
[(b'f', b'', 0, False, b''),
792
(b'r', b'bar', 0, False, b'')]))
783
793
self.assertListRaises(dirstate.DirstateCorrupt,
784
794
tree.iter_changes, tree.basis_tree())
816
826
(b'', [((b'', b'', root_id), [b'd', b'd'])]),
817
827
(b'', [((b'', b'dir', b'dir-id'), [b'd', b'd'])]),
818
828
(b'dir', [((b'dir', b'file', b'file-id'), [b'f', b'f'])]),
819
], self.get_simple_dirblocks(state))
829
], self.get_simple_dirblocks(state))
821
831
tree.remove(['dir/file'])
822
832
self.assertEqual([
823
833
(b'', [((b'', b'', root_id), [b'd', b'd'])]),
824
834
(b'', [((b'', b'dir', b'dir-id'), [b'd', b'd'])]),
825
835
(b'dir', [((b'dir', b'file', b'file-id'), [b'a', b'f'])]),
826
], self.get_simple_dirblocks(state))
836
], self.get_simple_dirblocks(state))
827
837
# Make sure the removal is written to disk
833
843
new_file = inventory.InventoryFile(b'file-id', 'new-file', root_id)
834
844
new_file.revision = b'new-revision-id'
835
845
self.assertRaises(errors.InconsistentDelta,
836
tree.update_basis_by_delta, b'new-revision-id',
837
[('dir', 'new-dir', b'dir-id', new_dir),
838
('dir/file', 'new-dir/new-file', b'file-id', new_file),
846
tree.update_basis_by_delta, b'new-revision-id',
847
[('dir', 'new-dir', b'dir-id', new_dir),
848
('dir/file', 'new-dir/new-file', b'file-id', new_file),
842
852
# Now when we re-read the file it should not have been modified
849
859
(b'', [((b'', b'', root_id), [b'd', b'd'])]),
850
860
(b'', [((b'', b'dir', b'dir-id'), [b'd', b'd'])]),
851
861
(b'dir', [((b'dir', b'file', b'file-id'), [b'a', b'f'])]),
852
], self.get_simple_dirblocks(state))
862
], self.get_simple_dirblocks(state))
855
865
class TestInventoryCoherency(TestCaseWithTransport):