130
201
allow safety checks made by the WT to succeed, and finally ensures that all
131
202
items in the delta with a new path are present in the WT before calling
132
203
update_basis_by_delta.
134
205
:param basis: An inventory to be used as the basis.
135
206
:param delta: The inventory delta to apply:
136
207
:return: An inventory resulting from the application.
138
control = self.make_bzrdir('tree', format=self.format._matchingbzrdir)
209
control = test.make_controldir(
210
'tree', format=test.format._matchingcontroldir)
139
211
control.create_repository()
140
212
control.create_branch()
141
tree = self.format.initialize(control)
213
tree = test.format.initialize(control)
142
214
tree.lock_write()
144
repo = tree.branch.repository
145
repo.start_write_group()
147
rev = revision.Revision('basis', timestamp=0, timezone=None,
148
message="", committer="foo@example.com")
149
basis.revision_id = 'basis'
150
create_texts_for_inv(tree.branch.repository, basis)
151
repo.add_revision('basis', rev, basis)
152
# Add a revision for the result, with the basis content -
153
# update_basis_by_delta doesn't check that the delta results in
154
# result, and we want inconsistent deltas to get called on the
155
# tree, or else the code isn't actually checked.
156
rev = revision.Revision('result', timestamp=0, timezone=None,
157
message="", committer="foo@example.com")
158
basis.revision_id = 'result'
159
repo.add_revision('result', rev, basis)
160
repo.commit_write_group()
162
repo.abort_write_group()
216
target_entries = _create_repo_revisions(tree.branch.repository, basis,
217
delta, invalid_delta)
164
218
# Set the basis state as the trees current state
165
219
tree._write_inventory(basis)
166
220
# This reads basis from the repo and puts it into the tree's local
167
221
# cache, if it has one.
168
tree.set_parent_ids(['basis'])
171
for old, new, id, entry in delta:
172
if None in (new, entry):
174
paths[new] = (entry.file_id, entry.kind)
175
parents.add(osutils.dirname(new))
176
parents = osutils.minimum_path_selection(parents)
178
# Put place holders in the tree to permit adding the other entries.
179
for pos, parent in enumerate(parents):
180
if not tree.path2id(parent):
181
# add a synthetic directory in the tree so we can can put the
182
# tree0 entries in place for dirstate.
183
tree.add([parent], ["id%d" % pos], ["directory"])
185
# Many deltas may cause this mini-apply to fail, but we want to see what
186
# the delta application code says, not the prep that we do to deal with
187
# limitations of dirstate's update_basis code.
188
for path, (file_id, kind) in sorted(paths.items()):
190
tree.add([path], [file_id], [kind])
191
except (KeyboardInterrupt, SystemExit):
222
tree.set_parent_ids([b'basis'])
197
225
# Fresh lock, reads disk again.
200
tree.update_basis_by_delta('result', delta)
226
with tree.lock_write():
227
tree.update_basis_by_delta(b'result', delta)
228
if not invalid_delta:
203
230
# reload tree - ensure we get what was written.
204
tree = tree.bzrdir.open_workingtree()
231
tree = tree.controldir.open_workingtree()
205
232
basis_tree = tree.basis_tree()
206
233
basis_tree.lock_read()
207
self.addCleanup(basis_tree.unlock)
208
# Note, that if the tree does not have a local cache, the trick above of
209
# setting the result as the basis, will come back to bite us. That said,
210
# all the implementations in bzr do have a local cache.
211
return basis_tree.inventory
214
def apply_inventory_Repository_add_inventory_by_delta(self, basis, delta):
234
test.addCleanup(basis_tree.unlock)
235
basis_inv = basis_tree.root_inventory
237
basis_entries = list(basis_inv.iter_entries_by_dir())
238
test.assertEqual(target_entries, basis_entries)
242
def apply_inventory_Repository_add_inventory_by_delta(self, basis, delta,
215
244
"""Apply delta to basis and return the result.
217
246
This inserts basis as a whole inventory and then uses
218
247
add_inventory_by_delta to add delta.
222
251
:return: An inventory resulting from the application.
224
253
format = self.format()
225
control = self.make_bzrdir('tree', format=format._matchingbzrdir)
254
control = self.make_controldir('tree', format=format._matchingcontroldir)
226
255
repo = format.initialize(control)
256
with repo.lock_write():
229
257
repo.start_write_group()
231
rev = revision.Revision('basis', timestamp=0, timezone=None,
232
message="", committer="foo@example.com")
233
basis.revision_id = 'basis'
259
rev = revision.Revision(b'basis', timestamp=0, timezone=None,
260
message="", committer="foo@example.com")
261
basis.revision_id = b'basis'
234
262
create_texts_for_inv(repo, basis)
235
repo.add_revision('basis', rev, basis)
263
repo.add_revision(b'basis', rev, basis)
236
264
repo.commit_write_group()
238
266
repo.abort_write_group()
268
with repo.lock_write():
244
269
repo.start_write_group()
246
inv_sha1 = repo.add_inventory_by_delta('basis', delta,
271
inv_sha1 = repo.add_inventory_by_delta(b'basis', delta,
272
b'result', [b'basis'])
249
274
repo.abort_write_group()
252
277
repo.commit_write_group()
255
278
# Fresh lock, reads disk again.
256
repo = repo.bzrdir.open_repository()
279
repo = repo.controldir.open_repository()
258
281
self.addCleanup(repo.unlock)
259
return repo.get_inventory('result')
282
return repo.get_inventory(b'result')
262
285
class TestInventoryUpdates(TestCase):
264
287
def test_creation_from_root_id(self):
265
288
# iff a root id is passed to the constructor, a root directory is made
266
inv = inventory.Inventory(root_id='tree-root')
289
inv = inventory.Inventory(root_id=b'tree-root')
267
290
self.assertNotEqual(None, inv.root)
268
self.assertEqual('tree-root', inv.root.file_id)
291
self.assertEqual(b'tree-root', inv.root.file_id)
270
293
def test_add_path_of_root(self):
271
294
# if no root id is given at creation time, there is no root directory
272
295
inv = inventory.Inventory(root_id=None)
273
296
self.assertIs(None, inv.root)
274
297
# add a root entry by adding its path
275
ie = inv.add_path("", "directory", "my-root")
276
ie.revision = 'test-rev'
277
self.assertEqual("my-root", ie.file_id)
298
ie = inv.add_path(u"", "directory", b"my-root")
299
ie.revision = b'test-rev'
300
self.assertEqual(b"my-root", ie.file_id)
278
301
self.assertIs(ie, inv.root)
280
303
def test_add_path(self):
281
inv = inventory.Inventory(root_id='tree_root')
282
ie = inv.add_path('hello', 'file', 'hello-id')
283
self.assertEqual('hello-id', ie.file_id)
304
inv = inventory.Inventory(root_id=b'tree_root')
305
ie = inv.add_path(u'hello', 'file', b'hello-id')
306
self.assertEqual(b'hello-id', ie.file_id)
284
307
self.assertEqual('file', ie.kind)
286
309
def test_copy(self):
287
310
"""Make sure copy() works and creates a deep copy."""
288
inv = inventory.Inventory(root_id='some-tree-root')
289
ie = inv.add_path('hello', 'file', 'hello-id')
311
inv = inventory.Inventory(root_id=b'some-tree-root')
312
ie = inv.add_path(u'hello', 'file', b'hello-id')
290
313
inv2 = inv.copy()
291
inv.root.file_id = 'some-new-root'
293
self.assertEqual('some-tree-root', inv2.root.file_id)
294
self.assertEqual('hello', inv2['hello-id'].name)
314
inv.root.file_id = b'some-new-root'
316
self.assertEqual(b'some-tree-root', inv2.root.file_id)
317
self.assertEqual(u'hello', inv2.get_entry(b'hello-id').name)
296
319
def test_copy_empty(self):
297
320
"""Make sure an empty inventory can be copied."""
360
392
def test_None_file_id(self):
361
393
inv = self.get_empty_inventory()
362
dir1 = inventory.InventoryDirectory(None, 'dir1', inv.root.file_id)
363
dir1.revision = 'result'
394
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
396
dir1.revision = b'result'
364
397
delta = [(None, u'dir1', None, dir1)]
365
398
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
368
401
def test_unicode_file_id(self):
369
402
inv = self.get_empty_inventory()
370
dir1 = inventory.InventoryDirectory(u'dirid', 'dir1', inv.root.file_id)
371
dir1.revision = 'result'
403
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
404
dir1.file_id = u'dirid'
405
dir1.revision = b'result'
372
406
delta = [(None, u'dir1', dir1.file_id, dir1)]
373
407
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
376
410
def test_repeated_file_id(self):
377
411
inv = self.get_empty_inventory()
378
file1 = inventory.InventoryFile('id', 'path1', inv.root.file_id)
379
file1.revision = 'result'
412
file1 = inventory.InventoryFile(b'id', 'path1', inv.root.file_id)
413
file1.revision = b'result'
380
414
file1.text_size = 0
382
file2 = inventory.InventoryFile('id', 'path2', inv.root.file_id)
383
file2.revision = 'result'
386
delta = [(None, u'path1', 'id', file1), (None, u'path2', 'id', file2)]
415
file1.text_sha1 = b""
418
delta = [(None, u'path1', b'id', file1),
419
(None, u'path2', b'id', file2)]
387
420
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
390
423
def test_repeated_new_path(self):
391
424
inv = self.get_empty_inventory()
392
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
393
file1.revision = 'result'
425
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
426
file1.revision = b'result'
394
427
file1.text_size = 0
396
file2 = inventory.InventoryFile('id2', 'path', inv.root.file_id)
397
file2.revision = 'result'
400
delta = [(None, u'path', 'id1', file1), (None, u'path', 'id2', file2)]
428
file1.text_sha1 = b""
430
file2.file_id = b'id2'
431
delta = [(None, u'path', b'id1', file1),
432
(None, u'path', b'id2', file2)]
401
433
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
404
436
def test_repeated_old_path(self):
405
437
inv = self.get_empty_inventory()
406
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
407
file1.revision = 'result'
438
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
439
file1.revision = b'result'
408
440
file1.text_size = 0
441
file1.text_sha1 = b""
410
442
# We can't *create* a source inventory with the same path, but
411
443
# a badly generated partial delta might claim the same source twice.
412
444
# This would be buggy in two ways: the path is repeated in the delta,
413
445
# And the path for one of the file ids doesn't match the source
414
446
# location. Alternatively, we could have a repeated fileid, but that
415
447
# is separately checked for.
416
file2 = inventory.InventoryFile('id2', 'path2', inv.root.file_id)
417
file2.revision = 'result'
448
file2 = inventory.InventoryFile(b'id2', 'path2', inv.root.file_id)
449
file2.revision = b'result'
418
450
file2.text_size = 0
451
file2.text_sha1 = b""
422
delta = [(u'path', None, 'id1', None), (u'path', None, 'id2', None)]
454
delta = [(u'path', None, b'id1', None), (u'path', None, b'id2', None)]
423
455
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
426
458
def test_mismatched_id_entry_id(self):
427
459
inv = self.get_empty_inventory()
428
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
429
file1.revision = 'result'
460
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
461
file1.revision = b'result'
430
462
file1.text_size = 0
432
delta = [(None, u'path', 'id', file1)]
463
file1.text_sha1 = b""
464
delta = [(None, u'path', b'id', file1)]
433
465
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
436
468
def test_mismatched_new_path_entry_None(self):
437
469
inv = self.get_empty_inventory()
438
delta = [(None, u'path', 'id', None)]
470
delta = [(None, u'path', b'id', None)]
439
471
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
442
474
def test_mismatched_new_path_None_entry(self):
443
475
inv = self.get_empty_inventory()
444
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
445
file1.revision = 'result'
476
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
477
file1.revision = b'result'
446
478
file1.text_size = 0
448
delta = [(u"path", None, 'id1', file1)]
479
file1.text_sha1 = b""
480
delta = [(u"path", None, b'id1', file1)]
449
481
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
452
484
def test_parent_is_not_directory(self):
453
485
inv = self.get_empty_inventory()
454
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
455
file1.revision = 'result'
486
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
487
file1.revision = b'result'
456
488
file1.text_size = 0
458
file2 = inventory.InventoryFile('id2', 'path2', 'id1')
459
file2.revision = 'result'
489
file1.text_sha1 = b""
490
file2 = inventory.InventoryFile(b'id2', 'path2', b'id1')
491
file2.revision = b'result'
460
492
file2.text_size = 0
493
file2.text_sha1 = b""
463
delta = [(None, u'path/path2', 'id2', file2)]
495
delta = [(None, u'path/path2', b'id2', file2)]
464
496
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
467
499
def test_parent_is_missing(self):
468
500
inv = self.get_empty_inventory()
469
file2 = inventory.InventoryFile('id2', 'path2', 'missingparent')
470
file2.revision = 'result'
501
file2 = inventory.InventoryFile(b'id2', 'path2', b'missingparent')
502
file2.revision = b'result'
471
503
file2.text_size = 0
473
delta = [(None, u'path/path2', 'id2', file2)]
504
file2.text_sha1 = b""
505
delta = [(None, u'path/path2', b'id2', file2)]
474
506
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
477
509
def test_new_parent_path_has_wrong_id(self):
478
510
inv = self.get_empty_inventory()
479
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
480
parent1.revision = 'result'
481
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
482
parent2.revision = 'result'
483
file1 = inventory.InventoryFile('id', 'path', 'p-2')
484
file1.revision = 'result'
511
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
512
parent1.revision = b'result'
513
parent2 = inventory.InventoryDirectory(
514
b'p-2', 'dir2', inv.root.file_id)
515
parent2.revision = b'result'
516
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
517
file1.revision = b'result'
485
518
file1.text_size = 0
519
file1.text_sha1 = b""
489
522
# This delta claims that file1 is at dir/path, but actually its at
490
523
# dir2/path if you follow the inventory parent structure.
491
delta = [(None, u'dir/path', 'id', file1)]
524
delta = [(None, u'dir/path', b'id', file1)]
492
525
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
495
528
def test_old_parent_path_is_wrong(self):
496
529
inv = self.get_empty_inventory()
497
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
498
parent1.revision = 'result'
499
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
500
parent2.revision = 'result'
501
file1 = inventory.InventoryFile('id', 'path', 'p-2')
502
file1.revision = 'result'
530
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
531
parent1.revision = b'result'
532
parent2 = inventory.InventoryDirectory(
533
b'p-2', 'dir2', inv.root.file_id)
534
parent2.revision = b'result'
535
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
536
file1.revision = b'result'
503
537
file1.text_size = 0
538
file1.text_sha1 = b""
508
542
# This delta claims that file1 was at dir/path, but actually it was at
509
543
# dir2/path if you follow the inventory parent structure.
510
delta = [(u'dir/path', None, 'id', None)]
544
delta = [(u'dir/path', None, b'id', None)]
511
545
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
514
548
def test_old_parent_path_is_for_other_id(self):
515
549
inv = self.get_empty_inventory()
516
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
517
parent1.revision = 'result'
518
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
519
parent2.revision = 'result'
520
file1 = inventory.InventoryFile('id', 'path', 'p-2')
521
file1.revision = 'result'
550
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
551
parent1.revision = b'result'
552
parent2 = inventory.InventoryDirectory(
553
b'p-2', 'dir2', inv.root.file_id)
554
parent2.revision = b'result'
555
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
556
file1.revision = b'result'
522
557
file1.text_size = 0
524
file2 = inventory.InventoryFile('id2', 'path', 'p-1')
525
file2.revision = 'result'
558
file1.text_sha1 = b""
559
file2 = inventory.InventoryFile(b'id2', 'path', b'p-1')
560
file2.revision = b'result'
526
561
file2.text_size = 0
562
file2.text_sha1 = b""
532
567
# This delta claims that file1 was at dir/path, but actually it was at
533
568
# dir2/path if you follow the inventory parent structure. At dir/path
534
569
# is another entry we should not delete.
535
delta = [(u'dir/path', None, 'id', None)]
570
delta = [(u'dir/path', None, b'id', None)]
536
571
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
539
574
def test_add_existing_id_new_path(self):
540
575
inv = self.get_empty_inventory()
541
parent1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
542
parent1.revision = 'result'
543
parent2 = inventory.InventoryDirectory('p-1', 'dir2', inv.root.file_id)
544
parent2.revision = 'result'
576
parent1 = inventory.InventoryDirectory(
577
b'p-1', 'dir1', inv.root.file_id)
578
parent1.revision = b'result'
579
parent2 = inventory.InventoryDirectory(
580
b'p-1', 'dir2', inv.root.file_id)
581
parent2.revision = b'result'
546
delta = [(None, u'dir2', 'p-1', parent2)]
583
delta = [(None, u'dir2', b'p-1', parent2)]
547
584
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
550
587
def test_add_new_id_existing_path(self):
551
588
inv = self.get_empty_inventory()
552
parent1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
553
parent1.revision = 'result'
554
parent2 = inventory.InventoryDirectory('p-2', 'dir1', inv.root.file_id)
555
parent2.revision = 'result'
589
parent1 = inventory.InventoryDirectory(
590
b'p-1', 'dir1', inv.root.file_id)
591
parent1.revision = b'result'
592
parent2 = inventory.InventoryDirectory(
593
b'p-2', 'dir1', inv.root.file_id)
594
parent2.revision = b'result'
557
delta = [(None, u'dir1', 'p-2', parent2)]
596
delta = [(None, u'dir1', b'p-2', parent2)]
558
597
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
561
600
def test_remove_dir_leaving_dangling_child(self):
562
601
inv = self.get_empty_inventory()
563
dir1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
564
dir1.revision = 'result'
565
dir2 = inventory.InventoryDirectory('p-2', 'child1', 'p-1')
566
dir2.revision = 'result'
567
dir3 = inventory.InventoryDirectory('p-3', 'child2', 'p-1')
568
dir3.revision = 'result'
602
dir1 = inventory.InventoryDirectory(b'p-1', 'dir1', inv.root.file_id)
603
dir1.revision = b'result'
604
dir2 = inventory.InventoryDirectory(b'p-2', 'child1', b'p-1')
605
dir2.revision = b'result'
606
dir3 = inventory.InventoryDirectory(b'p-3', 'child2', b'p-1')
607
dir3.revision = b'result'
572
delta = [(u'dir1', None, 'p-1', None),
573
(u'dir1/child2', None, 'p-3', None)]
611
delta = [(u'dir1', None, b'p-1', None),
612
(u'dir1/child2', None, b'p-3', None)]
574
613
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
578
class TestInventory(TestCase):
616
def test_add_file(self):
617
inv = self.get_empty_inventory()
618
file1 = inventory.InventoryFile(b'file-id', 'path', inv.root.file_id)
619
file1.revision = b'result'
621
file1.text_sha1 = b''
622
delta = [(None, u'path', b'file-id', file1)]
623
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
624
self.assertEqual(b'file-id', res_inv.get_entry(b'file-id').file_id)
626
def test_remove_file(self):
627
inv = self.get_empty_inventory()
628
file1 = inventory.InventoryFile(b'file-id', 'path', inv.root.file_id)
629
file1.revision = b'result'
631
file1.text_sha1 = b''
633
delta = [(u'path', None, b'file-id', None)]
634
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
635
self.assertEqual(None, res_inv.path2id('path'))
636
self.assertRaises(errors.NoSuchId, res_inv.id2path, b'file-id')
638
def test_rename_file(self):
639
inv = self.get_empty_inventory()
640
file1 = self.make_file_ie(name='path', parent_id=inv.root.file_id)
642
file2 = self.make_file_ie(name='path2', parent_id=inv.root.file_id)
643
delta = [(u'path', 'path2', b'file-id', file2)]
644
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
645
self.assertEqual(None, res_inv.path2id('path'))
646
self.assertEqual(b'file-id', res_inv.path2id('path2'))
648
def test_replaced_at_new_path(self):
649
inv = self.get_empty_inventory()
650
file1 = self.make_file_ie(file_id=b'id1', parent_id=inv.root.file_id)
652
file2 = self.make_file_ie(file_id=b'id2', parent_id=inv.root.file_id)
653
delta = [(u'name', None, b'id1', None),
654
(None, u'name', b'id2', file2)]
655
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
656
self.assertEqual(b'id2', res_inv.path2id('name'))
658
def test_rename_dir(self):
659
inv = self.get_empty_inventory()
660
dir1 = inventory.InventoryDirectory(
661
b'dir-id', 'dir1', inv.root.file_id)
662
dir1.revision = b'basis'
663
file1 = self.make_file_ie(parent_id=b'dir-id')
666
dir2 = inventory.InventoryDirectory(
667
b'dir-id', 'dir2', inv.root.file_id)
668
dir2.revision = b'result'
669
delta = [('dir1', 'dir2', b'dir-id', dir2)]
670
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
671
# The file should be accessible under the new path
672
self.assertEqual(b'file-id', res_inv.path2id('dir2/name'))
674
def test_renamed_dir_with_renamed_child(self):
675
inv = self.get_empty_inventory()
676
dir1 = inventory.InventoryDirectory(
677
b'dir-id', 'dir1', inv.root.file_id)
678
dir1.revision = b'basis'
679
file1 = self.make_file_ie(b'file-id-1', 'name1', parent_id=b'dir-id')
680
file2 = self.make_file_ie(b'file-id-2', 'name2', parent_id=b'dir-id')
684
dir2 = inventory.InventoryDirectory(
685
b'dir-id', 'dir2', inv.root.file_id)
686
dir2.revision = b'result'
687
file2b = self.make_file_ie(b'file-id-2', 'name2', inv.root.file_id)
688
delta = [('dir1', 'dir2', b'dir-id', dir2),
689
('dir1/name2', 'name2', b'file-id-2', file2b)]
690
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
691
# The file should be accessible under the new path
692
self.assertEqual(b'file-id-1', res_inv.path2id('dir2/name1'))
693
self.assertEqual(None, res_inv.path2id('dir2/name2'))
694
self.assertEqual(b'file-id-2', res_inv.path2id('name2'))
580
696
def test_is_root(self):
581
697
"""Ensure our root-checking code is accurate."""
582
inv = inventory.Inventory('TREE_ROOT')
583
self.assertTrue(inv.is_root('TREE_ROOT'))
584
self.assertFalse(inv.is_root('booga'))
585
inv.root.file_id = 'booga'
586
self.assertFalse(inv.is_root('TREE_ROOT'))
587
self.assertTrue(inv.is_root('booga'))
698
inv = inventory.Inventory(b'TREE_ROOT')
699
self.assertTrue(inv.is_root(b'TREE_ROOT'))
700
self.assertFalse(inv.is_root(b'booga'))
701
inv.root.file_id = b'booga'
702
self.assertFalse(inv.is_root(b'TREE_ROOT'))
703
self.assertTrue(inv.is_root(b'booga'))
588
704
# works properly even if no root is set
590
self.assertFalse(inv.is_root('TREE_ROOT'))
591
self.assertFalse(inv.is_root('booga'))
706
self.assertFalse(inv.is_root(b'TREE_ROOT'))
707
self.assertFalse(inv.is_root(b'booga'))
709
def test_entries_for_empty_inventory(self):
710
"""Test that entries() will not fail for an empty inventory"""
711
inv = Inventory(root_id=None)
712
self.assertEqual([], inv.entries())
594
715
class TestInventoryEntry(TestCase):
717
def test_file_invalid_entry_name(self):
718
self.assertRaises(errors.InvalidEntryName, inventory.InventoryFile,
719
b'123', 'a/hello.c', ROOT_ID)
721
def test_file_backslash(self):
722
file = inventory.InventoryFile(b'123', 'h\\ello.c', ROOT_ID)
723
self.assertEquals(file.name, 'h\\ello.c')
596
725
def test_file_kind_character(self):
597
file = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
726
file = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
598
727
self.assertEqual(file.kind_character(), '')
600
729
def test_dir_kind_character(self):
601
dir = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
730
dir = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
602
731
self.assertEqual(dir.kind_character(), '/')
604
733
def test_link_kind_character(self):
605
dir = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
734
dir = inventory.InventoryLink(b'123', 'hello.c', ROOT_ID)
606
735
self.assertEqual(dir.kind_character(), '')
608
737
def test_dir_detect_changes(self):
609
left = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
611
left.executable = True
612
left.symlink_target='foo'
613
right = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
614
right.text_sha1 = 321
615
right.symlink_target='bar'
738
left = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
739
right = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
616
740
self.assertEqual((False, False), left.detect_changes(right))
617
741
self.assertEqual((False, False), right.detect_changes(left))
619
743
def test_file_detect_changes(self):
620
left = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
744
left = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
621
745
left.text_sha1 = 123
622
right = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
746
right = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
623
747
right.text_sha1 = 123
624
748
self.assertEqual((False, False), left.detect_changes(right))
625
749
self.assertEqual((False, False), right.detect_changes(left))
748
869
def read_bytes(self, chk_bytes, key):
749
870
stream = chk_bytes.get_record_stream([key], 'unordered', True)
750
return stream.next().get_bytes_as("fulltext")
871
return next(stream).get_bytes_as("fulltext")
752
873
def test_deserialise_gives_CHKInventory(self):
753
874
inv = Inventory()
754
inv.revision_id = "revid"
755
inv.root.revision = "rootrev"
875
inv.revision_id = b"revid"
876
inv.root.revision = b"rootrev"
756
877
chk_bytes = self.get_chk_bytes()
757
878
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
758
bytes = ''.join(chk_inv.to_lines())
759
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
760
self.assertEqual("revid", new_inv.revision_id)
879
bytes = b''.join(chk_inv.to_lines())
880
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
881
self.assertEqual(b"revid", new_inv.revision_id)
761
882
self.assertEqual("directory", new_inv.root.kind)
762
883
self.assertEqual(inv.root.file_id, new_inv.root.file_id)
763
884
self.assertEqual(inv.root.parent_id, new_inv.root.parent_id)
764
885
self.assertEqual(inv.root.name, new_inv.root.name)
765
self.assertEqual("rootrev", new_inv.root.revision)
766
self.assertEqual('plain', new_inv._search_key_name)
886
self.assertEqual(b"rootrev", new_inv.root.revision)
887
self.assertEqual(b'plain', new_inv._search_key_name)
768
889
def test_deserialise_wrong_revid(self):
769
890
inv = Inventory()
770
inv.revision_id = "revid"
771
inv.root.revision = "rootrev"
891
inv.revision_id = b"revid"
892
inv.root.revision = b"rootrev"
772
893
chk_bytes = self.get_chk_bytes()
773
894
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
774
bytes = ''.join(chk_inv.to_lines())
895
bytes = b''.join(chk_inv.to_lines())
775
896
self.assertRaises(ValueError, CHKInventory.deserialise, chk_bytes,
778
899
def test_captures_rev_root_byid(self):
779
900
inv = Inventory()
780
inv.revision_id = "foo"
781
inv.root.revision = "bar"
901
inv.revision_id = b"foo"
902
inv.root.revision = b"bar"
782
903
chk_bytes = self.get_chk_bytes()
783
904
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
784
905
lines = chk_inv.to_lines()
785
906
self.assertEqual([
787
'revision_id: foo\n',
788
'root_id: TREE_ROOT\n',
789
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
790
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
908
b'revision_id: foo\n',
909
b'root_id: TREE_ROOT\n',
910
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
911
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
792
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
793
self.assertEqual('plain', chk_inv._search_key_name)
913
chk_inv = CHKInventory.deserialise(
914
chk_bytes, b''.join(lines), (b'foo',))
915
self.assertEqual(b'plain', chk_inv._search_key_name)
795
917
def test_captures_parent_id_basename_index(self):
796
918
inv = Inventory()
797
inv.revision_id = "foo"
798
inv.root.revision = "bar"
919
inv.revision_id = b"foo"
920
inv.root.revision = b"bar"
799
921
chk_bytes = self.get_chk_bytes()
800
922
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
801
923
lines = chk_inv.to_lines()
802
924
self.assertEqual([
804
'revision_id: foo\n',
805
'root_id: TREE_ROOT\n',
806
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
807
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
926
b'revision_id: foo\n',
927
b'root_id: TREE_ROOT\n',
928
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
929
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
809
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
810
self.assertEqual('plain', chk_inv._search_key_name)
931
chk_inv = CHKInventory.deserialise(
932
chk_bytes, b''.join(lines), (b'foo',))
933
self.assertEqual(b'plain', chk_inv._search_key_name)
812
935
def test_captures_search_key_name(self):
813
936
inv = Inventory()
814
inv.revision_id = "foo"
815
inv.root.revision = "bar"
937
inv.revision_id = b"foo"
938
inv.root.revision = b"bar"
816
939
chk_bytes = self.get_chk_bytes()
817
940
chk_inv = CHKInventory.from_inventory(chk_bytes, inv,
818
search_key_name='hash-16-way')
941
search_key_name=b'hash-16-way')
819
942
lines = chk_inv.to_lines()
820
943
self.assertEqual([
822
'search_key_name: hash-16-way\n',
823
'root_id: TREE_ROOT\n',
824
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
825
'revision_id: foo\n',
826
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
945
b'search_key_name: hash-16-way\n',
946
b'root_id: TREE_ROOT\n',
947
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
948
b'revision_id: foo\n',
949
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
828
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
829
self.assertEqual('hash-16-way', chk_inv._search_key_name)
951
chk_inv = CHKInventory.deserialise(
952
chk_bytes, b''.join(lines), (b'foo',))
953
self.assertEqual(b'hash-16-way', chk_inv._search_key_name)
831
955
def test_directory_children_on_demand(self):
832
956
inv = Inventory()
833
inv.revision_id = "revid"
834
inv.root.revision = "rootrev"
835
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
836
inv["fileid"].revision = "filerev"
837
inv["fileid"].executable = True
838
inv["fileid"].text_sha1 = "ffff"
839
inv["fileid"].text_size = 1
957
inv.revision_id = b"revid"
958
inv.root.revision = b"rootrev"
959
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
960
inv.get_entry(b"fileid").revision = b"filerev"
961
inv.get_entry(b"fileid").executable = True
962
inv.get_entry(b"fileid").text_sha1 = b"ffff"
963
inv.get_entry(b"fileid").text_size = 1
840
964
chk_bytes = self.get_chk_bytes()
841
965
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
842
bytes = ''.join(chk_inv.to_lines())
843
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
844
root_entry = new_inv[inv.root.file_id]
966
bytes = b''.join(chk_inv.to_lines())
967
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
968
root_entry = new_inv.get_entry(inv.root.file_id)
845
969
self.assertEqual(None, root_entry._children)
846
self.assertEqual(['file'], root_entry.children.keys())
847
file_direct = new_inv["fileid"]
970
self.assertEqual({'file'}, set(root_entry.children))
971
file_direct = new_inv.get_entry(b"fileid")
848
972
file_found = root_entry.children['file']
849
973
self.assertEqual(file_direct.kind, file_found.kind)
850
974
self.assertEqual(file_direct.file_id, file_found.file_id)
870
994
self.assertEqual(120, p_id_basename._root_node.maximum_size)
871
995
self.assertEqual(2, p_id_basename._root_node._key_width)
873
def test___iter__(self):
997
def test_iter_all_ids(self):
874
998
inv = Inventory()
875
inv.revision_id = "revid"
876
inv.root.revision = "rootrev"
877
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
878
inv["fileid"].revision = "filerev"
879
inv["fileid"].executable = True
880
inv["fileid"].text_sha1 = "ffff"
881
inv["fileid"].text_size = 1
999
inv.revision_id = b"revid"
1000
inv.root.revision = b"rootrev"
1001
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1002
inv.get_entry(b"fileid").revision = b"filerev"
1003
inv.get_entry(b"fileid").executable = True
1004
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1005
inv.get_entry(b"fileid").text_size = 1
882
1006
chk_bytes = self.get_chk_bytes()
883
1007
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
884
bytes = ''.join(chk_inv.to_lines())
885
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
886
fileids = list(new_inv.__iter__())
888
self.assertEqual([inv.root.file_id, "fileid"], fileids)
1008
bytes = b''.join(chk_inv.to_lines())
1009
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1010
fileids = sorted(new_inv.iter_all_ids())
1011
self.assertEqual([inv.root.file_id, b"fileid"], fileids)
890
1013
def test__len__(self):
891
1014
inv = Inventory()
892
inv.revision_id = "revid"
893
inv.root.revision = "rootrev"
894
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
895
inv["fileid"].revision = "filerev"
896
inv["fileid"].executable = True
897
inv["fileid"].text_sha1 = "ffff"
898
inv["fileid"].text_size = 1
1015
inv.revision_id = b"revid"
1016
inv.root.revision = b"rootrev"
1017
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1018
inv.get_entry(b"fileid").revision = b"filerev"
1019
inv.get_entry(b"fileid").executable = True
1020
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1021
inv.get_entry(b"fileid").text_size = 1
899
1022
chk_bytes = self.get_chk_bytes()
900
1023
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
901
1024
self.assertEqual(2, len(chk_inv))
903
def test___getitem__(self):
1026
def test_get_entry(self):
904
1027
inv = Inventory()
905
inv.revision_id = "revid"
906
inv.root.revision = "rootrev"
907
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
908
inv["fileid"].revision = "filerev"
909
inv["fileid"].executable = True
910
inv["fileid"].text_sha1 = "ffff"
911
inv["fileid"].text_size = 1
1028
inv.revision_id = b"revid"
1029
inv.root.revision = b"rootrev"
1030
inv.add(InventoryFile(b"fileid", u"file", inv.root.file_id))
1031
inv.get_entry(b"fileid").revision = b"filerev"
1032
inv.get_entry(b"fileid").executable = True
1033
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1034
inv.get_entry(b"fileid").text_size = 1
912
1035
chk_bytes = self.get_chk_bytes()
913
1036
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
914
bytes = ''.join(chk_inv.to_lines())
915
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
916
root_entry = new_inv[inv.root.file_id]
917
file_entry = new_inv["fileid"]
1037
data = b''.join(chk_inv.to_lines())
1038
new_inv = CHKInventory.deserialise(chk_bytes, data, (b"revid",))
1039
root_entry = new_inv.get_entry(inv.root.file_id)
1040
file_entry = new_inv.get_entry(b"fileid")
918
1041
self.assertEqual("directory", root_entry.kind)
919
1042
self.assertEqual(inv.root.file_id, root_entry.file_id)
920
1043
self.assertEqual(inv.root.parent_id, root_entry.parent_id)
921
1044
self.assertEqual(inv.root.name, root_entry.name)
922
self.assertEqual("rootrev", root_entry.revision)
1045
self.assertEqual(b"rootrev", root_entry.revision)
923
1046
self.assertEqual("file", file_entry.kind)
924
self.assertEqual("fileid", file_entry.file_id)
1047
self.assertEqual(b"fileid", file_entry.file_id)
925
1048
self.assertEqual(inv.root.file_id, file_entry.parent_id)
926
self.assertEqual("file", file_entry.name)
927
self.assertEqual("filerev", file_entry.revision)
928
self.assertEqual("ffff", file_entry.text_sha1)
1049
self.assertEqual(u"file", file_entry.name)
1050
self.assertEqual(b"filerev", file_entry.revision)
1051
self.assertEqual(b"ffff", file_entry.text_sha1)
929
1052
self.assertEqual(1, file_entry.text_size)
930
1053
self.assertEqual(True, file_entry.executable)
931
self.assertRaises(errors.NoSuchId, new_inv.__getitem__, 'missing')
1054
self.assertRaises(errors.NoSuchId, new_inv.get_entry, 'missing')
933
1056
def test_has_id_true(self):
934
1057
inv = Inventory()
935
inv.revision_id = "revid"
936
inv.root.revision = "rootrev"
937
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
938
inv["fileid"].revision = "filerev"
939
inv["fileid"].executable = True
940
inv["fileid"].text_sha1 = "ffff"
941
inv["fileid"].text_size = 1
1058
inv.revision_id = b"revid"
1059
inv.root.revision = b"rootrev"
1060
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1061
inv.get_entry(b"fileid").revision = b"filerev"
1062
inv.get_entry(b"fileid").executable = True
1063
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1064
inv.get_entry(b"fileid").text_size = 1
942
1065
chk_bytes = self.get_chk_bytes()
943
1066
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
944
self.assertTrue(chk_inv.has_id('fileid'))
1067
self.assertTrue(chk_inv.has_id(b'fileid'))
945
1068
self.assertTrue(chk_inv.has_id(inv.root.file_id))
947
1070
def test_has_id_not(self):
948
1071
inv = Inventory()
949
inv.revision_id = "revid"
950
inv.root.revision = "rootrev"
1072
inv.revision_id = b"revid"
1073
inv.root.revision = b"rootrev"
951
1074
chk_bytes = self.get_chk_bytes()
952
1075
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
953
self.assertFalse(chk_inv.has_id('fileid'))
1076
self.assertFalse(chk_inv.has_id(b'fileid'))
955
1078
def test_id2path(self):
956
1079
inv = Inventory()
957
inv.revision_id = "revid"
958
inv.root.revision = "rootrev"
959
direntry = InventoryDirectory("dirid", "dir", inv.root.file_id)
960
fileentry = InventoryFile("fileid", "file", "dirid")
1080
inv.revision_id = b"revid"
1081
inv.root.revision = b"rootrev"
1082
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1083
fileentry = InventoryFile(b"fileid", "file", b"dirid")
961
1084
inv.add(direntry)
962
1085
inv.add(fileentry)
963
inv["fileid"].revision = "filerev"
964
inv["fileid"].executable = True
965
inv["fileid"].text_sha1 = "ffff"
966
inv["fileid"].text_size = 1
967
inv["dirid"].revision = "filerev"
1086
inv.get_entry(b"fileid").revision = b"filerev"
1087
inv.get_entry(b"fileid").executable = True
1088
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1089
inv.get_entry(b"fileid").text_size = 1
1090
inv.get_entry(b"dirid").revision = b"filerev"
968
1091
chk_bytes = self.get_chk_bytes()
969
1092
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
970
bytes = ''.join(chk_inv.to_lines())
971
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1093
bytes = b''.join(chk_inv.to_lines())
1094
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
972
1095
self.assertEqual('', new_inv.id2path(inv.root.file_id))
973
self.assertEqual('dir', new_inv.id2path('dirid'))
974
self.assertEqual('dir/file', new_inv.id2path('fileid'))
1096
self.assertEqual('dir', new_inv.id2path(b'dirid'))
1097
self.assertEqual('dir/file', new_inv.id2path(b'fileid'))
976
1099
def test_path2id(self):
977
1100
inv = Inventory()
978
inv.revision_id = "revid"
979
inv.root.revision = "rootrev"
980
direntry = InventoryDirectory("dirid", "dir", inv.root.file_id)
981
fileentry = InventoryFile("fileid", "file", "dirid")
1101
inv.revision_id = b"revid"
1102
inv.root.revision = b"rootrev"
1103
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1104
fileentry = InventoryFile(b"fileid", "file", b"dirid")
982
1105
inv.add(direntry)
983
1106
inv.add(fileentry)
984
inv["fileid"].revision = "filerev"
985
inv["fileid"].executable = True
986
inv["fileid"].text_sha1 = "ffff"
987
inv["fileid"].text_size = 1
988
inv["dirid"].revision = "filerev"
1107
inv.get_entry(b"fileid").revision = b"filerev"
1108
inv.get_entry(b"fileid").executable = True
1109
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1110
inv.get_entry(b"fileid").text_size = 1
1111
inv.get_entry(b"dirid").revision = b"filerev"
989
1112
chk_bytes = self.get_chk_bytes()
990
1113
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
991
bytes = ''.join(chk_inv.to_lines())
992
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1114
bytes = b''.join(chk_inv.to_lines())
1115
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
993
1116
self.assertEqual(inv.root.file_id, new_inv.path2id(''))
994
self.assertEqual('dirid', new_inv.path2id('dir'))
995
self.assertEqual('fileid', new_inv.path2id('dir/file'))
1117
self.assertEqual(b'dirid', new_inv.path2id('dir'))
1118
self.assertEqual(b'fileid', new_inv.path2id('dir/file'))
997
1120
def test_create_by_apply_delta_sets_root(self):
998
1121
inv = Inventory()
999
inv.revision_id = "revid"
1122
inv.root.revision = b"myrootrev"
1123
inv.revision_id = b"revid"
1000
1124
chk_bytes = self.get_chk_bytes()
1001
1125
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1002
inv.add_path("", "directory", "myrootid", None)
1003
inv.revision_id = "expectedid"
1126
inv.add_path("", "directory", b"myrootid", None)
1127
inv.revision_id = b"expectedid"
1128
inv.root.revision = b"myrootrev"
1004
1129
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1005
1130
delta = [("", None, base_inv.root.file_id, None),
1006
(None, "", "myrootid", inv.root)]
1007
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1008
self.assertEquals(reference_inv.root, new_inv.root)
1131
(None, "", b"myrootid", inv.root)]
1132
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1133
self.assertEqual(reference_inv.root, new_inv.root)
1010
1135
def test_create_by_apply_delta_empty_add_child(self):
1011
1136
inv = Inventory()
1012
inv.revision_id = "revid"
1013
inv.root.revision = "rootrev"
1137
inv.revision_id = b"revid"
1138
inv.root.revision = b"rootrev"
1014
1139
chk_bytes = self.get_chk_bytes()
1015
1140
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1016
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1017
a_entry.revision = "filerev"
1141
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1142
a_entry.revision = b"filerev"
1018
1143
a_entry.executable = True
1019
a_entry.text_sha1 = "ffff"
1144
a_entry.text_sha1 = b"ffff"
1020
1145
a_entry.text_size = 1
1021
1146
inv.add(a_entry)
1022
inv.revision_id = "expectedid"
1147
inv.revision_id = b"expectedid"
1023
1148
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1024
delta = [(None, "A", "A-id", a_entry)]
1025
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1149
delta = [(None, "A", b"A-id", a_entry)]
1150
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1026
1151
# new_inv should be the same as reference_inv.
1027
1152
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1028
1153
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1029
1154
reference_inv.id_to_entry._ensure_root()
1030
1155
new_inv.id_to_entry._ensure_root()
1031
1156
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1032
new_inv.id_to_entry._root_node._key)
1157
new_inv.id_to_entry._root_node._key)
1034
1159
def test_create_by_apply_delta_empty_add_child_updates_parent_id(self):
1035
1160
inv = Inventory()
1036
inv.revision_id = "revid"
1037
inv.root.revision = "rootrev"
1161
inv.revision_id = b"revid"
1162
inv.root.revision = b"rootrev"
1038
1163
chk_bytes = self.get_chk_bytes()
1039
1164
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1040
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1041
a_entry.revision = "filerev"
1165
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1166
a_entry.revision = b"filerev"
1042
1167
a_entry.executable = True
1043
a_entry.text_sha1 = "ffff"
1168
a_entry.text_sha1 = b"ffff"
1044
1169
a_entry.text_size = 1
1045
1170
inv.add(a_entry)
1046
inv.revision_id = "expectedid"
1171
inv.revision_id = b"expectedid"
1047
1172
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1048
delta = [(None, "A", "A-id", a_entry)]
1049
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1173
delta = [(None, "A", b"A-id", a_entry)]
1174
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1050
1175
reference_inv.id_to_entry._ensure_root()
1051
1176
reference_inv.parent_id_basename_to_file_id._ensure_root()
1052
1177
new_inv.id_to_entry._ensure_root()
1055
1180
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1056
1181
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1057
1182
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1058
new_inv.id_to_entry._root_node._key)
1183
new_inv.id_to_entry._root_node._key)
1059
1184
self.assertEqual(reference_inv.parent_id_basename_to_file_id._root_node._key,
1060
new_inv.parent_id_basename_to_file_id._root_node._key)
1185
new_inv.parent_id_basename_to_file_id._root_node._key)
1062
1187
def test_iter_changes(self):
1063
1188
# Low level bootstrapping smoke test; comprehensive generic tests via
1064
1189
# InterTree are coming.
1065
1190
inv = Inventory()
1066
inv.revision_id = "revid"
1067
inv.root.revision = "rootrev"
1068
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1069
inv["fileid"].revision = "filerev"
1070
inv["fileid"].executable = True
1071
inv["fileid"].text_sha1 = "ffff"
1072
inv["fileid"].text_size = 1
1191
inv.revision_id = b"revid"
1192
inv.root.revision = b"rootrev"
1193
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1194
inv.get_entry(b"fileid").revision = b"filerev"
1195
inv.get_entry(b"fileid").executable = True
1196
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1197
inv.get_entry(b"fileid").text_size = 1
1073
1198
inv2 = Inventory()
1074
inv2.revision_id = "revid2"
1075
inv2.root.revision = "rootrev"
1076
inv2.add(InventoryFile("fileid", "file", inv.root.file_id))
1077
inv2["fileid"].revision = "filerev2"
1078
inv2["fileid"].executable = False
1079
inv2["fileid"].text_sha1 = "bbbb"
1080
inv2["fileid"].text_size = 2
1199
inv2.revision_id = b"revid2"
1200
inv2.root.revision = b"rootrev"
1201
inv2.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1202
inv2.get_entry(b"fileid").revision = b"filerev2"
1203
inv2.get_entry(b"fileid").executable = False
1204
inv2.get_entry(b"fileid").text_sha1 = b"bbbb"
1205
inv2.get_entry(b"fileid").text_size = 2
1081
1206
# get fresh objects.
1082
1207
chk_bytes = self.get_chk_bytes()
1083
1208
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1084
bytes = ''.join(chk_inv.to_lines())
1085
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1209
bytes = b''.join(chk_inv.to_lines())
1210
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1086
1211
chk_inv2 = CHKInventory.from_inventory(chk_bytes, inv2)
1087
bytes = ''.join(chk_inv2.to_lines())
1088
inv_2 = CHKInventory.deserialise(chk_bytes, bytes, ("revid2",))
1089
self.assertEqual([('fileid', (u'file', u'file'), True, (True, True),
1090
('TREE_ROOT', 'TREE_ROOT'), (u'file', u'file'), ('file', 'file'),
1092
list(inv_1.iter_changes(inv_2)))
1212
bytes = b''.join(chk_inv2.to_lines())
1213
inv_2 = CHKInventory.deserialise(chk_bytes, bytes, (b"revid2",))
1214
self.assertEqual([(b'fileid', (u'file', u'file'), True, (True, True),
1215
(b'TREE_ROOT', b'TREE_ROOT'), (u'file',
1216
u'file'), ('file', 'file'),
1218
list(inv_1.iter_changes(inv_2)))
1094
1220
def test_parent_id_basename_to_file_id_index_enabled(self):
1095
1221
inv = Inventory()
1096
inv.revision_id = "revid"
1097
inv.root.revision = "rootrev"
1098
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1099
inv["fileid"].revision = "filerev"
1100
inv["fileid"].executable = True
1101
inv["fileid"].text_sha1 = "ffff"
1102
inv["fileid"].text_size = 1
1222
inv.revision_id = b"revid"
1223
inv.root.revision = b"rootrev"
1224
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1225
inv.get_entry(b"fileid").revision = b"filerev"
1226
inv.get_entry(b"fileid").executable = True
1227
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1228
inv.get_entry(b"fileid").text_size = 1
1103
1229
# get fresh objects.
1104
1230
chk_bytes = self.get_chk_bytes()
1105
1231
tmp_inv = CHKInventory.from_inventory(chk_bytes, inv)
1106
bytes = ''.join(tmp_inv.to_lines())
1107
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1108
self.assertIsInstance(chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1232
bytes = b''.join(tmp_inv.to_lines())
1233
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1234
self.assertIsInstance(
1235
chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1109
1236
self.assertEqual(
1110
{('', ''): 'TREE_ROOT', ('TREE_ROOT', 'file'): 'fileid'},
1237
{(b'', b''): b'TREE_ROOT', (b'TREE_ROOT', b'file'): b'fileid'},
1111
1238
dict(chk_inv.parent_id_basename_to_file_id.iteritems()))
1113
1240
def test_file_entry_to_bytes(self):
1114
1241
inv = CHKInventory(None)
1115
ie = inventory.InventoryFile('file-id', 'filename', 'parent-id')
1242
ie = inventory.InventoryFile(b'file-id', 'filename', b'parent-id')
1116
1243
ie.executable = True
1117
ie.revision = 'file-rev-id'
1118
ie.text_sha1 = 'abcdefgh'
1244
ie.revision = b'file-rev-id'
1245
ie.text_sha1 = b'abcdefgh'
1119
1246
ie.text_size = 100
1120
1247
bytes = inv._entry_to_bytes(ie)
1121
self.assertEqual('file: file-id\nparent-id\nfilename\n'
1122
'file-rev-id\nabcdefgh\n100\nY', bytes)
1248
self.assertEqual(b'file: file-id\nparent-id\nfilename\n'
1249
b'file-rev-id\nabcdefgh\n100\nY', bytes)
1123
1250
ie2 = inv._bytes_to_entry(bytes)
1124
1251
self.assertEqual(ie, ie2)
1125
self.assertIsInstance(ie2.name, unicode)
1126
self.assertEqual(('filename', 'file-id', 'file-rev-id'),
1252
self.assertIsInstance(ie2.name, text_type)
1253
self.assertEqual((b'filename', b'file-id', b'file-rev-id'),
1127
1254
inv._bytes_to_utf8name_key(bytes))
1129
1256
def test_file2_entry_to_bytes(self):
1130
1257
inv = CHKInventory(None)
1131
1258
# \u30a9 == 'omega'
1132
ie = inventory.InventoryFile('file-id', u'\u03a9name', 'parent-id')
1259
ie = inventory.InventoryFile(b'file-id', u'\u03a9name', b'parent-id')
1133
1260
ie.executable = False
1134
ie.revision = 'file-rev-id'
1135
ie.text_sha1 = '123456'
1261
ie.revision = b'file-rev-id'
1262
ie.text_sha1 = b'123456'
1136
1263
ie.text_size = 25
1137
1264
bytes = inv._entry_to_bytes(ie)
1138
self.assertEqual('file: file-id\nparent-id\n\xce\xa9name\n'
1139
'file-rev-id\n123456\n25\nN', bytes)
1265
self.assertEqual(b'file: file-id\nparent-id\n\xce\xa9name\n'
1266
b'file-rev-id\n123456\n25\nN', bytes)
1140
1267
ie2 = inv._bytes_to_entry(bytes)
1141
1268
self.assertEqual(ie, ie2)
1142
self.assertIsInstance(ie2.name, unicode)
1143
self.assertEqual(('\xce\xa9name', 'file-id', 'file-rev-id'),
1269
self.assertIsInstance(ie2.name, text_type)
1270
self.assertEqual((b'\xce\xa9name', b'file-id', b'file-rev-id'),
1144
1271
inv._bytes_to_utf8name_key(bytes))
1146
1273
def test_dir_entry_to_bytes(self):
1147
1274
inv = CHKInventory(None)
1148
ie = inventory.InventoryDirectory('dir-id', 'dirname', 'parent-id')
1149
ie.revision = 'dir-rev-id'
1275
ie = inventory.InventoryDirectory(b'dir-id', 'dirname', b'parent-id')
1276
ie.revision = b'dir-rev-id'
1150
1277
bytes = inv._entry_to_bytes(ie)
1151
self.assertEqual('dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1278
self.assertEqual(b'dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1152
1279
ie2 = inv._bytes_to_entry(bytes)
1153
1280
self.assertEqual(ie, ie2)
1154
self.assertIsInstance(ie2.name, unicode)
1155
self.assertEqual(('dirname', 'dir-id', 'dir-rev-id'),
1281
self.assertIsInstance(ie2.name, text_type)
1282
self.assertEqual((b'dirname', b'dir-id', b'dir-rev-id'),
1156
1283
inv._bytes_to_utf8name_key(bytes))
1158
1285
def test_dir2_entry_to_bytes(self):
1159
1286
inv = CHKInventory(None)
1160
ie = inventory.InventoryDirectory('dir-id', u'dir\u03a9name',
1287
ie = inventory.InventoryDirectory(b'dir-id', u'dir\u03a9name',
1162
ie.revision = 'dir-rev-id'
1289
ie.revision = b'dir-rev-id'
1163
1290
bytes = inv._entry_to_bytes(ie)
1164
self.assertEqual('dir: dir-id\n\ndir\xce\xa9name\n'
1165
'dir-rev-id', bytes)
1291
self.assertEqual(b'dir: dir-id\n\ndir\xce\xa9name\n'
1292
b'dir-rev-id', bytes)
1166
1293
ie2 = inv._bytes_to_entry(bytes)
1167
1294
self.assertEqual(ie, ie2)
1168
self.assertIsInstance(ie2.name, unicode)
1295
self.assertIsInstance(ie2.name, text_type)
1169
1296
self.assertIs(ie2.parent_id, None)
1170
self.assertEqual(('dir\xce\xa9name', 'dir-id', 'dir-rev-id'),
1297
self.assertEqual((b'dir\xce\xa9name', b'dir-id', b'dir-rev-id'),
1171
1298
inv._bytes_to_utf8name_key(bytes))
1173
1300
def test_symlink_entry_to_bytes(self):
1174
1301
inv = CHKInventory(None)
1175
ie = inventory.InventoryLink('link-id', 'linkname', 'parent-id')
1176
ie.revision = 'link-rev-id'
1302
ie = inventory.InventoryLink(b'link-id', 'linkname', b'parent-id')
1303
ie.revision = b'link-rev-id'
1177
1304
ie.symlink_target = u'target/path'
1178
1305
bytes = inv._entry_to_bytes(ie)
1179
self.assertEqual('symlink: link-id\nparent-id\nlinkname\n'
1180
'link-rev-id\ntarget/path', bytes)
1306
self.assertEqual(b'symlink: link-id\nparent-id\nlinkname\n'
1307
b'link-rev-id\ntarget/path', bytes)
1181
1308
ie2 = inv._bytes_to_entry(bytes)
1182
1309
self.assertEqual(ie, ie2)
1183
self.assertIsInstance(ie2.name, unicode)
1184
self.assertIsInstance(ie2.symlink_target, unicode)
1185
self.assertEqual(('linkname', 'link-id', 'link-rev-id'),
1310
self.assertIsInstance(ie2.name, text_type)
1311
self.assertIsInstance(ie2.symlink_target, text_type)
1312
self.assertEqual((b'linkname', b'link-id', b'link-rev-id'),
1186
1313
inv._bytes_to_utf8name_key(bytes))
1188
1315
def test_symlink2_entry_to_bytes(self):
1189
1316
inv = CHKInventory(None)
1190
ie = inventory.InventoryLink('link-id', u'link\u03a9name', 'parent-id')
1191
ie.revision = 'link-rev-id'
1317
ie = inventory.InventoryLink(
1318
b'link-id', u'link\u03a9name', b'parent-id')
1319
ie.revision = b'link-rev-id'
1192
1320
ie.symlink_target = u'target/\u03a9path'
1193
1321
bytes = inv._entry_to_bytes(ie)
1194
self.assertEqual('symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1195
'link-rev-id\ntarget/\xce\xa9path', bytes)
1322
self.assertEqual(b'symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1323
b'link-rev-id\ntarget/\xce\xa9path', bytes)
1196
1324
ie2 = inv._bytes_to_entry(bytes)
1197
1325
self.assertEqual(ie, ie2)
1198
self.assertIsInstance(ie2.name, unicode)
1199
self.assertIsInstance(ie2.symlink_target, unicode)
1200
self.assertEqual(('link\xce\xa9name', 'link-id', 'link-rev-id'),
1326
self.assertIsInstance(ie2.name, text_type)
1327
self.assertIsInstance(ie2.symlink_target, text_type)
1328
self.assertEqual((b'link\xce\xa9name', b'link-id', b'link-rev-id'),
1201
1329
inv._bytes_to_utf8name_key(bytes))
1203
1331
def test_tree_reference_entry_to_bytes(self):
1204
1332
inv = CHKInventory(None)
1205
ie = inventory.TreeReference('tree-root-id', u'tree\u03a9name',
1207
ie.revision = 'tree-rev-id'
1208
ie.reference_revision = 'ref-rev-id'
1333
ie = inventory.TreeReference(b'tree-root-id', u'tree\u03a9name',
1335
ie.revision = b'tree-rev-id'
1336
ie.reference_revision = b'ref-rev-id'
1209
1337
bytes = inv._entry_to_bytes(ie)
1210
self.assertEqual('tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1211
'tree-rev-id\nref-rev-id', bytes)
1338
self.assertEqual(b'tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1339
b'tree-rev-id\nref-rev-id', bytes)
1212
1340
ie2 = inv._bytes_to_entry(bytes)
1213
1341
self.assertEqual(ie, ie2)
1214
self.assertIsInstance(ie2.name, unicode)
1215
self.assertEqual(('tree\xce\xa9name', 'tree-root-id', 'tree-rev-id'),
1342
self.assertIsInstance(ie2.name, text_type)
1343
self.assertEqual((b'tree\xce\xa9name', b'tree-root-id', b'tree-rev-id'),
1216
1344
inv._bytes_to_utf8name_key(bytes))
1346
def make_basic_utf8_inventory(self):
1348
inv.revision_id = b"revid"
1349
inv.root.revision = b"rootrev"
1350
root_id = inv.root.file_id
1351
inv.add(InventoryFile(b"fileid", u'f\xefle', root_id))
1352
inv.get_entry(b"fileid").revision = b"filerev"
1353
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1354
inv.get_entry(b"fileid").text_size = 0
1355
inv.add(InventoryDirectory(b"dirid", u'dir-\N{EURO SIGN}', root_id))
1356
inv.get_entry(b"dirid").revision = b"dirrev"
1357
inv.add(InventoryFile(b"childid", u'ch\xefld', b"dirid"))
1358
inv.get_entry(b"childid").revision = b"filerev"
1359
inv.get_entry(b"childid").text_sha1 = b"ffff"
1360
inv.get_entry(b"childid").text_size = 0
1361
chk_bytes = self.get_chk_bytes()
1362
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1363
bytes = b''.join(chk_inv.to_lines())
1364
return CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1366
def test__preload_handles_utf8(self):
1367
new_inv = self.make_basic_utf8_inventory()
1368
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1369
self.assertFalse(new_inv._fully_cached)
1370
new_inv._preload_cache()
1372
sorted([new_inv.root_id, b"fileid", b"dirid", b"childid"]),
1373
sorted(new_inv._fileid_to_entry_cache.keys()))
1374
ie_root = new_inv._fileid_to_entry_cache[new_inv.root_id]
1375
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1376
sorted(ie_root._children.keys()))
1377
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1378
self.assertEqual([u'ch\xefld'], sorted(ie_dir._children.keys()))
1380
def test__preload_populates_cache(self):
1382
inv.revision_id = b"revid"
1383
inv.root.revision = b"rootrev"
1384
root_id = inv.root.file_id
1385
inv.add(InventoryFile(b"fileid", "file", root_id))
1386
inv.get_entry(b"fileid").revision = b"filerev"
1387
inv.get_entry(b"fileid").executable = True
1388
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1389
inv.get_entry(b"fileid").text_size = 1
1390
inv.add(InventoryDirectory(b"dirid", "dir", root_id))
1391
inv.get_entry(b"dirid").revision = b"dirrev"
1392
inv.add(InventoryFile(b"childid", "child", b"dirid"))
1393
inv.get_entry(b"childid").revision = b"filerev"
1394
inv.get_entry(b"childid").executable = False
1395
inv.get_entry(b"childid").text_sha1 = b"dddd"
1396
inv.get_entry(b"childid").text_size = 1
1397
chk_bytes = self.get_chk_bytes()
1398
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1399
bytes = b''.join(chk_inv.to_lines())
1400
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1401
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1402
self.assertFalse(new_inv._fully_cached)
1403
new_inv._preload_cache()
1405
sorted([root_id, b"fileid", b"dirid", b"childid"]),
1406
sorted(new_inv._fileid_to_entry_cache.keys()))
1407
self.assertTrue(new_inv._fully_cached)
1408
ie_root = new_inv._fileid_to_entry_cache[root_id]
1409
self.assertEqual(['dir', 'file'], sorted(ie_root._children.keys()))
1410
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1411
self.assertEqual(['child'], sorted(ie_dir._children.keys()))
1413
def test__preload_handles_partially_evaluated_inventory(self):
1414
new_inv = self.make_basic_utf8_inventory()
1415
ie = new_inv.get_entry(new_inv.root_id)
1416
self.assertIs(None, ie._children)
1417
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1418
sorted(ie.children.keys()))
1419
# Accessing .children loads _children
1420
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1421
sorted(ie._children.keys()))
1422
new_inv._preload_cache()
1424
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1425
sorted(ie._children.keys()))
1426
ie_dir = new_inv.get_entry(b"dirid")
1427
self.assertEqual([u'ch\xefld'],
1428
sorted(ie_dir._children.keys()))
1430
def test_filter_change_in_renamed_subfolder(self):
1431
inv = Inventory(b'tree-root')
1432
inv.root.revision = b'rootrev'
1433
src_ie = inv.add_path('src', 'directory', b'src-id')
1434
src_ie.revision = b'srcrev'
1435
sub_ie = inv.add_path('src/sub/', 'directory', b'sub-id')
1436
sub_ie.revision = b'subrev'
1437
a_ie = inv.add_path('src/sub/a', 'file', b'a-id')
1438
a_ie.revision = b'filerev'
1439
a_ie.text_sha1 = osutils.sha_string(b'content\n')
1440
a_ie.text_size = len(b'content\n')
1441
chk_bytes = self.get_chk_bytes()
1442
inv = CHKInventory.from_inventory(chk_bytes, inv)
1443
inv = inv.create_by_apply_delta([
1444
("src/sub/a", "src/sub/a", b"a-id", a_ie),
1445
("src", "src2", b"src-id", src_ie),
1447
new_inv = inv.filter([b'a-id', b'src-id'])
1451
('src/sub', b'sub-id'),
1452
('src/sub/a', b'a-id'),
1453
], [(path, ie.file_id) for path, ie in new_inv.iter_entries()])
1219
1456
class TestCHKInventoryExpand(tests.TestCaseWithMemoryTransport):
1286
1528
for path, entry in inv.iter_entries_by_dir():
1287
1529
layout.append((path, entry.file_id))
1288
1530
self.assertEqual([
1290
('dir1', 'dir1-id'),
1291
('dir2', 'dir2-id'),
1293
('dir1/sub-dir1', 'sub-dir1-id'),
1294
('dir1/sub-file1', 'sub-file1-id'),
1295
('dir1/sub-file2', 'sub-file2-id'),
1296
('dir1/sub-dir1/subsub-file1', 'subsub-file1-id'),
1297
('dir2/sub2-file1', 'sub2-file1-id'),
1532
('dir1', b'dir1-id'),
1533
('dir2', b'dir2-id'),
1535
('dir1/sub-dir1', b'sub-dir1-id'),
1536
('dir1/sub-file1', b'sub-file1-id'),
1537
('dir1/sub-file2', b'sub-file2-id'),
1538
('dir1/sub-dir1/subsub-file1', b'subsub-file1-id'),
1539
('dir2/sub2-file1', b'sub2-file1-id'),
1300
1542
def test__getitems(self):
1301
1543
inv = self.make_simple_inventory()
1302
1544
# Reading from disk
1303
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1304
self.assertTrue('dir1-id' in inv._fileid_to_entry_cache)
1305
self.assertFalse('sub-file2-id' in inv._fileid_to_entry_cache)
1545
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1546
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1547
self.assertFalse(b'sub-file2-id' in inv._fileid_to_entry_cache)
1307
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1549
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1309
self.assert_Getitems(['dir1-id', 'sub-file2-id'], inv,
1310
['dir1-id', 'sub-file2-id'])
1311
self.assertTrue('dir1-id' in inv._fileid_to_entry_cache)
1312
self.assertTrue('sub-file2-id' in inv._fileid_to_entry_cache)
1551
self.assert_Getitems([b'dir1-id', b'sub-file2-id'], inv,
1552
[b'dir1-id', b'sub-file2-id'])
1553
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1554
self.assertTrue(b'sub-file2-id' in inv._fileid_to_entry_cache)
1314
1556
def test_single_file(self):
1315
1557
inv = self.make_simple_inventory()
1316
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1558
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1318
1560
def test_get_all_parents(self):
1319
1561
inv = self.make_simple_inventory()
1320
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1322
], inv, ['subsub-file1-id'])
1562
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1564
], inv, [b'subsub-file1-id'])
1324
1566
def test_get_children(self):
1325
1567
inv = self.make_simple_inventory()
1326
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1327
'sub-file1-id', 'sub-file2-id', 'subsub-file1-id',
1328
], inv, ['dir1-id'])
1568
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1569
b'sub-file1-id', b'sub-file2-id', b'subsub-file1-id',
1570
], inv, [b'dir1-id'])
1330
1572
def test_from_root(self):
1331
1573
inv = self.make_simple_inventory()
1332
self.assertExpand(['TREE_ROOT', 'dir1-id', 'dir2-id', 'sub-dir1-id',
1333
'sub-file1-id', 'sub-file2-id', 'sub2-file1-id',
1334
'subsub-file1-id', 'top-id'], inv, ['TREE_ROOT'])
1574
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'dir2-id', b'sub-dir1-id',
1575
b'sub-file1-id', b'sub-file2-id', b'sub2-file1-id',
1576
b'subsub-file1-id', b'top-id'], inv, [b'TREE_ROOT'])
1336
1578
def test_top_level_file(self):
1337
1579
inv = self.make_simple_inventory()
1338
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1580
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1340
1582
def test_subsub_file(self):
1341
1583
inv = self.make_simple_inventory()
1342
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1343
'subsub-file1-id'], inv, ['subsub-file1-id'])
1584
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1585
b'subsub-file1-id'], inv, [b'subsub-file1-id'])
1345
1587
def test_sub_and_root(self):
1346
1588
inv = self.make_simple_inventory()
1347
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id', 'top-id',
1348
'subsub-file1-id'], inv, ['top-id', 'subsub-file1-id'])
1589
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id', b'top-id',
1590
b'subsub-file1-id'], inv, [b'top-id', b'subsub-file1-id'])
1593
class TestMutableInventoryFromTree(TestCaseWithTransport):
1595
def test_empty(self):
1596
repository = self.make_repository('.')
1597
tree = repository.revision_tree(revision.NULL_REVISION)
1598
inv = mutable_inventory_from_tree(tree)
1599
self.assertEqual(revision.NULL_REVISION, inv.revision_id)
1600
self.assertEqual(0, len(inv))
1602
def test_some_files(self):
1603
wt = self.make_branch_and_tree('.')
1604
self.build_tree(['a'])
1605
wt.add(['a'], [b'thefileid'])
1606
revid = wt.commit("commit")
1607
tree = wt.branch.repository.revision_tree(revid)
1608
inv = mutable_inventory_from_tree(tree)
1609
self.assertEqual(revid, inv.revision_id)
1610
self.assertEqual(2, len(inv))
1611
self.assertEqual("a", inv.get_entry(b'thefileid').name)
1612
# The inventory should be mutable and independent of
1614
self.assertFalse(tree.root_inventory.get_entry(
1615
b'thefileid').executable)
1616
inv.get_entry(b'thefileid').executable = True
1617
self.assertFalse(tree.root_inventory.get_entry(
1618
b'thefileid').executable)