96
92
eq(rev.message, 'add hello')
98
94
tree1 = b.repository.revision_tree(rh[0])
100
95
text = tree1.get_file_text(file_id)
102
self.assertEqual('hello world', text)
96
eq(text, 'hello world')
104
98
tree2 = b.repository.revision_tree(rh[1])
106
text = tree2.get_file_text(file_id)
108
self.assertEqual('version 2', text)
99
eq(tree2.get_file_text(file_id), 'version 2')
110
101
def test_delete_commit(self):
111
102
"""Test a commit with a deleted file"""
121
112
tree = b.repository.revision_tree('rev2')
122
113
self.assertFalse(tree.has_id('hello-id'))
124
def test_partial_commit_move(self):
125
"""Test a partial commit where a file was renamed but not committed.
127
https://bugs.launchpad.net/bzr/+bug/83039
129
If not handled properly, commit will try to snapshot
130
dialog.py with olive/ as a parent, while
131
olive/ has not been snapshotted yet.
133
wt = self.make_branch_and_tree('.')
135
self.build_tree(['annotate/', 'annotate/foo.py',
136
'olive/', 'olive/dialog.py'
138
wt.add(['annotate', 'olive', 'annotate/foo.py', 'olive/dialog.py'])
139
wt.commit(message='add files')
140
wt.rename_one("olive/dialog.py", "aaa")
141
self.build_tree_contents([('annotate/foo.py', 'modified\n')])
142
wt.commit('renamed hello', specific_files=["annotate"])
144
115
def test_pointless_commit(self):
145
116
"""Commit refuses unless there are changes or it's forced."""
146
117
wt = self.make_branch_and_tree('.')
196
167
tree2 = b.repository.revision_tree('test@rev-2')
198
self.addCleanup(tree2.unlock)
199
168
self.assertTrue(tree2.has_filename('hello'))
200
169
self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
201
170
self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
203
172
tree3 = b.repository.revision_tree('test@rev-3')
205
self.addCleanup(tree3.unlock)
206
173
self.assertFalse(tree3.has_filename('hello'))
207
174
self.assertEquals(tree3.get_file_text('buongia-id'), 'new text')
260
223
wt.move(['hello'], 'a')
261
224
r2 = 'test@rev-2'
262
225
wt.commit('two', rev_id=r2, allow_pointless=False)
265
self.check_inventory_shape(wt.read_working_inventory(),
266
['a/', 'a/hello', 'b/'])
226
self.check_inventory_shape(wt.read_working_inventory(),
227
['a', 'a/hello', 'b'])
270
229
wt.move(['b'], 'a')
271
230
r3 = 'test@rev-3'
272
231
wt.commit('three', rev_id=r3, allow_pointless=False)
275
self.check_inventory_shape(wt.read_working_inventory(),
276
['a/', 'a/hello', 'a/b/'])
277
self.check_inventory_shape(b.repository.get_revision_inventory(r3),
278
['a/', 'a/hello', 'a/b/'])
232
self.check_inventory_shape(wt.read_working_inventory(),
233
['a', 'a/hello', 'a/b'])
234
self.check_inventory_shape(b.repository.get_revision_inventory(r3),
235
['a', 'a/hello', 'a/b'])
282
237
wt.move(['a/hello'], 'a/b')
283
238
r4 = 'test@rev-4'
284
239
wt.commit('four', rev_id=r4, allow_pointless=False)
287
self.check_inventory_shape(wt.read_working_inventory(),
288
['a/', 'a/b/hello', 'a/b/'])
240
self.check_inventory_shape(wt.read_working_inventory(),
241
['a', 'a/b/hello', 'a/b'])
292
243
inv = b.repository.get_revision_inventory(r4)
293
244
eq(inv['hello-id'].revision, r4)
294
245
eq(inv['a-id'].revision, r1)
295
246
eq(inv['b-id'].revision, r3)
297
248
def test_removed_commit(self):
298
249
"""Commit with a removed file"""
299
250
wt = self.make_branch_and_tree('.')
464
413
bound = master.sprout('bound')
465
414
wt = bound.open_workingtree()
466
415
wt.branch.set_bound_location(os.path.realpath('master'))
417
orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
467
418
master_branch.lock_write()
420
lockdir._DEFAULT_TIMEOUT_SECONDS = 1
469
421
self.assertRaises(LockContention, wt.commit, 'silly')
423
lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
471
424
master_branch.unlock()
473
426
def test_commit_bound_merge(self):
558
511
('change', 'added', 'newdir'),
559
512
('change', 'added', 'newfile'),
560
513
('renamed', 'renamed', 'dirtorename', 'renameddir'),
561
('renamed', 'renamed', 'filetorename', 'renamedfile'),
562
514
('renamed', 'renamed', 'dirtoreparent', 'renameddir/reparenteddir'),
563
515
('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
516
('renamed', 'renamed', 'filetorename', 'renamedfile'),
564
517
('deleted', 'dirtoremove'),
565
518
('deleted', 'filetoremove'),
574
527
tree.commit('added a, b')
575
528
tree.remove(['a', 'b'])
576
529
tree.commit('removed a', specific_files='a')
577
basis = tree.basis_tree()
580
self.assertIs(None, basis.path2id('a'))
581
self.assertFalse(basis.path2id('b') is None)
530
basis = tree.basis_tree().inventory
531
self.assertIs(None, basis.path2id('a'))
532
self.assertFalse(basis.path2id('b') is None)
585
534
def test_commit_saves_1ms_timestamp(self):
586
535
"""Passing in a timestamp is saved with 1ms resolution"""
605
554
timestamp_1ms = round(timestamp, 3)
606
555
self.assertEqual(timestamp_1ms, timestamp)
608
def assertBasisTreeKind(self, kind, tree, file_id):
609
basis = tree.basis_tree()
612
self.assertEqual(kind, basis.kind(file_id))
616
557
def test_commit_kind_changes(self):
617
self.requireFeature(SymlinkFeature)
558
if not osutils.has_symlinks():
559
raise tests.TestSkipped('Test requires symlink support')
618
560
tree = self.make_branch_and_tree('.')
619
561
os.symlink('target', 'name')
620
562
tree.add('name', 'a-file-id')
621
563
tree.commit('Added a symlink')
622
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
564
self.assertEqual('symlink', tree.basis_tree().kind('a-file-id'))
624
566
os.unlink('name')
625
567
self.build_tree(['name'])
626
568
tree.commit('Changed symlink to file')
627
self.assertBasisTreeKind('file', tree, 'a-file-id')
569
self.assertEqual('file', tree.basis_tree().kind('a-file-id'))
629
571
os.unlink('name')
630
572
os.symlink('target', 'name')
631
573
tree.commit('file to symlink')
632
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
574
self.assertEqual('symlink', tree.basis_tree().kind('a-file-id'))
634
576
os.unlink('name')
636
578
tree.commit('symlink to directory')
637
self.assertBasisTreeKind('directory', tree, 'a-file-id')
579
self.assertEqual('directory', tree.basis_tree().kind('a-file-id'))
640
582
os.symlink('target', 'name')
641
583
tree.commit('directory to symlink')
642
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
584
self.assertEqual('symlink', tree.basis_tree().kind('a-file-id'))
644
586
# prepare for directory <-> file tests
645
587
os.unlink('name')
647
589
tree.commit('symlink to directory')
648
self.assertBasisTreeKind('directory', tree, 'a-file-id')
590
self.assertEqual('directory', tree.basis_tree().kind('a-file-id'))
651
593
self.build_tree(['name'])
652
594
tree.commit('Changed directory to file')
653
self.assertBasisTreeKind('file', tree, 'a-file-id')
595
self.assertEqual('file', tree.basis_tree().kind('a-file-id'))
655
597
os.unlink('name')
657
599
tree.commit('file to directory')
658
self.assertBasisTreeKind('directory', tree, 'a-file-id')
600
self.assertEqual('directory', tree.basis_tree().kind('a-file-id'))
660
602
def test_commit_unversioned_specified(self):
661
603
"""Commit should raise if specified files isn't in basis or worktree"""
713
655
repository.add_inventory = raise_
714
656
self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
715
657
self.assertFalse(cb.called)
717
def test_selected_file_merge_commit(self):
718
"""Ensure the correct error is raised"""
719
tree = self.make_branch_and_tree('foo')
720
# pending merge would turn into a left parent
721
tree.commit('commit 1')
722
tree.add_parent_tree_id('example')
723
self.build_tree(['foo/bar', 'foo/baz'])
724
tree.add(['bar', 'baz'])
725
err = self.assertRaises(errors.CannotCommitSelectedFileMerge,
726
tree.commit, 'commit 2', specific_files=['bar', 'baz'])
727
self.assertEqual(['bar', 'baz'], err.files)
728
self.assertEqual('Selected-file commit of merges is not supported'
729
' yet: files bar, baz', str(err))
731
def test_commit_ordering(self):
732
"""Test of corner-case commit ordering error"""
733
tree = self.make_branch_and_tree('.')
734
self.build_tree(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
735
tree.add(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
737
self.build_tree(['a/c/d/'])
739
tree.rename_one('a/z/x', 'a/c/d/x')
740
tree.commit('test', specific_files=['a/z/y'])
742
def test_commit_no_author(self):
743
"""The default kwarg author in MutableTree.commit should not add
744
the 'author' revision property.
746
tree = self.make_branch_and_tree('foo')
747
rev_id = tree.commit('commit 1')
748
rev = tree.branch.repository.get_revision(rev_id)
749
self.assertFalse('author' in rev.properties)
751
def test_commit_author(self):
752
"""Passing a non-empty author kwarg to MutableTree.commit should add
753
the 'author' revision property.
755
tree = self.make_branch_and_tree('foo')
756
rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
757
rev = tree.branch.repository.get_revision(rev_id)
758
self.assertEqual('John Doe <jdoe@example.com>',
759
rev.properties['author'])
761
def test_commit_with_checkout_and_branch_sharing_repo(self):
762
repo = self.make_repository('repo', shared=True)
763
# make_branch_and_tree ignores shared repos
764
branch = bzrdir.BzrDir.create_branch_convenience('repo/branch')
765
tree2 = branch.create_checkout('repo/tree2')
766
tree2.commit('message', rev_id='rev1')
767
self.assertTrue(tree2.branch.repository.has_revision('rev1'))