130
200
allow safety checks made by the WT to succeed, and finally ensures that all
131
201
items in the delta with a new path are present in the WT before calling
132
202
update_basis_by_delta.
134
204
:param basis: An inventory to be used as the basis.
135
205
:param delta: The inventory delta to apply:
136
206
:return: An inventory resulting from the application.
138
control = self.make_bzrdir('tree', format=self.format._matchingbzrdir)
208
control = test.make_controldir('tree', format=test.format._matchingcontroldir)
139
209
control.create_repository()
140
210
control.create_branch()
141
tree = self.format.initialize(control)
211
tree = test.format.initialize(control)
142
212
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()
214
target_entries = _create_repo_revisions(tree.branch.repository, basis,
215
delta, invalid_delta)
164
216
# Set the basis state as the trees current state
165
217
tree._write_inventory(basis)
166
218
# This reads basis from the repo and puts it into the tree's local
167
219
# 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):
220
tree.set_parent_ids([b'basis'])
197
223
# Fresh lock, reads disk again.
200
tree.update_basis_by_delta('result', delta)
224
with tree.lock_write():
225
tree.update_basis_by_delta(b'result', delta)
226
if not invalid_delta:
203
228
# reload tree - ensure we get what was written.
204
tree = tree.bzrdir.open_workingtree()
229
tree = tree.controldir.open_workingtree()
205
230
basis_tree = tree.basis_tree()
206
231
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):
232
test.addCleanup(basis_tree.unlock)
233
basis_inv = basis_tree.root_inventory
235
basis_entries = list(basis_inv.iter_entries_by_dir())
236
test.assertEqual(target_entries, basis_entries)
240
def apply_inventory_Repository_add_inventory_by_delta(self, basis, delta,
215
242
"""Apply delta to basis and return the result.
217
244
This inserts basis as a whole inventory and then uses
222
249
:return: An inventory resulting from the application.
224
251
format = self.format()
225
control = self.make_bzrdir('tree', format=format._matchingbzrdir)
252
control = self.make_controldir('tree', format=format._matchingcontroldir)
226
253
repo = format.initialize(control)
254
with repo.lock_write():
229
255
repo.start_write_group()
231
rev = revision.Revision('basis', timestamp=0, timezone=None,
257
rev = revision.Revision(b'basis', timestamp=0, timezone=None,
232
258
message="", committer="foo@example.com")
233
basis.revision_id = 'basis'
259
basis.revision_id = b'basis'
234
260
create_texts_for_inv(repo, basis)
235
repo.add_revision('basis', rev, basis)
261
repo.add_revision(b'basis', rev, basis)
236
262
repo.commit_write_group()
238
264
repo.abort_write_group()
266
with repo.lock_write():
244
267
repo.start_write_group()
246
inv_sha1 = repo.add_inventory_by_delta('basis', delta,
269
inv_sha1 = repo.add_inventory_by_delta(b'basis', delta,
270
b'result', [b'basis'])
249
272
repo.abort_write_group()
252
275
repo.commit_write_group()
255
276
# Fresh lock, reads disk again.
256
repo = repo.bzrdir.open_repository()
277
repo = repo.controldir.open_repository()
258
279
self.addCleanup(repo.unlock)
259
return repo.get_inventory('result')
280
return repo.get_inventory(b'result')
262
283
class TestInventoryUpdates(TestCase):
264
285
def test_creation_from_root_id(self):
265
286
# iff a root id is passed to the constructor, a root directory is made
266
inv = inventory.Inventory(root_id='tree-root')
287
inv = inventory.Inventory(root_id=b'tree-root')
267
288
self.assertNotEqual(None, inv.root)
268
self.assertEqual('tree-root', inv.root.file_id)
289
self.assertEqual(b'tree-root', inv.root.file_id)
270
291
def test_add_path_of_root(self):
271
292
# if no root id is given at creation time, there is no root directory
272
293
inv = inventory.Inventory(root_id=None)
273
294
self.assertIs(None, inv.root)
274
295
# 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)
296
ie = inv.add_path(u"", "directory", b"my-root")
297
ie.revision = b'test-rev'
298
self.assertEqual(b"my-root", ie.file_id)
278
299
self.assertIs(ie, inv.root)
280
301
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)
302
inv = inventory.Inventory(root_id=b'tree_root')
303
ie = inv.add_path(u'hello', 'file', b'hello-id')
304
self.assertEqual(b'hello-id', ie.file_id)
284
305
self.assertEqual('file', ie.kind)
286
307
def test_copy(self):
287
308
"""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')
309
inv = inventory.Inventory(root_id=b'some-tree-root')
310
ie = inv.add_path(u'hello', 'file', b'hello-id')
290
311
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)
312
inv.root.file_id = b'some-new-root'
314
self.assertEqual(b'some-tree-root', inv2.root.file_id)
315
self.assertEqual(u'hello', inv2.get_entry(b'hello-id').name)
296
317
def test_copy_empty(self):
297
318
"""Make sure an empty inventory can be copied."""
360
391
def test_None_file_id(self):
361
392
inv = self.get_empty_inventory()
362
dir1 = inventory.InventoryDirectory(None, 'dir1', inv.root.file_id)
363
dir1.revision = 'result'
393
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
395
dir1.revision = b'result'
364
396
delta = [(None, u'dir1', None, dir1)]
365
397
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
368
400
def test_unicode_file_id(self):
369
401
inv = self.get_empty_inventory()
370
dir1 = inventory.InventoryDirectory(u'dirid', 'dir1', inv.root.file_id)
371
dir1.revision = 'result'
402
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
403
dir1.file_id = u'dirid'
404
dir1.revision = b'result'
372
405
delta = [(None, u'dir1', dir1.file_id, dir1)]
373
406
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
376
409
def test_repeated_file_id(self):
377
410
inv = self.get_empty_inventory()
378
file1 = inventory.InventoryFile('id', 'path1', inv.root.file_id)
379
file1.revision = 'result'
411
file1 = inventory.InventoryFile(b'id', 'path1', inv.root.file_id)
412
file1.revision = b'result'
380
413
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)]
414
file1.text_sha1 = b""
417
delta = [(None, u'path1', b'id', file1), (None, u'path2', b'id', file2)]
387
418
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
390
421
def test_repeated_new_path(self):
391
422
inv = self.get_empty_inventory()
392
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
393
file1.revision = 'result'
423
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
424
file1.revision = b'result'
394
425
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)]
426
file1.text_sha1 = b""
428
file2.file_id = b'id2'
429
delta = [(None, u'path', b'id1', file1), (None, u'path', b'id2', file2)]
401
430
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
404
433
def test_repeated_old_path(self):
405
434
inv = self.get_empty_inventory()
406
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
407
file1.revision = 'result'
435
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
436
file1.revision = b'result'
408
437
file1.text_size = 0
438
file1.text_sha1 = b""
410
439
# We can't *create* a source inventory with the same path, but
411
440
# a badly generated partial delta might claim the same source twice.
412
441
# This would be buggy in two ways: the path is repeated in the delta,
413
442
# And the path for one of the file ids doesn't match the source
414
443
# location. Alternatively, we could have a repeated fileid, but that
415
444
# is separately checked for.
416
file2 = inventory.InventoryFile('id2', 'path2', inv.root.file_id)
417
file2.revision = 'result'
445
file2 = inventory.InventoryFile(b'id2', 'path2', inv.root.file_id)
446
file2.revision = b'result'
418
447
file2.text_size = 0
448
file2.text_sha1 = b""
422
delta = [(u'path', None, 'id1', None), (u'path', None, 'id2', None)]
451
delta = [(u'path', None, b'id1', None), (u'path', None, b'id2', None)]
423
452
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
426
455
def test_mismatched_id_entry_id(self):
427
456
inv = self.get_empty_inventory()
428
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
429
file1.revision = 'result'
457
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
458
file1.revision = b'result'
430
459
file1.text_size = 0
432
delta = [(None, u'path', 'id', file1)]
460
file1.text_sha1 = b""
461
delta = [(None, u'path', b'id', file1)]
433
462
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
436
465
def test_mismatched_new_path_entry_None(self):
437
466
inv = self.get_empty_inventory()
438
delta = [(None, u'path', 'id', None)]
467
delta = [(None, u'path', b'id', None)]
439
468
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
442
471
def test_mismatched_new_path_None_entry(self):
443
472
inv = self.get_empty_inventory()
444
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
445
file1.revision = 'result'
473
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
474
file1.revision = b'result'
446
475
file1.text_size = 0
448
delta = [(u"path", None, 'id1', file1)]
476
file1.text_sha1 = b""
477
delta = [(u"path", None, b'id1', file1)]
449
478
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
452
481
def test_parent_is_not_directory(self):
453
482
inv = self.get_empty_inventory()
454
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
455
file1.revision = 'result'
483
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
484
file1.revision = b'result'
456
485
file1.text_size = 0
458
file2 = inventory.InventoryFile('id2', 'path2', 'id1')
459
file2.revision = 'result'
486
file1.text_sha1 = b""
487
file2 = inventory.InventoryFile(b'id2', 'path2', b'id1')
488
file2.revision = b'result'
460
489
file2.text_size = 0
490
file2.text_sha1 = b""
463
delta = [(None, u'path/path2', 'id2', file2)]
492
delta = [(None, u'path/path2', b'id2', file2)]
464
493
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
467
496
def test_parent_is_missing(self):
468
497
inv = self.get_empty_inventory()
469
file2 = inventory.InventoryFile('id2', 'path2', 'missingparent')
470
file2.revision = 'result'
498
file2 = inventory.InventoryFile(b'id2', 'path2', 'missingparent')
499
file2.revision = b'result'
471
500
file2.text_size = 0
473
delta = [(None, u'path/path2', 'id2', file2)]
501
file2.text_sha1 = b""
502
delta = [(None, u'path/path2', b'id2', file2)]
474
503
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
477
506
def test_new_parent_path_has_wrong_id(self):
478
507
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'
508
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
509
parent1.revision = b'result'
510
parent2 = inventory.InventoryDirectory(b'p-2', 'dir2', inv.root.file_id)
511
parent2.revision = b'result'
512
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
513
file1.revision = b'result'
485
514
file1.text_size = 0
515
file1.text_sha1 = b""
489
518
# This delta claims that file1 is at dir/path, but actually its at
490
519
# dir2/path if you follow the inventory parent structure.
491
delta = [(None, u'dir/path', 'id', file1)]
520
delta = [(None, u'dir/path', b'id', file1)]
492
521
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
495
524
def test_old_parent_path_is_wrong(self):
496
525
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'
526
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
527
parent1.revision = b'result'
528
parent2 = inventory.InventoryDirectory(b'p-2', 'dir2', inv.root.file_id)
529
parent2.revision = b'result'
530
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
531
file1.revision = b'result'
503
532
file1.text_size = 0
533
file1.text_sha1 = b""
508
537
# This delta claims that file1 was at dir/path, but actually it was at
509
538
# dir2/path if you follow the inventory parent structure.
510
delta = [(u'dir/path', None, 'id', None)]
539
delta = [(u'dir/path', None, b'id', None)]
511
540
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
514
543
def test_old_parent_path_is_for_other_id(self):
515
544
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'
545
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
546
parent1.revision = b'result'
547
parent2 = inventory.InventoryDirectory(b'p-2', 'dir2', inv.root.file_id)
548
parent2.revision = b'result'
549
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
550
file1.revision = b'result'
522
551
file1.text_size = 0
524
file2 = inventory.InventoryFile('id2', 'path', 'p-1')
525
file2.revision = 'result'
552
file1.text_sha1 = b""
553
file2 = inventory.InventoryFile(b'id2', 'path', b'p-1')
554
file2.revision = b'result'
526
555
file2.text_size = 0
556
file2.text_sha1 = b""
532
561
# This delta claims that file1 was at dir/path, but actually it was at
533
562
# dir2/path if you follow the inventory parent structure. At dir/path
534
563
# is another entry we should not delete.
535
delta = [(u'dir/path', None, 'id', None)]
564
delta = [(u'dir/path', None, b'id', None)]
536
565
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
539
568
def test_add_existing_id_new_path(self):
540
569
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'
570
parent1 = inventory.InventoryDirectory(b'p-1', 'dir1', inv.root.file_id)
571
parent1.revision = b'result'
572
parent2 = inventory.InventoryDirectory(b'p-1', 'dir2', inv.root.file_id)
573
parent2.revision = b'result'
546
delta = [(None, u'dir2', 'p-1', parent2)]
575
delta = [(None, u'dir2', b'p-1', parent2)]
547
576
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
550
579
def test_add_new_id_existing_path(self):
551
580
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'
581
parent1 = inventory.InventoryDirectory(b'p-1', 'dir1', inv.root.file_id)
582
parent1.revision = b'result'
583
parent2 = inventory.InventoryDirectory(b'p-2', 'dir1', inv.root.file_id)
584
parent2.revision = b'result'
557
delta = [(None, u'dir1', 'p-2', parent2)]
586
delta = [(None, u'dir1', b'p-2', parent2)]
558
587
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
561
590
def test_remove_dir_leaving_dangling_child(self):
562
591
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'
592
dir1 = inventory.InventoryDirectory(b'p-1', 'dir1', inv.root.file_id)
593
dir1.revision = b'result'
594
dir2 = inventory.InventoryDirectory(b'p-2', 'child1', b'p-1')
595
dir2.revision = b'result'
596
dir3 = inventory.InventoryDirectory(b'p-3', 'child2', b'p-1')
597
dir3.revision = b'result'
572
delta = [(u'dir1', None, 'p-1', None),
573
(u'dir1/child2', None, 'p-3', None)]
601
delta = [(u'dir1', None, b'p-1', None),
602
(u'dir1/child2', None, b'p-3', None)]
574
603
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
578
class TestInventory(TestCase):
606
def test_add_file(self):
607
inv = self.get_empty_inventory()
608
file1 = inventory.InventoryFile(b'file-id', 'path', inv.root.file_id)
609
file1.revision = b'result'
611
file1.text_sha1 = b''
612
delta = [(None, u'path', b'file-id', file1)]
613
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
614
self.assertEqual(b'file-id', res_inv.get_entry(b'file-id').file_id)
616
def test_remove_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''
623
delta = [(u'path', None, b'file-id', None)]
624
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
625
self.assertEqual(None, res_inv.path2id('path'))
626
self.assertRaises(errors.NoSuchId, res_inv.id2path, b'file-id')
628
def test_rename_file(self):
629
inv = self.get_empty_inventory()
630
file1 = self.make_file_ie(name='path', parent_id=inv.root.file_id)
632
file2 = self.make_file_ie(name='path2', parent_id=inv.root.file_id)
633
delta = [(u'path', 'path2', b'file-id', file2)]
634
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
635
self.assertEqual(None, res_inv.path2id('path'))
636
self.assertEqual(b'file-id', res_inv.path2id('path2'))
638
def test_replaced_at_new_path(self):
639
inv = self.get_empty_inventory()
640
file1 = self.make_file_ie(file_id=b'id1', parent_id=inv.root.file_id)
642
file2 = self.make_file_ie(file_id=b'id2', parent_id=inv.root.file_id)
643
delta = [(u'name', None, b'id1', None),
644
(None, u'name', b'id2', file2)]
645
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
646
self.assertEqual(b'id2', res_inv.path2id('name'))
648
def test_rename_dir(self):
649
inv = self.get_empty_inventory()
650
dir1 = inventory.InventoryDirectory(b'dir-id', 'dir1', inv.root.file_id)
651
dir1.revision = b'basis'
652
file1 = self.make_file_ie(parent_id=b'dir-id')
655
dir2 = inventory.InventoryDirectory(b'dir-id', 'dir2', inv.root.file_id)
656
dir2.revision = b'result'
657
delta = [('dir1', 'dir2', b'dir-id', dir2)]
658
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
659
# The file should be accessible under the new path
660
self.assertEqual(b'file-id', res_inv.path2id('dir2/name'))
662
def test_renamed_dir_with_renamed_child(self):
663
inv = self.get_empty_inventory()
664
dir1 = inventory.InventoryDirectory(b'dir-id', 'dir1', inv.root.file_id)
665
dir1.revision = b'basis'
666
file1 = self.make_file_ie(b'file-id-1', 'name1', parent_id=b'dir-id')
667
file2 = self.make_file_ie(b'file-id-2', 'name2', parent_id=b'dir-id')
671
dir2 = inventory.InventoryDirectory(b'dir-id', 'dir2', inv.root.file_id)
672
dir2.revision = b'result'
673
file2b = self.make_file_ie(b'file-id-2', 'name2', inv.root.file_id)
674
delta = [('dir1', 'dir2', b'dir-id', dir2),
675
('dir1/name2', 'name2', b'file-id-2', file2b)]
676
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
677
# The file should be accessible under the new path
678
self.assertEqual(b'file-id-1', res_inv.path2id('dir2/name1'))
679
self.assertEqual(None, res_inv.path2id('dir2/name2'))
680
self.assertEqual(b'file-id-2', res_inv.path2id('name2'))
580
682
def test_is_root(self):
581
683
"""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'))
684
inv = inventory.Inventory(b'TREE_ROOT')
685
self.assertTrue(inv.is_root(b'TREE_ROOT'))
686
self.assertFalse(inv.is_root(b'booga'))
687
inv.root.file_id = b'booga'
688
self.assertFalse(inv.is_root(b'TREE_ROOT'))
689
self.assertTrue(inv.is_root(b'booga'))
588
690
# works properly even if no root is set
590
self.assertFalse(inv.is_root('TREE_ROOT'))
591
self.assertFalse(inv.is_root('booga'))
692
self.assertFalse(inv.is_root(b'TREE_ROOT'))
693
self.assertFalse(inv.is_root(b'booga'))
695
def test_entries_for_empty_inventory(self):
696
"""Test that entries() will not fail for an empty inventory"""
697
inv = Inventory(root_id=None)
698
self.assertEqual([], inv.entries())
594
701
class TestInventoryEntry(TestCase):
703
def test_file_invalid_entry_name(self):
704
self.assertRaises(errors.InvalidEntryName, inventory.InventoryFile,
705
b'123', 'a/hello.c', ROOT_ID)
707
def test_file_backslash(self):
708
file = inventory.InventoryFile(b'123', 'h\\ello.c', ROOT_ID)
709
self.assertEquals(file.name, 'h\\ello.c')
596
711
def test_file_kind_character(self):
597
file = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
712
file = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
598
713
self.assertEqual(file.kind_character(), '')
600
715
def test_dir_kind_character(self):
601
dir = inventory.InventoryDirectory('123', 'hello.c', ROOT_ID)
716
dir = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
602
717
self.assertEqual(dir.kind_character(), '/')
604
719
def test_link_kind_character(self):
605
dir = inventory.InventoryLink('123', 'hello.c', ROOT_ID)
720
dir = inventory.InventoryLink(b'123', 'hello.c', ROOT_ID)
606
721
self.assertEqual(dir.kind_character(), '')
608
723
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'
724
left = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
725
right = inventory.InventoryDirectory(b'123', 'hello.c', ROOT_ID)
616
726
self.assertEqual((False, False), left.detect_changes(right))
617
727
self.assertEqual((False, False), right.detect_changes(left))
619
729
def test_file_detect_changes(self):
620
left = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
730
left = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
621
731
left.text_sha1 = 123
622
right = inventory.InventoryFile('123', 'hello.c', ROOT_ID)
732
right = inventory.InventoryFile(b'123', 'hello.c', ROOT_ID)
623
733
right.text_sha1 = 123
624
734
self.assertEqual((False, False), left.detect_changes(right))
625
735
self.assertEqual((False, False), right.detect_changes(left))
748
855
def read_bytes(self, chk_bytes, key):
749
856
stream = chk_bytes.get_record_stream([key], 'unordered', True)
750
return stream.next().get_bytes_as("fulltext")
857
return next(stream).get_bytes_as("fulltext")
752
859
def test_deserialise_gives_CHKInventory(self):
753
860
inv = Inventory()
754
inv.revision_id = "revid"
755
inv.root.revision = "rootrev"
861
inv.revision_id = b"revid"
862
inv.root.revision = b"rootrev"
756
863
chk_bytes = self.get_chk_bytes()
757
864
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)
865
bytes = b''.join(chk_inv.to_lines())
866
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
867
self.assertEqual(b"revid", new_inv.revision_id)
761
868
self.assertEqual("directory", new_inv.root.kind)
762
869
self.assertEqual(inv.root.file_id, new_inv.root.file_id)
763
870
self.assertEqual(inv.root.parent_id, new_inv.root.parent_id)
764
871
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)
872
self.assertEqual(b"rootrev", new_inv.root.revision)
873
self.assertEqual(b'plain', new_inv._search_key_name)
768
875
def test_deserialise_wrong_revid(self):
769
876
inv = Inventory()
770
inv.revision_id = "revid"
771
inv.root.revision = "rootrev"
877
inv.revision_id = b"revid"
878
inv.root.revision = b"rootrev"
772
879
chk_bytes = self.get_chk_bytes()
773
880
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
774
bytes = ''.join(chk_inv.to_lines())
881
bytes = b''.join(chk_inv.to_lines())
775
882
self.assertRaises(ValueError, CHKInventory.deserialise, chk_bytes,
778
885
def test_captures_rev_root_byid(self):
779
886
inv = Inventory()
780
inv.revision_id = "foo"
781
inv.root.revision = "bar"
887
inv.revision_id = b"foo"
888
inv.root.revision = b"bar"
782
889
chk_bytes = self.get_chk_bytes()
783
890
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
784
891
lines = chk_inv.to_lines()
785
892
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',
894
b'revision_id: foo\n',
895
b'root_id: TREE_ROOT\n',
896
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
897
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)
899
chk_inv = CHKInventory.deserialise(chk_bytes, b''.join(lines), (b'foo',))
900
self.assertEqual(b'plain', chk_inv._search_key_name)
795
902
def test_captures_parent_id_basename_index(self):
796
903
inv = Inventory()
797
inv.revision_id = "foo"
798
inv.root.revision = "bar"
904
inv.revision_id = b"foo"
905
inv.root.revision = b"bar"
799
906
chk_bytes = self.get_chk_bytes()
800
907
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
801
908
lines = chk_inv.to_lines()
802
909
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',
911
b'revision_id: foo\n',
912
b'root_id: TREE_ROOT\n',
913
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
914
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)
916
chk_inv = CHKInventory.deserialise(chk_bytes, b''.join(lines), (b'foo',))
917
self.assertEqual(b'plain', chk_inv._search_key_name)
812
919
def test_captures_search_key_name(self):
813
920
inv = Inventory()
814
inv.revision_id = "foo"
815
inv.root.revision = "bar"
921
inv.revision_id = b"foo"
922
inv.root.revision = b"bar"
816
923
chk_bytes = self.get_chk_bytes()
817
924
chk_inv = CHKInventory.from_inventory(chk_bytes, inv,
818
search_key_name='hash-16-way')
925
search_key_name=b'hash-16-way')
819
926
lines = chk_inv.to_lines()
820
927
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',
929
b'search_key_name: hash-16-way\n',
930
b'root_id: TREE_ROOT\n',
931
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
932
b'revision_id: foo\n',
933
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)
935
chk_inv = CHKInventory.deserialise(chk_bytes, b''.join(lines), (b'foo',))
936
self.assertEqual(b'hash-16-way', chk_inv._search_key_name)
831
938
def test_directory_children_on_demand(self):
832
939
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
940
inv.revision_id = b"revid"
941
inv.root.revision = b"rootrev"
942
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
943
inv.get_entry(b"fileid").revision = b"filerev"
944
inv.get_entry(b"fileid").executable = True
945
inv.get_entry(b"fileid").text_sha1 = b"ffff"
946
inv.get_entry(b"fileid").text_size = 1
840
947
chk_bytes = self.get_chk_bytes()
841
948
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]
949
bytes = b''.join(chk_inv.to_lines())
950
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
951
root_entry = new_inv.get_entry(inv.root.file_id)
845
952
self.assertEqual(None, root_entry._children)
846
self.assertEqual(['file'], root_entry.children.keys())
847
file_direct = new_inv["fileid"]
953
self.assertEqual({'file'}, set(root_entry.children))
954
file_direct = new_inv.get_entry(b"fileid")
848
955
file_found = root_entry.children['file']
849
956
self.assertEqual(file_direct.kind, file_found.kind)
850
957
self.assertEqual(file_direct.file_id, file_found.file_id)
870
977
self.assertEqual(120, p_id_basename._root_node.maximum_size)
871
978
self.assertEqual(2, p_id_basename._root_node._key_width)
873
def test___iter__(self):
980
def test_iter_all_ids(self):
874
981
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
982
inv.revision_id = b"revid"
983
inv.root.revision = b"rootrev"
984
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
985
inv.get_entry(b"fileid").revision = b"filerev"
986
inv.get_entry(b"fileid").executable = True
987
inv.get_entry(b"fileid").text_sha1 = b"ffff"
988
inv.get_entry(b"fileid").text_size = 1
882
989
chk_bytes = self.get_chk_bytes()
883
990
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)
991
bytes = b''.join(chk_inv.to_lines())
992
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
993
fileids = sorted(new_inv.iter_all_ids())
994
self.assertEqual([inv.root.file_id, b"fileid"], fileids)
890
996
def test__len__(self):
891
997
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
998
inv.revision_id = b"revid"
999
inv.root.revision = b"rootrev"
1000
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1001
inv.get_entry(b"fileid").revision = b"filerev"
1002
inv.get_entry(b"fileid").executable = True
1003
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1004
inv.get_entry(b"fileid").text_size = 1
899
1005
chk_bytes = self.get_chk_bytes()
900
1006
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
901
1007
self.assertEqual(2, len(chk_inv))
903
def test___getitem__(self):
1009
def test_get_entry(self):
904
1010
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
1011
inv.revision_id = b"revid"
1012
inv.root.revision = b"rootrev"
1013
inv.add(InventoryFile(b"fileid", u"file", inv.root.file_id))
1014
inv.get_entry(b"fileid").revision = b"filerev"
1015
inv.get_entry(b"fileid").executable = True
1016
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1017
inv.get_entry(b"fileid").text_size = 1
912
1018
chk_bytes = self.get_chk_bytes()
913
1019
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"]
1020
data = b''.join(chk_inv.to_lines())
1021
new_inv = CHKInventory.deserialise(chk_bytes, data, (b"revid",))
1022
root_entry = new_inv.get_entry(inv.root.file_id)
1023
file_entry = new_inv.get_entry(b"fileid")
918
1024
self.assertEqual("directory", root_entry.kind)
919
1025
self.assertEqual(inv.root.file_id, root_entry.file_id)
920
1026
self.assertEqual(inv.root.parent_id, root_entry.parent_id)
921
1027
self.assertEqual(inv.root.name, root_entry.name)
922
self.assertEqual("rootrev", root_entry.revision)
1028
self.assertEqual(b"rootrev", root_entry.revision)
923
1029
self.assertEqual("file", file_entry.kind)
924
self.assertEqual("fileid", file_entry.file_id)
1030
self.assertEqual(b"fileid", file_entry.file_id)
925
1031
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)
1032
self.assertEqual(u"file", file_entry.name)
1033
self.assertEqual(b"filerev", file_entry.revision)
1034
self.assertEqual(b"ffff", file_entry.text_sha1)
929
1035
self.assertEqual(1, file_entry.text_size)
930
1036
self.assertEqual(True, file_entry.executable)
931
self.assertRaises(errors.NoSuchId, new_inv.__getitem__, 'missing')
1037
self.assertRaises(errors.NoSuchId, new_inv.get_entry, 'missing')
933
1039
def test_has_id_true(self):
934
1040
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
1041
inv.revision_id = b"revid"
1042
inv.root.revision = b"rootrev"
1043
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1044
inv.get_entry(b"fileid").revision = b"filerev"
1045
inv.get_entry(b"fileid").executable = True
1046
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1047
inv.get_entry(b"fileid").text_size = 1
942
1048
chk_bytes = self.get_chk_bytes()
943
1049
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
944
self.assertTrue(chk_inv.has_id('fileid'))
1050
self.assertTrue(chk_inv.has_id(b'fileid'))
945
1051
self.assertTrue(chk_inv.has_id(inv.root.file_id))
947
1053
def test_has_id_not(self):
948
1054
inv = Inventory()
949
inv.revision_id = "revid"
950
inv.root.revision = "rootrev"
1055
inv.revision_id = b"revid"
1056
inv.root.revision = b"rootrev"
951
1057
chk_bytes = self.get_chk_bytes()
952
1058
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
953
self.assertFalse(chk_inv.has_id('fileid'))
1059
self.assertFalse(chk_inv.has_id(b'fileid'))
955
1061
def test_id2path(self):
956
1062
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")
1063
inv.revision_id = b"revid"
1064
inv.root.revision = b"rootrev"
1065
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1066
fileentry = InventoryFile(b"fileid", "file", b"dirid")
961
1067
inv.add(direntry)
962
1068
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"
1069
inv.get_entry(b"fileid").revision = b"filerev"
1070
inv.get_entry(b"fileid").executable = True
1071
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1072
inv.get_entry(b"fileid").text_size = 1
1073
inv.get_entry(b"dirid").revision = b"filerev"
968
1074
chk_bytes = self.get_chk_bytes()
969
1075
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
970
bytes = ''.join(chk_inv.to_lines())
971
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1076
bytes = b''.join(chk_inv.to_lines())
1077
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
972
1078
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'))
1079
self.assertEqual('dir', new_inv.id2path(b'dirid'))
1080
self.assertEqual('dir/file', new_inv.id2path(b'fileid'))
976
1082
def test_path2id(self):
977
1083
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")
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")
982
1088
inv.add(direntry)
983
1089
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"
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"
989
1095
chk_bytes = self.get_chk_bytes()
990
1096
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
991
bytes = ''.join(chk_inv.to_lines())
992
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",))
993
1099
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'))
1100
self.assertEqual(b'dirid', new_inv.path2id('dir'))
1101
self.assertEqual(b'fileid', new_inv.path2id('dir/file'))
997
1103
def test_create_by_apply_delta_sets_root(self):
998
1104
inv = Inventory()
999
inv.revision_id = "revid"
1105
inv.revision_id = b"revid"
1000
1106
chk_bytes = self.get_chk_bytes()
1001
1107
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1002
inv.add_path("", "directory", "myrootid", None)
1108
inv.add_path("", "directory", b"myrootid", None)
1003
1109
inv.revision_id = "expectedid"
1004
1110
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1005
1111
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)
1112
(None, "", b"myrootid", inv.root)]
1113
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1114
self.assertEqual(reference_inv.root, new_inv.root)
1010
1116
def test_create_by_apply_delta_empty_add_child(self):
1011
1117
inv = Inventory()
1012
inv.revision_id = "revid"
1013
inv.root.revision = "rootrev"
1118
inv.revision_id = b"revid"
1119
inv.root.revision = b"rootrev"
1014
1120
chk_bytes = self.get_chk_bytes()
1015
1121
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1016
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1017
a_entry.revision = "filerev"
1122
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1123
a_entry.revision = b"filerev"
1018
1124
a_entry.executable = True
1019
a_entry.text_sha1 = "ffff"
1125
a_entry.text_sha1 = b"ffff"
1020
1126
a_entry.text_size = 1
1021
1127
inv.add(a_entry)
1022
inv.revision_id = "expectedid"
1128
inv.revision_id = b"expectedid"
1023
1129
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")
1130
delta = [(None, "A", b"A-id", a_entry)]
1131
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1026
1132
# new_inv should be the same as reference_inv.
1027
1133
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1028
1134
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1063
1169
# Low level bootstrapping smoke test; comprehensive generic tests via
1064
1170
# InterTree are coming.
1065
1171
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
1172
inv.revision_id = b"revid"
1173
inv.root.revision = b"rootrev"
1174
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1175
inv.get_entry(b"fileid").revision = b"filerev"
1176
inv.get_entry(b"fileid").executable = True
1177
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1178
inv.get_entry(b"fileid").text_size = 1
1073
1179
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
1180
inv2.revision_id = b"revid2"
1181
inv2.root.revision = b"rootrev"
1182
inv2.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1183
inv2.get_entry(b"fileid").revision = b"filerev2"
1184
inv2.get_entry(b"fileid").executable = False
1185
inv2.get_entry(b"fileid").text_sha1 = b"bbbb"
1186
inv2.get_entry(b"fileid").text_size = 2
1081
1187
# get fresh objects.
1082
1188
chk_bytes = self.get_chk_bytes()
1083
1189
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1084
bytes = ''.join(chk_inv.to_lines())
1085
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1190
bytes = b''.join(chk_inv.to_lines())
1191
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1086
1192
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'),
1193
bytes = b''.join(chk_inv2.to_lines())
1194
inv_2 = CHKInventory.deserialise(chk_bytes, bytes, (b"revid2",))
1195
self.assertEqual([(b'fileid', (u'file', u'file'), True, (True, True),
1196
(b'TREE_ROOT', b'TREE_ROOT'), (u'file', u'file'), ('file', 'file'),
1091
1197
(False, True))],
1092
1198
list(inv_1.iter_changes(inv_2)))
1094
1200
def test_parent_id_basename_to_file_id_index_enabled(self):
1095
1201
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
1202
inv.revision_id = b"revid"
1203
inv.root.revision = b"rootrev"
1204
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1205
inv.get_entry(b"fileid").revision = b"filerev"
1206
inv.get_entry(b"fileid").executable = True
1207
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1208
inv.get_entry(b"fileid").text_size = 1
1103
1209
# get fresh objects.
1104
1210
chk_bytes = self.get_chk_bytes()
1105
1211
tmp_inv = CHKInventory.from_inventory(chk_bytes, inv)
1106
bytes = ''.join(tmp_inv.to_lines())
1107
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1212
bytes = b''.join(tmp_inv.to_lines())
1213
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1108
1214
self.assertIsInstance(chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1109
1215
self.assertEqual(
1110
{('', ''): 'TREE_ROOT', ('TREE_ROOT', 'file'): 'fileid'},
1216
{(b'', b''): b'TREE_ROOT', (b'TREE_ROOT', b'file'): b'fileid'},
1111
1217
dict(chk_inv.parent_id_basename_to_file_id.iteritems()))
1113
1219
def test_file_entry_to_bytes(self):
1114
1220
inv = CHKInventory(None)
1115
ie = inventory.InventoryFile('file-id', 'filename', 'parent-id')
1221
ie = inventory.InventoryFile(b'file-id', 'filename', b'parent-id')
1116
1222
ie.executable = True
1117
ie.revision = 'file-rev-id'
1118
ie.text_sha1 = 'abcdefgh'
1223
ie.revision = b'file-rev-id'
1224
ie.text_sha1 = b'abcdefgh'
1119
1225
ie.text_size = 100
1120
1226
bytes = inv._entry_to_bytes(ie)
1121
self.assertEqual('file: file-id\nparent-id\nfilename\n'
1122
'file-rev-id\nabcdefgh\n100\nY', bytes)
1227
self.assertEqual(b'file: file-id\nparent-id\nfilename\n'
1228
b'file-rev-id\nabcdefgh\n100\nY', bytes)
1123
1229
ie2 = inv._bytes_to_entry(bytes)
1124
1230
self.assertEqual(ie, ie2)
1125
self.assertIsInstance(ie2.name, unicode)
1126
self.assertEqual(('filename', 'file-id', 'file-rev-id'),
1231
self.assertIsInstance(ie2.name, text_type)
1232
self.assertEqual((b'filename', b'file-id', b'file-rev-id'),
1127
1233
inv._bytes_to_utf8name_key(bytes))
1129
1235
def test_file2_entry_to_bytes(self):
1130
1236
inv = CHKInventory(None)
1131
1237
# \u30a9 == 'omega'
1132
ie = inventory.InventoryFile('file-id', u'\u03a9name', 'parent-id')
1238
ie = inventory.InventoryFile(b'file-id', u'\u03a9name', b'parent-id')
1133
1239
ie.executable = False
1134
ie.revision = 'file-rev-id'
1135
ie.text_sha1 = '123456'
1240
ie.revision = b'file-rev-id'
1241
ie.text_sha1 = b'123456'
1136
1242
ie.text_size = 25
1137
1243
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)
1244
self.assertEqual(b'file: file-id\nparent-id\n\xce\xa9name\n'
1245
b'file-rev-id\n123456\n25\nN', bytes)
1140
1246
ie2 = inv._bytes_to_entry(bytes)
1141
1247
self.assertEqual(ie, ie2)
1142
self.assertIsInstance(ie2.name, unicode)
1143
self.assertEqual(('\xce\xa9name', 'file-id', 'file-rev-id'),
1248
self.assertIsInstance(ie2.name, text_type)
1249
self.assertEqual((b'\xce\xa9name', b'file-id', b'file-rev-id'),
1144
1250
inv._bytes_to_utf8name_key(bytes))
1146
1252
def test_dir_entry_to_bytes(self):
1147
1253
inv = CHKInventory(None)
1148
ie = inventory.InventoryDirectory('dir-id', 'dirname', 'parent-id')
1149
ie.revision = 'dir-rev-id'
1254
ie = inventory.InventoryDirectory(b'dir-id', 'dirname', b'parent-id')
1255
ie.revision = b'dir-rev-id'
1150
1256
bytes = inv._entry_to_bytes(ie)
1151
self.assertEqual('dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1257
self.assertEqual(b'dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1152
1258
ie2 = inv._bytes_to_entry(bytes)
1153
1259
self.assertEqual(ie, ie2)
1154
self.assertIsInstance(ie2.name, unicode)
1155
self.assertEqual(('dirname', 'dir-id', 'dir-rev-id'),
1260
self.assertIsInstance(ie2.name, text_type)
1261
self.assertEqual((b'dirname', b'dir-id', b'dir-rev-id'),
1156
1262
inv._bytes_to_utf8name_key(bytes))
1158
1264
def test_dir2_entry_to_bytes(self):
1159
1265
inv = CHKInventory(None)
1160
ie = inventory.InventoryDirectory('dir-id', u'dir\u03a9name',
1266
ie = inventory.InventoryDirectory(b'dir-id', u'dir\u03a9name',
1162
ie.revision = 'dir-rev-id'
1268
ie.revision = b'dir-rev-id'
1163
1269
bytes = inv._entry_to_bytes(ie)
1164
self.assertEqual('dir: dir-id\n\ndir\xce\xa9name\n'
1165
'dir-rev-id', bytes)
1270
self.assertEqual(b'dir: dir-id\n\ndir\xce\xa9name\n'
1271
b'dir-rev-id', bytes)
1166
1272
ie2 = inv._bytes_to_entry(bytes)
1167
1273
self.assertEqual(ie, ie2)
1168
self.assertIsInstance(ie2.name, unicode)
1274
self.assertIsInstance(ie2.name, text_type)
1169
1275
self.assertIs(ie2.parent_id, None)
1170
self.assertEqual(('dir\xce\xa9name', 'dir-id', 'dir-rev-id'),
1276
self.assertEqual((b'dir\xce\xa9name', b'dir-id', b'dir-rev-id'),
1171
1277
inv._bytes_to_utf8name_key(bytes))
1173
1279
def test_symlink_entry_to_bytes(self):
1174
1280
inv = CHKInventory(None)
1175
ie = inventory.InventoryLink('link-id', 'linkname', 'parent-id')
1176
ie.revision = 'link-rev-id'
1281
ie = inventory.InventoryLink(b'link-id', 'linkname', b'parent-id')
1282
ie.revision = b'link-rev-id'
1177
1283
ie.symlink_target = u'target/path'
1178
1284
bytes = inv._entry_to_bytes(ie)
1179
self.assertEqual('symlink: link-id\nparent-id\nlinkname\n'
1180
'link-rev-id\ntarget/path', bytes)
1285
self.assertEqual(b'symlink: link-id\nparent-id\nlinkname\n'
1286
b'link-rev-id\ntarget/path', bytes)
1181
1287
ie2 = inv._bytes_to_entry(bytes)
1182
1288
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'),
1289
self.assertIsInstance(ie2.name, text_type)
1290
self.assertIsInstance(ie2.symlink_target, text_type)
1291
self.assertEqual((b'linkname', b'link-id', b'link-rev-id'),
1186
1292
inv._bytes_to_utf8name_key(bytes))
1188
1294
def test_symlink2_entry_to_bytes(self):
1189
1295
inv = CHKInventory(None)
1190
ie = inventory.InventoryLink('link-id', u'link\u03a9name', 'parent-id')
1191
ie.revision = 'link-rev-id'
1296
ie = inventory.InventoryLink(b'link-id', u'link\u03a9name', b'parent-id')
1297
ie.revision = b'link-rev-id'
1192
1298
ie.symlink_target = u'target/\u03a9path'
1193
1299
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)
1300
self.assertEqual(b'symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1301
b'link-rev-id\ntarget/\xce\xa9path', bytes)
1196
1302
ie2 = inv._bytes_to_entry(bytes)
1197
1303
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'),
1304
self.assertIsInstance(ie2.name, text_type)
1305
self.assertIsInstance(ie2.symlink_target, text_type)
1306
self.assertEqual((b'link\xce\xa9name', b'link-id', b'link-rev-id'),
1201
1307
inv._bytes_to_utf8name_key(bytes))
1203
1309
def test_tree_reference_entry_to_bytes(self):
1204
1310
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'
1311
ie = inventory.TreeReference(b'tree-root-id', u'tree\u03a9name',
1313
ie.revision = b'tree-rev-id'
1314
ie.reference_revision = b'ref-rev-id'
1209
1315
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)
1316
self.assertEqual(b'tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1317
b'tree-rev-id\nref-rev-id', bytes)
1212
1318
ie2 = inv._bytes_to_entry(bytes)
1213
1319
self.assertEqual(ie, ie2)
1214
self.assertIsInstance(ie2.name, unicode)
1215
self.assertEqual(('tree\xce\xa9name', 'tree-root-id', 'tree-rev-id'),
1320
self.assertIsInstance(ie2.name, text_type)
1321
self.assertEqual((b'tree\xce\xa9name', b'tree-root-id', b'tree-rev-id'),
1216
1322
inv._bytes_to_utf8name_key(bytes))
1324
def make_basic_utf8_inventory(self):
1326
inv.revision_id = b"revid"
1327
inv.root.revision = b"rootrev"
1328
root_id = inv.root.file_id
1329
inv.add(InventoryFile(b"fileid", u'f\xefle', root_id))
1330
inv.get_entry(b"fileid").revision = b"filerev"
1331
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1332
inv.get_entry(b"fileid").text_size = 0
1333
inv.add(InventoryDirectory(b"dirid", u'dir-\N{EURO SIGN}', root_id))
1334
inv.add(InventoryFile(b"childid", u'ch\xefld', b"dirid"))
1335
inv.get_entry(b"childid").revision = b"filerev"
1336
inv.get_entry(b"childid").text_sha1 = b"ffff"
1337
inv.get_entry(b"childid").text_size = 0
1338
chk_bytes = self.get_chk_bytes()
1339
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1340
bytes = b''.join(chk_inv.to_lines())
1341
return CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1343
def test__preload_handles_utf8(self):
1344
new_inv = self.make_basic_utf8_inventory()
1345
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1346
self.assertFalse(new_inv._fully_cached)
1347
new_inv._preload_cache()
1349
sorted([new_inv.root_id, b"fileid", b"dirid", b"childid"]),
1350
sorted(new_inv._fileid_to_entry_cache.keys()))
1351
ie_root = new_inv._fileid_to_entry_cache[new_inv.root_id]
1352
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1353
sorted(ie_root._children.keys()))
1354
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1355
self.assertEqual([u'ch\xefld'], sorted(ie_dir._children.keys()))
1357
def test__preload_populates_cache(self):
1359
inv.revision_id = b"revid"
1360
inv.root.revision = b"rootrev"
1361
root_id = inv.root.file_id
1362
inv.add(InventoryFile(b"fileid", "file", root_id))
1363
inv.get_entry(b"fileid").revision = b"filerev"
1364
inv.get_entry(b"fileid").executable = True
1365
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1366
inv.get_entry(b"fileid").text_size = 1
1367
inv.add(InventoryDirectory(b"dirid", "dir", root_id))
1368
inv.add(InventoryFile(b"childid", "child", b"dirid"))
1369
inv.get_entry(b"childid").revision = b"filerev"
1370
inv.get_entry(b"childid").executable = False
1371
inv.get_entry(b"childid").text_sha1 = b"dddd"
1372
inv.get_entry(b"childid").text_size = 1
1373
chk_bytes = self.get_chk_bytes()
1374
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1375
bytes = b''.join(chk_inv.to_lines())
1376
new_inv = CHKInventory.deserialise(chk_bytes, bytes, (b"revid",))
1377
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1378
self.assertFalse(new_inv._fully_cached)
1379
new_inv._preload_cache()
1381
sorted([root_id, b"fileid", b"dirid", b"childid"]),
1382
sorted(new_inv._fileid_to_entry_cache.keys()))
1383
self.assertTrue(new_inv._fully_cached)
1384
ie_root = new_inv._fileid_to_entry_cache[root_id]
1385
self.assertEqual(['dir', 'file'], sorted(ie_root._children.keys()))
1386
ie_dir = new_inv._fileid_to_entry_cache['dirid']
1387
self.assertEqual(['child'], sorted(ie_dir._children.keys()))
1389
def test__preload_handles_partially_evaluated_inventory(self):
1390
new_inv = self.make_basic_utf8_inventory()
1391
ie = new_inv.get_entry(new_inv.root_id)
1392
self.assertIs(None, ie._children)
1393
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1394
sorted(ie.children.keys()))
1395
# Accessing .children loads _children
1396
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1397
sorted(ie._children.keys()))
1398
new_inv._preload_cache()
1400
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1401
sorted(ie._children.keys()))
1402
ie_dir = new_inv.get_entry(b"dirid")
1403
self.assertEqual([u'ch\xefld'],
1404
sorted(ie_dir._children.keys()))
1406
def test_filter_change_in_renamed_subfolder(self):
1407
inv = Inventory(b'tree-root')
1408
src_ie = inv.add_path('src', 'directory', b'src-id')
1409
inv.add_path('src/sub/', 'directory', b'sub-id')
1410
a_ie = inv.add_path('src/sub/a', 'file', b'a-id')
1411
a_ie.text_sha1 = osutils.sha_string(b'content\n')
1412
a_ie.text_size = len(b'content\n')
1413
chk_bytes = self.get_chk_bytes()
1414
inv = CHKInventory.from_inventory(chk_bytes, inv)
1415
inv = inv.create_by_apply_delta([
1416
("src/sub/a", "src/sub/a", b"a-id", a_ie),
1417
("src", "src2", b"src-id", src_ie),
1419
new_inv = inv.filter([b'a-id', b'src-id'])
1423
('src/sub', b'sub-id'),
1424
('src/sub/a', b'a-id'),
1425
], [(path, ie.file_id) for path, ie in new_inv.iter_entries()])
1219
1427
class TestCHKInventoryExpand(tests.TestCaseWithMemoryTransport):
1286
1494
for path, entry in inv.iter_entries_by_dir():
1287
1495
layout.append((path, entry.file_id))
1288
1496
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'),
1498
('dir1', b'dir1-id'),
1499
('dir2', b'dir2-id'),
1501
('dir1/sub-dir1', b'sub-dir1-id'),
1502
('dir1/sub-file1', b'sub-file1-id'),
1503
('dir1/sub-file2', b'sub-file2-id'),
1504
('dir1/sub-dir1/subsub-file1', b'subsub-file1-id'),
1505
('dir2/sub2-file1', b'sub2-file1-id'),
1300
1508
def test__getitems(self):
1301
1509
inv = self.make_simple_inventory()
1302
1510
# 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)
1511
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1512
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1513
self.assertFalse(b'sub-file2-id' in inv._fileid_to_entry_cache)
1307
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1515
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)
1517
self.assert_Getitems([b'dir1-id', b'sub-file2-id'], inv,
1518
[b'dir1-id', b'sub-file2-id'])
1519
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1520
self.assertTrue(b'sub-file2-id' in inv._fileid_to_entry_cache)
1314
1522
def test_single_file(self):
1315
1523
inv = self.make_simple_inventory()
1316
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1524
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, ['top-id'])
1318
1526
def test_get_all_parents(self):
1319
1527
inv = self.make_simple_inventory()
1320
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1322
], inv, ['subsub-file1-id'])
1528
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1530
], inv, [b'subsub-file1-id'])
1324
1532
def test_get_children(self):
1325
1533
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'])
1534
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1535
b'sub-file1-id', b'sub-file2-id', b'subsub-file1-id',
1536
], inv, [b'dir1-id'])
1330
1538
def test_from_root(self):
1331
1539
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'])
1540
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'dir2-id', b'sub-dir1-id',
1541
b'sub-file1-id', b'sub-file2-id', b'sub2-file1-id',
1542
b'subsub-file1-id', b'top-id'], inv, [b'TREE_ROOT'])
1336
1544
def test_top_level_file(self):
1337
1545
inv = self.make_simple_inventory()
1338
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1546
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, ['top-id'])
1340
1548
def test_subsub_file(self):
1341
1549
inv = self.make_simple_inventory()
1342
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1343
'subsub-file1-id'], inv, ['subsub-file1-id'])
1550
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1551
b'subsub-file1-id'], inv, [b'subsub-file1-id'])
1345
1553
def test_sub_and_root(self):
1346
1554
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'])
1555
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id', b'top-id',
1556
b'subsub-file1-id'], inv, ['top-id', b'subsub-file1-id'])
1559
class TestMutableInventoryFromTree(TestCaseWithTransport):
1561
def test_empty(self):
1562
repository = self.make_repository('.')
1563
tree = repository.revision_tree(revision.NULL_REVISION)
1564
inv = mutable_inventory_from_tree(tree)
1565
self.assertEqual(revision.NULL_REVISION, inv.revision_id)
1566
self.assertEqual(0, len(inv))
1568
def test_some_files(self):
1569
wt = self.make_branch_and_tree('.')
1570
self.build_tree(['a'])
1571
wt.add(['a'], [b'thefileid'])
1572
revid = wt.commit("commit")
1573
tree = wt.branch.repository.revision_tree(revid)
1574
inv = mutable_inventory_from_tree(tree)
1575
self.assertEqual(revid, inv.revision_id)
1576
self.assertEqual(2, len(inv))
1577
self.assertEqual("a", inv.get_entry(b'thefileid').name)
1578
# The inventory should be mutable and independent of
1580
self.assertFalse(tree.root_inventory.get_entry(b'thefileid').executable)
1581
inv.get_entry(b'thefileid').executable = True
1582
self.assertFalse(tree.root_inventory.get_entry(b'thefileid').executable)