/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/per_repository/test_commit_builder.py

Merge commit builder changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
151
151
        try:
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),
164
164
                    delta)
 
165
                self.assertEqual(delta, builder.basis_delta[-1])
165
166
            else:
166
167
                self.assertEqual(None, delta)
 
168
            # Directories do not get hashed.
 
169
            self.assertEqual(None, fs_hash)
167
170
            builder.abort()
168
171
        except:
169
172
            builder.abort()
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)
191
194
 
 
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"])
 
203
        tree.lock_write()
 
204
        try:
 
205
            basis = tree.branch.repository.revision_tree(rev_id)
 
206
            builder = tree.branch.get_commit_builder([rev_id])
 
207
            try:
 
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')
 
219
            except:
 
220
                tree.branch.repository.abort_write_group()
 
221
                raise
 
222
        finally:
 
223
            tree.unlock()
 
224
        rev_tree = builder.revision_tree()
 
225
        rev_tree.lock_read()
 
226
        self.addCleanup(rev_tree.unlock)
 
227
        self.assertFalse(rev_tree.path2id('foo'))
 
228
 
 
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")
 
234
        tree.lock_write()
 
235
        try:
 
236
            builder = tree.branch.get_commit_builder([rev_id])
 
237
            try:
 
238
                self.record_root(builder, tree)
 
239
                self.assertRaises(AssertionError,
 
240
                    builder.record_delete, "foo", "foo-id")
 
241
            finally:
 
242
                tree.branch.repository.abort_write_group()
 
243
        finally:
 
244
            tree.unlock()
 
245
 
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')
290
344
 
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):
292
347
        def rename():
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)
295
351
 
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',
 
363
            expect_fs_hash=True)
307
364
 
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')
314
371
 
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'])
318
376
        def reparent():
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)
321
380
 
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',
 
392
            expect_fs_hash=True)
333
393
 
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')
340
400
 
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('')
344
405
        changer()
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))
354
416
 
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.
358
420
        
359
421
        :param tree: The tree to commit.
363
425
            record a new version.
364
426
        :param delta_against_basis: True of the commit of new_name is expected
365
427
            to have a delta against the basis.
 
428
        :param expect_fs_hash: True or false to indicate whether we expect a
 
429
            file hash to be returned from the record_entry_contents call.
366
430
        """
367
431
        tree.lock_write()
368
432
        try:
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)
402
466
            else:
403
467
                self.assertFalse(version_recorded)
 
468
            if expect_fs_hash:
 
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])
 
474
            else:
 
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])
407
480
            else:
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,
 
510
            expect_fs_hash=True)
439
511
 
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('')
458
530
 
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)
487
560
 
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)
537
610
 
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('.')
540
613
        path = 'name'
541
614
        make_before(path)
544
617
            osutils.delete_any(path)
545
618
            make_after(path)
546
619
 
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)
548
622
 
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,
 
625
            expect_fs_hash=True)
551
626
 
552
627
    def test_last_modified_dir_link(self):
553
628
        self._check_kind_change(self.make_dir, self.make_link)
554
629
 
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,
 
632
            expect_fs_hash=True)
557
633
 
558
634
    def test_last_modified_link_dir(self):
559
635
        self._check_kind_change(self.make_link, self.make_dir)