44
44
# set_path_id setting id when state is in memory modified
47
def load_tests(basic_tests, module, loader):
48
suite = loader.suiteClass()
49
dir_reader_tests, remaining_tests = tests.split_suite_by_condition(
50
basic_tests, tests.condition_isinstance(TestCaseWithDirState))
51
tests.multiply_tests(dir_reader_tests,
52
test_osutils.dir_reader_scenarios(), suite)
53
suite.addTest(remaining_tests)
47
load_tests = load_tests_apply_scenarios
57
50
class TestCaseWithDirState(tests.TestCaseWithTransport):
58
51
"""Helper functions for creating DirState objects with various content."""
53
scenarios = test_osutils.dir_reader_scenarios()
60
55
# Set by load_tests
61
56
_dir_reader_class = None
62
57
_native_to_unicode = None # Not used yet
533
528
class TestDirStateOnFile(TestCaseWithDirState):
530
def create_updated_dirstate(self):
531
self.build_tree(['a-file'])
532
tree = self.make_branch_and_tree('.')
533
tree.add(['a-file'], ['a-id'])
534
tree.commit('add a-file')
535
# Save and unlock the state, re-open it in readonly mode
536
state = dirstate.DirState.from_tree(tree, 'dirstate')
539
state = dirstate.DirState.on_file('dirstate')
535
543
def test_construct_with_path(self):
536
544
tree = self.make_branch_and_tree('tree')
537
545
state = dirstate.DirState.from_tree(tree, 'dirstate.from_tree')
568
576
def test_can_save_in_read_lock(self):
569
self.build_tree(['a-file'])
570
state = dirstate.DirState.initialize('dirstate')
572
# No stat and no sha1 sum.
573
state.add('a-file', 'a-file-id', 'file', None, '')
578
# Now open in readonly mode
579
state = dirstate.DirState.on_file('dirstate')
577
state = self.create_updated_dirstate()
582
579
entry = state._get_entry(0, path_utf8='a-file')
583
580
# The current size should be 0 (default)
584
581
self.assertEqual(0, entry[1][0][2])
585
582
# We should have a real entry.
586
583
self.assertNotEqual((None, None), entry)
587
# Make sure everything is old enough
584
# Set the cutoff-time into the future, so things look cacheable
588
585
state._sha_cutoff_time()
589
state._cutoff_time += 10
590
# Change the file length
591
self.build_tree_contents([('a-file', 'shorter')])
592
sha1sum = dirstate.update_entry(state, entry, 'a-file',
594
# new file, no cached sha:
595
self.assertEqual(None, sha1sum)
586
state._cutoff_time += 10.0
587
st = os.lstat('a-file')
588
sha1sum = dirstate.update_entry(state, entry, 'a-file', st)
589
# We updated the current sha1sum because the file is cacheable
590
self.assertEqual('ecc5374e9ed82ad3ea3b4d452ea995a5fd3e70e3',
597
593
# The dirblock has been updated
598
self.assertEqual(7, entry[1][0][2])
594
self.assertEqual(st.st_size, entry[1][0][2])
599
595
self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
600
596
state._dirblock_state)
611
607
state.lock_read()
613
609
entry = state._get_entry(0, path_utf8='a-file')
614
self.assertEqual(7, entry[1][0][2])
610
self.assertEqual(st.st_size, entry[1][0][2])
618
614
def test_save_fails_quietly_if_locked(self):
619
615
"""If dirstate is locked, save will fail without complaining."""
620
self.build_tree(['a-file'])
621
state = dirstate.DirState.initialize('dirstate')
623
# No stat and no sha1 sum.
624
state.add('a-file', 'a-file-id', 'file', None, '')
629
state = dirstate.DirState.on_file('dirstate')
616
state = self.create_updated_dirstate()
632
618
entry = state._get_entry(0, path_utf8='a-file')
633
sha1sum = dirstate.update_entry(state, entry, 'a-file',
636
self.assertEqual(None, sha1sum)
619
# No cached sha1 yet.
620
self.assertEqual('', entry[1][0][1])
621
# Set the cutoff-time into the future, so things look cacheable
622
state._sha_cutoff_time()
623
state._cutoff_time += 10.0
624
st = os.lstat('a-file')
625
sha1sum = dirstate.update_entry(state, entry, 'a-file', st)
626
self.assertEqual('ecc5374e9ed82ad3ea3b4d452ea995a5fd3e70e3',
637
628
self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
638
629
state._dirblock_state)
731
722
class TestDirStateManipulations(TestCaseWithDirState):
724
def make_minimal_tree(self):
725
tree1 = self.make_branch_and_memory_tree('tree1')
727
self.addCleanup(tree1.unlock)
729
revid1 = tree1.commit('foo')
733
732
def test_update_minimal_updates_id_index(self):
734
733
state = self.create_dirstate_with_root_and_subdir()
735
734
self.addCleanup(state.unlock)
749
748
def test_set_state_from_inventory_no_content_no_parents(self):
750
749
# setting the current inventory is a slow but important api to support.
751
tree1 = self.make_branch_and_memory_tree('tree1')
755
revid1 = tree1.commit('foo').encode('utf8')
756
root_id = tree1.get_root_id()
757
inv = tree1.inventory
750
tree1, revid1 = self.make_minimal_tree()
751
inv = tree1.inventory
752
root_id = inv.path2id('')
760
753
expected_result = [], [
761
754
(('', '', root_id), [
762
755
('d', '', 0, False, dirstate.DirState.NULLSTAT)])]
774
767
# This will unlock it
775
768
self.check_state_with_reopen(expected_result, state)
770
def test_set_state_from_scratch_no_parents(self):
771
tree1, revid1 = self.make_minimal_tree()
772
inv = tree1.inventory
773
root_id = inv.path2id('')
774
expected_result = [], [
775
(('', '', root_id), [
776
('d', '', 0, False, dirstate.DirState.NULLSTAT)])]
777
state = dirstate.DirState.initialize('dirstate')
779
state.set_state_from_scratch(inv, [], [])
780
self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
782
self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
783
state._dirblock_state)
788
# This will unlock it
789
self.check_state_with_reopen(expected_result, state)
791
def test_set_state_from_scratch_identical_parent(self):
792
tree1, revid1 = self.make_minimal_tree()
793
inv = tree1.inventory
794
root_id = inv.path2id('')
795
rev_tree1 = tree1.branch.repository.revision_tree(revid1)
796
d_entry = ('d', '', 0, False, dirstate.DirState.NULLSTAT)
797
parent_entry = ('d', '', 0, False, revid1)
798
expected_result = [revid1], [
799
(('', '', root_id), [d_entry, parent_entry])]
800
state = dirstate.DirState.initialize('dirstate')
802
state.set_state_from_scratch(inv, [(revid1, rev_tree1)], [])
803
self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
805
self.assertEqual(dirstate.DirState.IN_MEMORY_MODIFIED,
806
state._dirblock_state)
811
# This will unlock it
812
self.check_state_with_reopen(expected_result, state)
777
814
def test_set_state_from_inventory_preserves_hashcache(self):
778
815
# https://bugs.launchpad.net/bzr/+bug/146176
779
816
# set_state_from_inventory should preserve the stat and hash value for