152
152
ie = inventory.make_entry('directory', '', None,
153
153
tree.get_root_id())
154
delta, version_recorded = builder.record_entry_contents(
154
delta, version_recorded, fs_hash = builder.record_entry_contents(
155
155
ie, [parent_tree.inventory], '', tree,
156
156
tree.path_content_summary(''))
157
157
self.assertFalse(version_recorded)
162
162
self.assertEqual(
163
163
('', '', ie.file_id, ie),
165
self.assertEqual(delta, builder.basis_delta[-1])
166
167
self.assertEqual(None, delta)
168
# Directories do not get hashed.
169
self.assertEqual(None, fs_hash)
189
192
# but thats all the current contract guarantees anyway.
190
193
self.assertEqual(rev_id, tree.branch.repository.get_inventory(rev_id).revision_id)
195
def test_record_delete(self):
196
tree = self.make_branch_and_tree(".")
197
self.build_tree(["foo"])
198
tree.add(["foo"], ["foo-id"])
199
rev_id = tree.commit("added foo")
200
# Remove the inventory details for foo-id, because
201
# record_entry_contents ends up copying root verbatim.
202
tree.unversion(["foo-id"])
205
basis = tree.branch.repository.revision_tree(rev_id)
206
builder = tree.branch.get_commit_builder([rev_id])
208
builder.recording_deletes()
209
if builder.record_root_entry is True:
210
parent_invs = [basis.inventory]
211
del basis.inventory.root.children['foo']
212
builder.record_entry_contents(basis.inventory.root,
213
parent_invs, '', tree, tree.path_content_summary(''))
214
builder.record_delete("foo", "foo-id")
215
self.assertEqual(("foo", None, "foo-id", None),
216
builder.basis_delta[-1])
217
builder.finish_inventory()
218
rev_id2 = builder.commit('delete foo')
220
tree.branch.repository.abort_write_group()
224
rev_tree = builder.revision_tree()
226
self.addCleanup(rev_tree.unlock)
227
self.assertFalse(rev_tree.path2id('foo'))
229
def test_record_delete_without_notification(self):
230
tree = self.make_branch_and_tree(".")
231
self.build_tree(["foo"])
232
tree.add(["foo"], ["foo-id"])
233
rev_id = tree.commit("added foo")
236
builder = tree.branch.get_commit_builder([rev_id])
238
self.record_root(builder, tree)
239
self.assertRaises(AssertionError,
240
builder.record_delete, "foo", "foo-id")
242
tree.branch.repository.abort_write_group()
192
246
def test_revision_tree(self):
193
247
tree = self.make_branch_and_tree(".")
194
248
tree.lock_write()
288
342
os.symlink('target', 'link')
289
343
self._add_commit_check_unchanged(tree, 'link')
291
def _add_commit_renamed_check_changed(self, tree, name):
345
def _add_commit_renamed_check_changed(self, tree, name,
346
expect_fs_hash=False):
293
348
tree.rename_one(name, 'new_' + name)
294
self._add_commit_change_check_changed(tree, name, rename)
349
self._add_commit_change_check_changed(tree, name, rename,
350
expect_fs_hash=expect_fs_hash)
296
352
def test_last_modified_revision_after_rename_dir_changes(self):
297
353
# renaming a dir changes the last modified.
303
359
# renaming a file changes the last modified.
304
360
tree = self.make_branch_and_tree('.')
305
361
self.build_tree(['file'])
306
self._add_commit_renamed_check_changed(tree, 'file')
362
self._add_commit_renamed_check_changed(tree, 'file',
308
365
def test_last_modified_revision_after_rename_link_changes(self):
309
366
# renaming a link changes the last modified.
312
369
os.symlink('target', 'link')
313
370
self._add_commit_renamed_check_changed(tree, 'link')
315
def _add_commit_reparent_check_changed(self, tree, name):
372
def _add_commit_reparent_check_changed(self, tree, name,
373
expect_fs_hash=False):
316
374
self.build_tree(['newparent/'])
317
375
tree.add(['newparent'])
319
377
tree.rename_one(name, 'newparent/new_' + name)
320
self._add_commit_change_check_changed(tree, name, reparent)
378
self._add_commit_change_check_changed(tree, name, reparent,
379
expect_fs_hash=expect_fs_hash)
322
381
def test_last_modified_revision_after_reparent_dir_changes(self):
323
382
# reparenting a dir changes the last modified.
329
388
# reparenting a file changes the last modified.
330
389
tree = self.make_branch_and_tree('.')
331
390
self.build_tree(['file'])
332
self._add_commit_reparent_check_changed(tree, 'file')
391
self._add_commit_reparent_check_changed(tree, 'file',
334
394
def test_last_modified_revision_after_reparent_link_changes(self):
335
395
# reparenting a link changes the last modified.
338
398
os.symlink('target', 'link')
339
399
self._add_commit_reparent_check_changed(tree, 'link')
341
def _add_commit_change_check_changed(self, tree, name, changer):
401
def _add_commit_change_check_changed(self, tree, name, changer,
402
expect_fs_hash=False):
342
403
tree.add([name], [name + 'id'])
343
404
rev1 = tree.commit('')
345
rev2 = self.mini_commit(tree, name, tree.id2path(name + 'id'))
406
rev2 = self.mini_commit(tree, name, tree.id2path(name + 'id'),
407
expect_fs_hash=expect_fs_hash)
346
408
tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
347
409
self.assertEqual(rev1, tree1.inventory[name + 'id'].revision)
348
410
self.assertEqual(rev2, tree2.inventory[name + 'id'].revision)
353
415
self.assertFileGraph(expected_graph, tree, (file_id, rev2))
355
417
def mini_commit(self, tree, name, new_name, records_version=True,
356
delta_against_basis=True):
418
delta_against_basis=True, expect_fs_hash=False):
357
419
"""Perform a miniature commit looking for record entry results.
359
421
:param tree: The tree to commit.
396
460
commit_id(parent_id)
397
461
# because a change of some sort is meant to have occurred,
398
462
# recording the entry must return True.
399
delta, version_recorded = commit_id(file_id)
463
delta, version_recorded, fs_hash = commit_id(file_id)
400
464
if records_version:
401
465
self.assertTrue(version_recorded)
403
467
self.assertFalse(version_recorded)
469
tree_file_stat = tree.get_file_with_stat(file_id)
470
tree_file_stat[0].close()
471
self.assertEqual(2, len(fs_hash))
472
self.assertEqual(tree.get_file_sha1(file_id), fs_hash[0])
473
self.assertEqualStat(tree_file_stat[1], fs_hash[1])
475
self.assertEqual(None, fs_hash)
404
476
new_entry = builder.new_inventory[file_id]
405
477
if delta_against_basis:
406
478
expected_delta = (name, new_name, file_id, new_entry)
479
self.assertEqual(expected_delta, builder.basis_delta[-1])
408
481
expected_delta = None
409
if expected_delta != delta:
410
import pdb;pdb.set_trace()
411
482
self.assertEqual(expected_delta, delta)
412
483
builder.finish_inventory()
413
484
rev2 = builder.commit('')
435
506
self.build_tree(['file'])
436
507
def change_file():
437
508
tree.put_file_bytes_non_atomic('fileid', 'new content')
438
self._add_commit_change_check_changed(tree, 'file', change_file)
509
self._add_commit_change_check_changed(tree, 'file', change_file,
440
512
def test_last_modified_revision_after_content_link_changes(self):
441
513
# changing a link changes the last modified.
456
528
tree.rename_one(name, 'new_' + name)
457
529
return tree.commit('')
459
def _commit_sprout_rename_merge(self, tree1, name):
531
def _commit_sprout_rename_merge(self, tree1, name, expect_fs_hash=False):
460
532
rev1, tree2 = self._commit_sprout(tree1, name)
461
533
# change both sides equally
462
534
rev2 = self._rename_in_tree(tree1, name)
463
535
rev3 = self._rename_in_tree(tree2, name)
464
536
tree1.merge_from_branch(tree2.branch)
465
rev4 = self.mini_commit(tree1, 'new_' + name, 'new_' + name)
537
rev4 = self.mini_commit(tree1, 'new_' + name, 'new_' + name,
538
expect_fs_hash=expect_fs_hash)
466
539
tree3, = self._get_revtrees(tree1, [rev4])
467
540
self.assertEqual(rev4, tree3.inventory[name + 'id'].revision)
468
541
file_id = name + 'id'
483
556
# merge a file changes the last modified.
484
557
tree1 = self.make_branch_and_tree('t1')
485
558
self.build_tree(['t1/file'])
486
self._commit_sprout_rename_merge(tree1, 'file')
559
self._commit_sprout_rename_merge(tree1, 'file', expect_fs_hash=True)
488
561
def test_last_modified_revision_after_merge_link_changes(self):
489
562
# merge a link changes the last modified.
535
608
self.requireFeature(tests.SymlinkFeature)
536
609
os.symlink('target', name)
538
def _check_kind_change(self, make_before, make_after):
611
def _check_kind_change(self, make_before, make_after, expect_fs_hash=False):
539
612
tree = self.make_branch_and_tree('.')
541
614
make_before(path)
544
617
osutils.delete_any(path)
547
self._add_commit_change_check_changed(tree, path, change_kind)
620
self._add_commit_change_check_changed(tree, path, change_kind,
621
expect_fs_hash=expect_fs_hash)
549
623
def test_last_modified_dir_file(self):
550
self._check_kind_change(self.make_dir, self.make_file)
624
self._check_kind_change(self.make_dir, self.make_file,
552
627
def test_last_modified_dir_link(self):
553
628
self._check_kind_change(self.make_dir, self.make_link)
555
630
def test_last_modified_link_file(self):
556
self._check_kind_change(self.make_link, self.make_file)
631
self._check_kind_change(self.make_link, self.make_file,
558
634
def test_last_modified_link_dir(self):
559
635
self._check_kind_change(self.make_link, self.make_dir)