227
227
paths = ['a', 'b/', 'b/c', 'b/d/', 'b/d/e', 'b-c', 'f']
228
228
file_ids = ['a-id', 'b-id', 'c-id', 'd-id', 'e-id', 'b-c-id', 'f-id']
229
229
self.build_tree(['tree/' + p for p in paths])
230
tree.set_root_id(b'TREE_ROOT')
230
tree.set_root_id('TREE_ROOT')
231
231
tree.add([p.rstrip('/') for p in paths], file_ids)
232
tree.commit('initial', rev_id=b'rev-1')
232
tree.commit('initial', rev_id='rev-1')
233
233
revision_id = 'rev-1'
234
234
# a_packed_stat = dirstate.pack_stat(os.stat('tree/a'))
235
235
t = self.get_transport('tree')
452
452
def get_tree_with_a_file(self):
453
453
tree = self.make_branch_and_tree('tree')
454
454
self.build_tree(['tree/a file'])
455
tree.add('a file', b'a-file-id')
455
tree.add('a file', 'a-file-id')
458
458
def test_non_empty_no_parents_to_dirstate(self):
476
476
rev_id = tree.commit('first post').encode('utf8')
477
477
# change the current content to be different this will alter stat, sha
479
self.build_tree_contents([('tree/a file', b'new content\n')])
479
self.build_tree_contents([('tree/a file', 'new content\n')])
480
480
expected_result = ([rev_id], [
481
481
(('', '', tree.get_root_id()), # common details
482
482
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
483
483
('d', '', 0, False, rev_id), # first parent details
485
(('', 'a file', b'a-file-id'), # common
485
(('', 'a file', 'a-file-id'), # common
486
486
[('f', '', 0, False, dirstate.DirState.NULLSTAT), # current
487
487
('f', 'c3ed76e4bfd45ff1763ca206055bca8e9fc28aa8', 24, False,
488
488
rev_id), # first parent
503
503
tree.merge_from_branch(tree2.branch)
504
504
# change the current content to be different this will alter stat, sha
505
505
# and length again, giving us three distinct values:
506
self.build_tree_contents([('tree/a file', b'new content\n')])
506
self.build_tree_contents([('tree/a file', 'new content\n')])
507
507
expected_result = ([rev_id, rev_id2], [
508
508
(('', '', tree.get_root_id()), # common details
509
509
[('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
549
549
def create_updated_dirstate(self):
550
550
self.build_tree(['a-file'])
551
551
tree = self.make_branch_and_tree('.')
552
tree.add(['a-file'], [b'a-id'])
552
tree.add(['a-file'], ['a-id'])
553
553
tree.commit('add a-file')
554
554
# Save and unlock the state, re-open it in readonly mode
555
555
state = dirstate.DirState.from_tree(tree, 'dirstate')
567
567
lines = state.get_lines()
569
self.build_tree_contents([('dirstate', b''.join(lines))])
569
self.build_tree_contents([('dirstate', ''.join(lines))])
570
570
# get a state object
571
571
# no parents, default tree content
572
572
expected_result = ([], [
681
681
state = dirstate.DirState.initialize('dirstate')
683
683
# No stat and no sha1 sum.
684
state.add('a-file', b'a-file-id', 'file', None, '')
684
state.add('a-file', 'a-file-id', 'file', None, '')
689
689
# The dirstate should include TREE_ROOT and 'a-file' and nothing else
690
690
expected_blocks = [
691
('', [(('', '', b'TREE_ROOT'),
691
('', [(('', '', 'TREE_ROOT'),
692
692
[('d', '', 0, False, dirstate.DirState.NULLSTAT)])]),
693
('', [(('', 'a-file', b'a-file-id'),
693
('', [(('', 'a-file', 'a-file-id'),
694
694
[('f', '', 0, False, dirstate.DirState.NULLSTAT)])]),
701
701
self.assertEqual(expected_blocks, state._dirblocks)
703
703
# Now modify the state, but mark it as inconsistent
704
state.add(b'a-dir', b'a-dir-id', 'directory', None, '')
704
state.add('a-dir', 'a-dir-id', 'directory', None, '')
705
705
state._changes_aborted = True
752
752
state = self.create_dirstate_with_root_and_subdir()
753
753
self.addCleanup(state.unlock)
754
754
id_index = state._get_id_index()
755
self.assertEqual(['a-root-value', b'subdir-id'], sorted(id_index))
756
state.add('file-name', b'file-id', 'file', None, '')
757
self.assertEqual(['a-root-value', b'file-id', b'subdir-id'],
755
self.assertEqual(['a-root-value', 'subdir-id'], sorted(id_index))
756
state.add('file-name', 'file-id', 'file', None, '')
757
self.assertEqual(['a-root-value', 'file-id', 'subdir-id'],
758
758
sorted(id_index))
759
state.update_minimal(('', 'new-name', b'file-id'), 'f',
759
state.update_minimal(('', 'new-name', 'file-id'), 'f',
760
760
path_utf8='new-name')
761
self.assertEqual(['a-root-value', b'file-id', b'subdir-id'],
761
self.assertEqual(['a-root-value', 'file-id', 'subdir-id'],
762
762
sorted(id_index))
763
self.assertEqual([('', 'new-name', b'file-id')],
764
sorted(id_index[b'file-id']))
763
self.assertEqual([('', 'new-name', 'file-id')],
764
sorted(id_index['file-id']))
765
765
state._validate()
767
767
def test_set_state_from_inventory_no_content_no_parents(self):
842
842
# make a dirstate with some valid hashcache data
843
843
# file on disk, but that's not needed for this test
844
foo_contents = b'contents of foo'
844
foo_contents = 'contents of foo'
845
845
self.build_tree_contents([('foo', foo_contents)])
846
tree.add('foo', b'foo-id')
846
tree.add('foo', 'foo-id')
848
848
foo_stat = os.stat('foo')
849
849
foo_packed = dirstate.pack_stat(foo_stat)
902
902
tree1.add(['a', 'a/b', 'a-b', 'a/b/foo', 'a-b/bar'],
903
903
['a-id', 'b-id', 'a-b-id', 'foo-id', 'bar-id'])
904
tree1.commit('rev1', rev_id=b'rev1')
904
tree1.commit('rev1', rev_id='rev1')
905
905
root_id = tree1.get_root_id()
906
906
inv = tree1.root_inventory
925
925
for entry in state._iter_entries():
926
926
values.append(entry[0] + entry[1][0][:1])
927
927
self.assertEqual(expected_result1, values)
929
929
state.set_state_from_inventory(inv)
931
931
for entry in state._iter_entries():
972
972
"""Set the root file id in a dirstate with parents"""
973
973
mt = self.make_branch_and_tree('mt')
974
974
# in case the default tree format uses a different root id
975
mt.set_root_id(b'TREE_ROOT')
976
mt.commit('foo', rev_id=b'parent-revid')
975
mt.set_root_id('TREE_ROOT')
976
mt.commit('foo', rev_id='parent-revid')
977
977
rt = mt.branch.repository.revision_tree('parent-revid')
978
978
state = dirstate.DirState.initialize('dirstate')
979
979
state._validate()
1104
1104
tree1.lock_write()
1107
tree1.add(['a file'], [b'file-id'], ['file'])
1107
tree1.add(['a file'], ['file-id'], ['file'])
1108
1108
tree1.put_file_bytes_non_atomic('a file', 'file-content')
1109
1109
revid1 = tree1.commit('foo')
1158
1158
# the 1*20 is the sha1 pretend value.
1159
1159
state = dirstate.DirState.initialize('dirstate')
1160
1160
expected_entries = [
1161
(('', '', b'TREE_ROOT'), [
1161
(('', '', 'TREE_ROOT'), [
1162
1162
('d', '', 0, False, dirstate.DirState.NULLSTAT), # current tree
1164
(('', 'a file', b'a-file-id'), [
1164
(('', 'a file', 'a-file-id'), [
1165
1165
('f', '1'*20, 19, False, dirstate.pack_stat(stat)), # current tree
1169
state.add('a file', b'a-file-id', 'file', stat, '1'*20)
1169
state.add('a file', 'a-file-id', 'file', stat, '1'*20)
1170
1170
# having added it, it should be in the output of iter_entries.
1171
1171
self.assertEqual(expected_entries, list(state._iter_entries()))
1172
1172
# saving and reloading should not affect this.
1278
1278
state = dirstate.DirState.initialize('dirstate')
1280
state.add('a dir', b'a dir id', 'directory', dirstat, None)
1281
state.add('a dir/a file', b'a-file-id', 'file', filestat, '1'*20)
1280
state.add('a dir', 'a dir id', 'directory', dirstat, None)
1281
state.add('a dir/a file', 'a-file-id', 'file', filestat, '1'*20)
1282
1282
# added it, it should be in the output of iter_entries.
1283
1283
self.assertEqual(expected_entries, list(state._iter_entries()))
1284
1284
# saving and reloading should not affect this.
1294
1294
# make a dirstate and add a tree reference
1295
1295
state = dirstate.DirState.initialize('dirstate')
1296
1296
expected_entry = (
1297
('', 'subdir', b'subdir-id'),
1297
('', 'subdir', 'subdir-id'),
1298
1298
[('t', 'subtree-123123', 0, False,
1299
1299
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')],
1302
state.add('subdir', b'subdir-id', 'tree-reference', None, 'subtree-123123')
1303
entry = state._get_entry(0, b'subdir-id', 'subdir')
1302
state.add('subdir', 'subdir-id', 'tree-reference', None, 'subtree-123123')
1303
entry = state._get_entry(0, 'subdir-id', 'subdir')
1304
1304
self.assertEqual(entry, expected_entry)
1305
1305
state._validate()
1310
1310
state.lock_read()
1311
1311
self.addCleanup(state.unlock)
1312
1312
state._validate()
1313
entry2 = state._get_entry(0, b'subdir-id', 'subdir')
1313
entry2 = state._get_entry(0, 'subdir-id', 'subdir')
1314
1314
self.assertEqual(entry, entry2)
1315
1315
self.assertEqual(entry, expected_entry)
1316
1316
# and lookup by id should work too
1317
entry2 = state._get_entry(0, fileid_utf8=b'subdir-id')
1317
entry2 = state._get_entry(0, fileid_utf8='subdir-id')
1318
1318
self.assertEqual(entry, expected_entry)
1320
1320
def test_add_forbidden_names(self):
1335
1335
self.build_tree(['tree1/b'])
1336
1336
tree1.lock_write()
1338
tree1.add(['b'], [b'b-id'])
1338
tree1.add(['b'], ['b-id'])
1339
1339
root_id = tree1.get_root_id()
1340
1340
inv = tree1.root_inventory
1341
1341
state = dirstate.DirState.initialize('dirstate')
1382
1382
tree = self.make_branch_and_tree('.')
1383
1383
self.build_tree(['c', 'd'])
1384
1384
tree.lock_write()
1385
tree.add(['c', 'd'], [b'c-id', b'd-id'])
1385
tree.add(['c', 'd'], ['c-id', 'd-id'])
1386
1386
tree.commit('add c and d')
1387
1387
state = InstrumentedDirState.on_file(tree.current_dirstate()._filename,
1388
1388
worth_saving_limit=2)
2224
2224
tree = self.make_branch_and_tree('tree', format='development-subtree')
2225
2225
subtree = self.make_branch_and_tree('tree/subtree',
2226
2226
format='development-subtree')
2227
subtree.set_root_id(b'subtree')
2227
subtree.set_root_id('subtree')
2228
2228
tree.add_reference(subtree)
2229
2229
tree.add('subtree')
2230
2230
state = dirstate.DirState.from_tree(tree, 'dirstate')
2434
2434
self.assertRaises(NotImplementedError, p.stat_and_sha1, "foo")
2436
2436
def test_defaultsha1provider_sha1(self):
2437
text = b'test\r\nwith\nall\rpossible line endings\r\n'
2437
text = 'test\r\nwith\nall\rpossible line endings\r\n'
2438
2438
self.build_tree_contents([('foo', text)])
2439
2439
expected_sha = osutils.sha_string(text)
2440
2440
p = dirstate.DefaultSHA1Provider()
2441
2441
self.assertEqual(expected_sha, p.sha1('foo'))
2443
2443
def test_defaultsha1provider_stat_and_sha1(self):
2444
text = b'test\r\nwith\nall\rpossible line endings\r\n'
2444
text = 'test\r\nwith\nall\rpossible line endings\r\n'
2445
2445
self.build_tree_contents([('foo', text)])
2446
2446
expected_sha = osutils.sha_string(text)
2447
2447
p = dirstate.DefaultSHA1Provider()