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(), '')
737
def test_link_kind_character(self):
738
dir = TreeReference(b'123', 'hello.c', ROOT_ID)
739
self.assertEqual(dir.kind_character(), '+')
608
741
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'
742
left = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
743
right = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
616
744
self.assertEqual((False, False), left.detect_changes(right))
617
745
self.assertEqual((False, False), right.detect_changes(left))
619
747
def test_file_detect_changes(self):
620
left = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
748
left = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
621
749
left.text_sha1 = 123
622
right = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
750
right = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
623
751
right.text_sha1 = 123
624
752
self.assertEqual((False, False), left.detect_changes(right))
625
753
self.assertEqual((False, False), right.detect_changes(left))
748
873
def read_bytes(self, chk_bytes, key):
749
874
stream = chk_bytes.get_record_stream([key], 'unordered', True)
750
return stream.next().get_bytes_as("fulltext")
875
return next(stream).get_bytes_as("fulltext")
752
877
def test_deserialise_gives_CHKInventory(self):
753
878
inv = Inventory()
754
inv.revision_id = "revid"
755
inv.root.revision = "rootrev"
879
inv.revision_id = b"revid"
880
inv.root.revision = b"rootrev"
756
881
chk_bytes = self.get_chk_bytes()
757
882
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)
883
bytes = b''.join(chk_inv.to_lines())
884
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
885
self.assertEqual(b"revid", new_inv.revision_id)
761
886
self.assertEqual("directory", new_inv.root.kind)
762
887
self.assertEqual(inv.root.file_id, new_inv.root.file_id)
763
888
self.assertEqual(inv.root.parent_id, new_inv.root.parent_id)
764
889
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)
890
self.assertEqual(b"rootrev", new_inv.root.revision)
891
self.assertEqual(b'plain', new_inv._search_key_name)
768
893
def test_deserialise_wrong_revid(self):
769
894
inv = Inventory()
770
inv.revision_id = "revid"
771
inv.root.revision = "rootrev"
895
inv.revision_id = b"revid"
896
inv.root.revision = b"rootrev"
772
897
chk_bytes = self.get_chk_bytes()
773
898
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
774
bytes = ''.join(chk_inv.to_lines())
899
bytes = b''.join(chk_inv.to_lines())
775
900
self.assertRaises(ValueError, CHKInventory.deserialise, chk_bytes,
778
903
def test_captures_rev_root_byid(self):
779
904
inv = Inventory()
780
inv.revision_id = "foo"
781
inv.root.revision = "bar"
905
inv.revision_id = b"foo"
906
inv.root.revision = b"bar"
782
907
chk_bytes = self.get_chk_bytes()
783
908
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
784
909
lines = chk_inv.to_lines()
785
910
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',
912
b'revision_id: foo\n',
913
b'root_id: TREE_ROOT\n',
914
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
915
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)
917
chk_inv = CHKInventory.deserialise(
918
chk_bytes, b''.join(lines), (b'foo',))
919
self.assertEqual(b'plain', chk_inv._search_key_name)
795
921
def test_captures_parent_id_basename_index(self):
796
922
inv = Inventory()
797
inv.revision_id = "foo"
798
inv.root.revision = "bar"
923
inv.revision_id = b"foo"
924
inv.root.revision = b"bar"
799
925
chk_bytes = self.get_chk_bytes()
800
926
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
801
927
lines = chk_inv.to_lines()
802
928
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',
930
b'revision_id: foo\n',
931
b'root_id: TREE_ROOT\n',
932
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
933
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)
935
chk_inv = CHKInventory.deserialise(
936
chk_bytes, b''.join(lines), (b'foo',))
937
self.assertEqual(b'plain', chk_inv._search_key_name)
812
939
def test_captures_search_key_name(self):
813
940
inv = Inventory()
814
inv.revision_id = "foo"
815
inv.root.revision = "bar"
941
inv.revision_id = b"foo"
942
inv.root.revision = b"bar"
816
943
chk_bytes = self.get_chk_bytes()
817
944
chk_inv = CHKInventory.from_inventory(chk_bytes, inv,
818
search_key_name='hash-16-way')
945
search_key_name=b'hash-16-way')
819
946
lines = chk_inv.to_lines()
820
947
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',
949
b'search_key_name: hash-16-way\n',
950
b'root_id: TREE_ROOT\n',
951
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
952
b'revision_id: foo\n',
953
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)
955
chk_inv = CHKInventory.deserialise(
956
chk_bytes, b''.join(lines), (b'foo',))
957
self.assertEqual(b'hash-16-way', chk_inv._search_key_name)
831
959
def test_directory_children_on_demand(self):
832
960
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
961
inv.revision_id = b"revid"
962
inv.root.revision = b"rootrev"
963
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
964
inv.get_entry(b"fileid").revision = b"filerev"
965
inv.get_entry(b"fileid").executable = True
966
inv.get_entry(b"fileid").text_sha1 = b"ffff"
967
inv.get_entry(b"fileid").text_size = 1
840
968
chk_bytes = self.get_chk_bytes()
841
969
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]
970
bytes = b''.join(chk_inv.to_lines())
971
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
972
root_entry = new_inv.get_entry(inv.root.file_id)
845
973
self.assertEqual(None, root_entry._children)
846
self.assertEqual(['file'], root_entry.children.keys())
847
file_direct = new_inv["fileid"]
974
self.assertEqual({'file'}, set(root_entry.children))
975
file_direct = new_inv.get_entry(b"fileid")
848
976
file_found = root_entry.children['file']
849
977
self.assertEqual(file_direct.kind, file_found.kind)
850
978
self.assertEqual(file_direct.file_id, file_found.file_id)
870
998
self.assertEqual(120, p_id_basename._root_node.maximum_size)
871
999
self.assertEqual(2, p_id_basename._root_node._key_width)
873
def test___iter__(self):
1001
def test_iter_all_ids(self):
874
1002
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
1003
inv.revision_id = b"revid"
1004
inv.root.revision = b"rootrev"
1005
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1006
inv.get_entry(b"fileid").revision = b"filerev"
1007
inv.get_entry(b"fileid").executable = True
1008
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1009
inv.get_entry(b"fileid").text_size = 1
882
1010
chk_bytes = self.get_chk_bytes()
883
1011
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)
1012
bytes = b''.join(chk_inv.to_lines())
1013
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1014
fileids = sorted(new_inv.iter_all_ids())
1015
self.assertEqual([inv.root.file_id, b"fileid"], fileids)
890
1017
def test__len__(self):
891
1018
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
1019
inv.revision_id = b"revid"
1020
inv.root.revision = b"rootrev"
1021
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1022
inv.get_entry(b"fileid").revision = b"filerev"
1023
inv.get_entry(b"fileid").executable = True
1024
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1025
inv.get_entry(b"fileid").text_size = 1
899
1026
chk_bytes = self.get_chk_bytes()
900
1027
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
901
1028
self.assertEqual(2, len(chk_inv))
903
def test___getitem__(self):
1030
def test_get_entry(self):
904
1031
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
1032
inv.revision_id = b"revid"
1033
inv.root.revision = b"rootrev"
1034
inv.add(InventoryFile(b"fileid", u"file", inv.root.file_id))
1035
inv.get_entry(b"fileid").revision = b"filerev"
1036
inv.get_entry(b"fileid").executable = True
1037
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1038
inv.get_entry(b"fileid").text_size = 1
912
1039
chk_bytes = self.get_chk_bytes()
913
1040
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"]
1041
data = b''.join(chk_inv.to_lines())
1042
new_inv = CHKInventory.deserialise(chk_bytes, data, (b"revid",))
1043
root_entry = new_inv.get_entry(inv.root.file_id)
1044
file_entry = new_inv.get_entry(b"fileid")
918
1045
self.assertEqual("directory", root_entry.kind)
919
1046
self.assertEqual(inv.root.file_id, root_entry.file_id)
920
1047
self.assertEqual(inv.root.parent_id, root_entry.parent_id)
921
1048
self.assertEqual(inv.root.name, root_entry.name)
922
self.assertEqual("rootrev", root_entry.revision)
1049
self.assertEqual(b"rootrev", root_entry.revision)
923
1050
self.assertEqual("file", file_entry.kind)
924
self.assertEqual("fileid", file_entry.file_id)
1051
self.assertEqual(b"fileid", file_entry.file_id)
925
1052
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)
1053
self.assertEqual(u"file", file_entry.name)
1054
self.assertEqual(b"filerev", file_entry.revision)
1055
self.assertEqual(b"ffff", file_entry.text_sha1)
929
1056
self.assertEqual(1, file_entry.text_size)
930
1057
self.assertEqual(True, file_entry.executable)
931
self.assertRaises(errors.NoSuchId, new_inv.__getitem__, 'missing')
1058
self.assertRaises(errors.NoSuchId, new_inv.get_entry, 'missing')
933
1060
def test_has_id_true(self):
934
1061
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
1062
inv.revision_id = b"revid"
1063
inv.root.revision = b"rootrev"
1064
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1065
inv.get_entry(b"fileid").revision = b"filerev"
1066
inv.get_entry(b"fileid").executable = True
1067
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1068
inv.get_entry(b"fileid").text_size = 1
942
1069
chk_bytes = self.get_chk_bytes()
943
1070
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
944
self.assertTrue(chk_inv.has_id('fileid'))
1071
self.assertTrue(chk_inv.has_id(b'fileid'))
945
1072
self.assertTrue(chk_inv.has_id(inv.root.file_id))
947
1074
def test_has_id_not(self):
948
1075
inv = Inventory()
949
inv.revision_id = "revid"
950
inv.root.revision = "rootrev"
1076
inv.revision_id = b"revid"
1077
inv.root.revision = b"rootrev"
951
1078
chk_bytes = self.get_chk_bytes()
952
1079
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
953
self.assertFalse(chk_inv.has_id('fileid'))
1080
self.assertFalse(chk_inv.has_id(b'fileid'))
955
1082
def test_id2path(self):
956
1083
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")
1084
inv.revision_id = b"revid"
1085
inv.root.revision = b"rootrev"
1086
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1087
fileentry = InventoryFile(b"fileid", "file", b"dirid")
961
1088
inv.add(direntry)
962
1089
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"
1090
inv.get_entry(b"fileid").revision = b"filerev"
1091
inv.get_entry(b"fileid").executable = True
1092
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1093
inv.get_entry(b"fileid").text_size = 1
1094
inv.get_entry(b"dirid").revision = b"filerev"
968
1095
chk_bytes = self.get_chk_bytes()
969
1096
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
970
bytes = ''.join(chk_inv.to_lines())
971
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1097
bytes = b''.join(chk_inv.to_lines())
1098
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
972
1099
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'))
1100
self.assertEqual('dir', new_inv.id2path(b'dirid'))
1101
self.assertEqual('dir/file', new_inv.id2path(b'fileid'))
976
1103
def test_path2id(self):
977
1104
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")
1105
inv.revision_id = b"revid"
1106
inv.root.revision = b"rootrev"
1107
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1108
fileentry = InventoryFile(b"fileid", "file", b"dirid")
982
1109
inv.add(direntry)
983
1110
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"
1111
inv.get_entry(b"fileid").revision = b"filerev"
1112
inv.get_entry(b"fileid").executable = True
1113
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1114
inv.get_entry(b"fileid").text_size = 1
1115
inv.get_entry(b"dirid").revision = b"filerev"
989
1116
chk_bytes = self.get_chk_bytes()
990
1117
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
991
bytes = ''.join(chk_inv.to_lines())
992
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1118
bytes = b''.join(chk_inv.to_lines())
1119
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
993
1120
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'))
1121
self.assertEqual(b'dirid', new_inv.path2id('dir'))
1122
self.assertEqual(b'fileid', new_inv.path2id('dir/file'))
997
1124
def test_create_by_apply_delta_sets_root(self):
998
1125
inv = Inventory()
999
inv.revision_id = "revid"
1126
inv.root.revision = b"myrootrev"
1127
inv.revision_id = b"revid"
1000
1128
chk_bytes = self.get_chk_bytes()
1001
1129
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1002
inv.add_path("", "directory", "myrootid", None)
1003
inv.revision_id = "expectedid"
1130
inv.add_path("", "directory", b"myrootid", None)
1131
inv.revision_id = b"expectedid"
1132
inv.root.revision = b"myrootrev"
1004
1133
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1005
1134
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)
1135
(None, "", b"myrootid", inv.root)]
1136
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1137
self.assertEqual(reference_inv.root, new_inv.root)
1010
1139
def test_create_by_apply_delta_empty_add_child(self):
1011
1140
inv = Inventory()
1012
inv.revision_id = "revid"
1013
inv.root.revision = "rootrev"
1141
inv.revision_id = b"revid"
1142
inv.root.revision = b"rootrev"
1014
1143
chk_bytes = self.get_chk_bytes()
1015
1144
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1016
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1017
a_entry.revision = "filerev"
1145
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1146
a_entry.revision = b"filerev"
1018
1147
a_entry.executable = True
1019
a_entry.text_sha1 = "ffff"
1148
a_entry.text_sha1 = b"ffff"
1020
1149
a_entry.text_size = 1
1021
1150
inv.add(a_entry)
1022
inv.revision_id = "expectedid"
1151
inv.revision_id = b"expectedid"
1023
1152
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")
1153
delta = [(None, "A", b"A-id", a_entry)]
1154
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1026
1155
# new_inv should be the same as reference_inv.
1027
1156
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1028
1157
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1029
1158
reference_inv.id_to_entry._ensure_root()
1030
1159
new_inv.id_to_entry._ensure_root()
1031
1160
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1032
new_inv.id_to_entry._root_node._key)
1161
new_inv.id_to_entry._root_node._key)
1034
1163
def test_create_by_apply_delta_empty_add_child_updates_parent_id(self):
1035
1164
inv = Inventory()
1036
inv.revision_id = "revid"
1037
inv.root.revision = "rootrev"
1165
inv.revision_id = b"revid"
1166
inv.root.revision = b"rootrev"
1038
1167
chk_bytes = self.get_chk_bytes()
1039
1168
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1040
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1041
a_entry.revision = "filerev"
1169
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1170
a_entry.revision = b"filerev"
1042
1171
a_entry.executable = True
1043
a_entry.text_sha1 = "ffff"
1172
a_entry.text_sha1 = b"ffff"
1044
1173
a_entry.text_size = 1
1045
1174
inv.add(a_entry)
1046
inv.revision_id = "expectedid"
1175
inv.revision_id = b"expectedid"
1047
1176
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")
1177
delta = [(None, "A", b"A-id", a_entry)]
1178
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1050
1179
reference_inv.id_to_entry._ensure_root()
1051
1180
reference_inv.parent_id_basename_to_file_id._ensure_root()
1052
1181
new_inv.id_to_entry._ensure_root()
1055
1184
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1056
1185
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1057
1186
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1058
new_inv.id_to_entry._root_node._key)
1187
new_inv.id_to_entry._root_node._key)
1059
1188
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)
1189
new_inv.parent_id_basename_to_file_id._root_node._key)
1062
1191
def test_iter_changes(self):
1063
1192
# Low level bootstrapping smoke test; comprehensive generic tests via
1064
1193
# InterTree are coming.
1065
1194
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
1195
inv.revision_id = b"revid"
1196
inv.root.revision = b"rootrev"
1197
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1198
inv.get_entry(b"fileid").revision = b"filerev"
1199
inv.get_entry(b"fileid").executable = True
1200
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1201
inv.get_entry(b"fileid").text_size = 1
1073
1202
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
1203
inv2.revision_id = b"revid2"
1204
inv2.root.revision = b"rootrev"
1205
inv2.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1206
inv2.get_entry(b"fileid").revision = b"filerev2"
1207
inv2.get_entry(b"fileid").executable = False
1208
inv2.get_entry(b"fileid").text_sha1 = b"bbbb"
1209
inv2.get_entry(b"fileid").text_size = 2
1081
1210
# get fresh objects.
1082
1211
chk_bytes = self.get_chk_bytes()
1083
1212
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1084
bytes = ''.join(chk_inv.to_lines())
1085
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1213
bytes = b''.join(chk_inv.to_lines())
1214
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1086
1215
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)))
1216
bytes = b''.join(chk_inv2.to_lines())
1217
inv_2 = CHKInventory.deserialise(chk_bytes, bytes, (b"revid2",))
1218
self.assertEqual([(b'fileid', (u'file', u'file'), True, (True, True),
1219
(b'TREE_ROOT', b'TREE_ROOT'), (u'file',
1220
u'file'), ('file', 'file'),
1222
list(inv_1.iter_changes(inv_2)))
1094
1224
def test_parent_id_basename_to_file_id_index_enabled(self):
1095
1225
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
1226
inv.revision_id = b"revid"
1227
inv.root.revision = b"rootrev"
1228
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1229
inv.get_entry(b"fileid").revision = b"filerev"
1230
inv.get_entry(b"fileid").executable = True
1231
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1232
inv.get_entry(b"fileid").text_size = 1
1103
1233
# get fresh objects.
1104
1234
chk_bytes = self.get_chk_bytes()
1105
1235
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)
1236
bytes = b''.join(tmp_inv.to_lines())
1237
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1238
self.assertIsInstance(
1239
chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1109
1240
self.assertEqual(
1110
{('', ''): 'TREE_ROOT', ('TREE_ROOT', 'file'): 'fileid'},
1241
{(b'', b''): b'TREE_ROOT', (b'TREE_ROOT', b'file'): b'fileid'},
1111
1242
dict(chk_inv.parent_id_basename_to_file_id.iteritems()))
1113
1244
def test_file_entry_to_bytes(self):
1114
1245
inv = CHKInventory(None)
1115
ie = inventory.InventoryFile('file-id', 'filename', 'parent-id')
1246
ie = inventory.InventoryFile(b'file-id', 'filename', b'parent-id')
1116
1247
ie.executable = True
1117
ie.revision = 'file-rev-id'
1118
ie.text_sha1 = 'abcdefgh'
1248
ie.revision = b'file-rev-id'
1249
ie.text_sha1 = b'abcdefgh'
1119
1250
ie.text_size = 100
1120
1251
bytes = inv._entry_to_bytes(ie)
1121
self.assertEqual('file: file-id\nparent-id\nfilename\n'
1122
'file-rev-id\nabcdefgh\n100\nY', bytes)
1252
self.assertEqual(b'file: file-id\nparent-id\nfilename\n'
1253
b'file-rev-id\nabcdefgh\n100\nY', bytes)
1123
1254
ie2 = inv._bytes_to_entry(bytes)
1124
1255
self.assertEqual(ie, ie2)
1125
self.assertIsInstance(ie2.name, unicode)
1126
self.assertEqual(('filename', 'file-id', 'file-rev-id'),
1256
self.assertIsInstance(ie2.name, text_type)
1257
self.assertEqual((b'filename', b'file-id', b'file-rev-id'),
1127
1258
inv._bytes_to_utf8name_key(bytes))
1129
1260
def test_file2_entry_to_bytes(self):
1130
1261
inv = CHKInventory(None)
1131
1262
# \u30a9 == 'omega'
1132
ie = inventory.InventoryFile('file-id', u'\u03a9name', 'parent-id')
1263
ie = inventory.InventoryFile(b'file-id', u'\u03a9name', b'parent-id')
1133
1264
ie.executable = False
1134
ie.revision = 'file-rev-id'
1135
ie.text_sha1 = '123456'
1265
ie.revision = b'file-rev-id'
1266
ie.text_sha1 = b'123456'
1136
1267
ie.text_size = 25
1137
1268
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)
1269
self.assertEqual(b'file: file-id\nparent-id\n\xce\xa9name\n'
1270
b'file-rev-id\n123456\n25\nN', bytes)
1140
1271
ie2 = inv._bytes_to_entry(bytes)
1141
1272
self.assertEqual(ie, ie2)
1142
self.assertIsInstance(ie2.name, unicode)
1143
self.assertEqual(('\xce\xa9name', 'file-id', 'file-rev-id'),
1273
self.assertIsInstance(ie2.name, text_type)
1274
self.assertEqual((b'\xce\xa9name', b'file-id', b'file-rev-id'),
1144
1275
inv._bytes_to_utf8name_key(bytes))
1146
1277
def test_dir_entry_to_bytes(self):
1147
1278
inv = CHKInventory(None)
1148
ie = inventory.InventoryDirectory('dir-id', 'dirname', 'parent-id')
1149
ie.revision = 'dir-rev-id'
1279
ie = inventory.InventoryDirectory(b'dir-id', 'dirname', b'parent-id')
1280
ie.revision = b'dir-rev-id'
1150
1281
bytes = inv._entry_to_bytes(ie)
1151
self.assertEqual('dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1282
self.assertEqual(b'dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1152
1283
ie2 = inv._bytes_to_entry(bytes)
1153
1284
self.assertEqual(ie, ie2)
1154
self.assertIsInstance(ie2.name, unicode)
1155
self.assertEqual(('dirname', 'dir-id', 'dir-rev-id'),
1285
self.assertIsInstance(ie2.name, text_type)
1286
self.assertEqual((b'dirname', b'dir-id', b'dir-rev-id'),
1156
1287
inv._bytes_to_utf8name_key(bytes))
1158
1289
def test_dir2_entry_to_bytes(self):
1159
1290
inv = CHKInventory(None)
1160
ie = inventory.InventoryDirectory('dir-id', u'dir\u03a9name',
1291
ie = inventory.InventoryDirectory(b'dir-id', u'dir\u03a9name',
1162
ie.revision = 'dir-rev-id'
1293
ie.revision = b'dir-rev-id'
1163
1294
bytes = inv._entry_to_bytes(ie)
1164
self.assertEqual('dir: dir-id\n\ndir\xce\xa9name\n'
1165
'dir-rev-id', bytes)
1295
self.assertEqual(b'dir: dir-id\n\ndir\xce\xa9name\n'
1296
b'dir-rev-id', bytes)
1166
1297
ie2 = inv._bytes_to_entry(bytes)
1167
1298
self.assertEqual(ie, ie2)
1168
self.assertIsInstance(ie2.name, unicode)
1299
self.assertIsInstance(ie2.name, text_type)
1169
1300
self.assertIs(ie2.parent_id, None)
1170
self.assertEqual(('dir\xce\xa9name', 'dir-id', 'dir-rev-id'),
1301
self.assertEqual((b'dir\xce\xa9name', b'dir-id', b'dir-rev-id'),
1171
1302
inv._bytes_to_utf8name_key(bytes))
1173
1304
def test_symlink_entry_to_bytes(self):
1174
1305
inv = CHKInventory(None)
1175
ie = inventory.InventoryLink('link-id', 'linkname', 'parent-id')
1176
ie.revision = 'link-rev-id'
1306
ie = inventory.InventoryLink(b'link-id', 'linkname', b'parent-id')
1307
ie.revision = b'link-rev-id'
1177
1308
ie.symlink_target = u'target/path'
1178
1309
bytes = inv._entry_to_bytes(ie)
1179
self.assertEqual('symlink: link-id\nparent-id\nlinkname\n'
1180
'link-rev-id\ntarget/path', bytes)
1310
self.assertEqual(b'symlink: link-id\nparent-id\nlinkname\n'
1311
b'link-rev-id\ntarget/path', bytes)
1181
1312
ie2 = inv._bytes_to_entry(bytes)
1182
1313
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'),
1314
self.assertIsInstance(ie2.name, text_type)
1315
self.assertIsInstance(ie2.symlink_target, text_type)
1316
self.assertEqual((b'linkname', b'link-id', b'link-rev-id'),
1186
1317
inv._bytes_to_utf8name_key(bytes))
1188
1319
def test_symlink2_entry_to_bytes(self):
1189
1320
inv = CHKInventory(None)
1190
ie = inventory.InventoryLink('link-id', u'link\u03a9name', 'parent-id')
1191
ie.revision = 'link-rev-id'
1321
ie = inventory.InventoryLink(
1322
b'link-id', u'link\u03a9name', b'parent-id')
1323
ie.revision = b'link-rev-id'
1192
1324
ie.symlink_target = u'target/\u03a9path'
1193
1325
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)
1326
self.assertEqual(b'symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1327
b'link-rev-id\ntarget/\xce\xa9path', bytes)
1196
1328
ie2 = inv._bytes_to_entry(bytes)
1197
1329
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'),
1330
self.assertIsInstance(ie2.name, text_type)
1331
self.assertIsInstance(ie2.symlink_target, text_type)
1332
self.assertEqual((b'link\xce\xa9name', b'link-id', b'link-rev-id'),
1201
1333
inv._bytes_to_utf8name_key(bytes))
1203
1335
def test_tree_reference_entry_to_bytes(self):
1204
1336
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'
1337
ie = inventory.TreeReference(b'tree-root-id', u'tree\u03a9name',
1339
ie.revision = b'tree-rev-id'
1340
ie.reference_revision = b'ref-rev-id'
1209
1341
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)
1342
self.assertEqual(b'tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1343
b'tree-rev-id\nref-rev-id', bytes)
1212
1344
ie2 = inv._bytes_to_entry(bytes)
1213
1345
self.assertEqual(ie, ie2)
1214
self.assertIsInstance(ie2.name, unicode)
1215
self.assertEqual(('tree\xce\xa9name', 'tree-root-id', 'tree-rev-id'),
1346
self.assertIsInstance(ie2.name, text_type)
1347
self.assertEqual((b'tree\xce\xa9name', b'tree-root-id', b'tree-rev-id'),
1216
1348
inv._bytes_to_utf8name_key(bytes))
1350
def make_basic_utf8_inventory(self):
1352
inv.revision_id = b"revid"
1353
inv.root.revision = b"rootrev"
1354
root_id = inv.root.file_id
1355
inv.add(InventoryFile(b"fileid", u'f\xefle', root_id))
1356
inv.get_entry(b"fileid").revision = b"filerev"
1357
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1358
inv.get_entry(b"fileid").text_size = 0
1359
inv.add(InventoryDirectory(b"dirid", u'dir-\N{EURO SIGN}', root_id))
1360
inv.get_entry(b"dirid").revision = b"dirrev"
1361
inv.add(InventoryFile(b"childid", u'ch\xefld', b"dirid"))
1362
inv.get_entry(b"childid").revision = b"filerev"
1363
inv.get_entry(b"childid").text_sha1 = b"ffff"
1364
inv.get_entry(b"childid").text_size = 0
1365
chk_bytes = self.get_chk_bytes()
1366
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1367
bytes = b''.join(chk_inv.to_lines())
1368
return CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1370
def test__preload_handles_utf8(self):
1371
new_inv = self.make_basic_utf8_inventory()
1372
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1373
self.assertFalse(new_inv._fully_cached)
1374
new_inv._preload_cache()
1376
sorted([new_inv.root_id, b"fileid", b"dirid", b"childid"]),
1377
sorted(new_inv._fileid_to_entry_cache.keys()))
1378
ie_root = new_inv._fileid_to_entry_cache[new_inv.root_id]
1379
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1380
sorted(ie_root._children.keys()))
1381
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1382
self.assertEqual([u'ch\xefld'], sorted(ie_dir._children.keys()))
1384
def test__preload_populates_cache(self):
1386
inv.revision_id = b"revid"
1387
inv.root.revision = b"rootrev"
1388
root_id = inv.root.file_id
1389
inv.add(InventoryFile(b"fileid", "file", root_id))
1390
inv.get_entry(b"fileid").revision = b"filerev"
1391
inv.get_entry(b"fileid").executable = True
1392
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1393
inv.get_entry(b"fileid").text_size = 1
1394
inv.add(InventoryDirectory(b"dirid", "dir", root_id))
1395
inv.get_entry(b"dirid").revision = b"dirrev"
1396
inv.add(InventoryFile(b"childid", "child", b"dirid"))
1397
inv.get_entry(b"childid").revision = b"filerev"
1398
inv.get_entry(b"childid").executable = False
1399
inv.get_entry(b"childid").text_sha1 = b"dddd"
1400
inv.get_entry(b"childid").text_size = 1
1401
chk_bytes = self.get_chk_bytes()
1402
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1403
bytes = b''.join(chk_inv.to_lines())
1404
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1405
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1406
self.assertFalse(new_inv._fully_cached)
1407
new_inv._preload_cache()
1409
sorted([root_id, b"fileid", b"dirid", b"childid"]),
1410
sorted(new_inv._fileid_to_entry_cache.keys()))
1411
self.assertTrue(new_inv._fully_cached)
1412
ie_root = new_inv._fileid_to_entry_cache[root_id]
1413
self.assertEqual(['dir', 'file'], sorted(ie_root._children.keys()))
1414
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1415
self.assertEqual(['child'], sorted(ie_dir._children.keys()))
1417
def test__preload_handles_partially_evaluated_inventory(self):
1418
new_inv = self.make_basic_utf8_inventory()
1419
ie = new_inv.get_entry(new_inv.root_id)
1420
self.assertIs(None, ie._children)
1421
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1422
sorted(ie.children.keys()))
1423
# Accessing .children loads _children
1424
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1425
sorted(ie._children.keys()))
1426
new_inv._preload_cache()
1428
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1429
sorted(ie._children.keys()))
1430
ie_dir = new_inv.get_entry(b"dirid")
1431
self.assertEqual([u'ch\xefld'],
1432
sorted(ie_dir._children.keys()))
1434
def test_filter_change_in_renamed_subfolder(self):
1435
inv = Inventory(b'tree-root')
1436
inv.root.revision = b'rootrev'
1437
src_ie = inv.add_path('src', 'directory', b'src-id')
1438
src_ie.revision = b'srcrev'
1439
sub_ie = inv.add_path('src/sub/', 'directory', b'sub-id')
1440
sub_ie.revision = b'subrev'
1441
a_ie = inv.add_path('src/sub/a', 'file', b'a-id')
1442
a_ie.revision = b'filerev'
1443
a_ie.text_sha1 = osutils.sha_string(b'content\n')
1444
a_ie.text_size = len(b'content\n')
1445
chk_bytes = self.get_chk_bytes()
1446
inv = CHKInventory.from_inventory(chk_bytes, inv)
1447
inv = inv.create_by_apply_delta([
1448
("src/sub/a", "src/sub/a", b"a-id", a_ie),
1449
("src", "src2", b"src-id", src_ie),
1451
new_inv = inv.filter([b'a-id', b'src-id'])
1455
('src/sub', b'sub-id'),
1456
('src/sub/a', b'a-id'),
1457
], [(path, ie.file_id) for path, ie in new_inv.iter_entries()])
1219
1460
class TestCHKInventoryExpand(tests.TestCaseWithMemoryTransport):
1286
1532
for path, entry in inv.iter_entries_by_dir():
1287
1533
layout.append((path, entry.file_id))
1288
1534
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'),
1536
('dir1', b'dir1-id'),
1537
('dir2', b'dir2-id'),
1539
('dir1/sub-dir1', b'sub-dir1-id'),
1540
('dir1/sub-file1', b'sub-file1-id'),
1541
('dir1/sub-file2', b'sub-file2-id'),
1542
('dir1/sub-dir1/subsub-file1', b'subsub-file1-id'),
1543
('dir2/sub2-file1', b'sub2-file1-id'),
1300
1546
def test__getitems(self):
1301
1547
inv = self.make_simple_inventory()
1302
1548
# 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)
1549
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1550
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1551
self.assertFalse(b'sub-file2-id' in inv._fileid_to_entry_cache)
1307
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1553
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)
1555
self.assert_Getitems([b'dir1-id', b'sub-file2-id'], inv,
1556
[b'dir1-id', b'sub-file2-id'])
1557
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1558
self.assertTrue(b'sub-file2-id' in inv._fileid_to_entry_cache)
1314
1560
def test_single_file(self):
1315
1561
inv = self.make_simple_inventory()
1316
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1562
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1318
1564
def test_get_all_parents(self):
1319
1565
inv = self.make_simple_inventory()
1320
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1322
], inv, ['subsub-file1-id'])
1566
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1568
], inv, [b'subsub-file1-id'])
1324
1570
def test_get_children(self):
1325
1571
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'])
1572
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1573
b'sub-file1-id', b'sub-file2-id', b'subsub-file1-id',
1574
], inv, [b'dir1-id'])
1330
1576
def test_from_root(self):
1331
1577
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'])
1578
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'dir2-id', b'sub-dir1-id',
1579
b'sub-file1-id', b'sub-file2-id', b'sub2-file1-id',
1580
b'subsub-file1-id', b'top-id'], inv, [b'TREE_ROOT'])
1336
1582
def test_top_level_file(self):
1337
1583
inv = self.make_simple_inventory()
1338
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1584
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1340
1586
def test_subsub_file(self):
1341
1587
inv = self.make_simple_inventory()
1342
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1343
'subsub-file1-id'], inv, ['subsub-file1-id'])
1588
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1589
b'subsub-file1-id'], inv, [b'subsub-file1-id'])
1345
1591
def test_sub_and_root(self):
1346
1592
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'])
1593
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id', b'top-id',
1594
b'subsub-file1-id'], inv, [b'top-id', b'subsub-file1-id'])
1597
class TestMutableInventoryFromTree(TestCaseWithTransport):
1599
def test_empty(self):
1600
repository = self.make_repository('.')
1601
tree = repository.revision_tree(revision.NULL_REVISION)
1602
inv = mutable_inventory_from_tree(tree)
1603
self.assertEqual(revision.NULL_REVISION, inv.revision_id)
1604
self.assertEqual(0, len(inv))
1606
def test_some_files(self):
1607
wt = self.make_branch_and_tree('.')
1608
self.build_tree(['a'])
1609
wt.add(['a'], [b'thefileid'])
1610
revid = wt.commit("commit")
1611
tree = wt.branch.repository.revision_tree(revid)
1612
inv = mutable_inventory_from_tree(tree)
1613
self.assertEqual(revid, inv.revision_id)
1614
self.assertEqual(2, len(inv))
1615
self.assertEqual("a", inv.get_entry(b'thefileid').name)
1616
# The inventory should be mutable and independent of
1618
self.assertFalse(tree.root_inventory.get_entry(
1619
b'thefileid').executable)
1620
inv.get_entry(b'thefileid').executable = True
1621
self.assertFalse(tree.root_inventory.get_entry(
1622
b'thefileid').executable)