217
260
wt.move(['hello'], 'a')
218
261
r2 = 'test@rev-2'
219
262
wt.commit('two', rev_id=r2, allow_pointless=False)
220
self.check_inventory_shape(wt.read_working_inventory(),
221
['a', 'a/hello', 'b'])
265
self.check_inventory_shape(wt.read_working_inventory(),
266
['a/', 'a/hello', 'b/'])
223
270
wt.move(['b'], 'a')
224
271
r3 = 'test@rev-3'
225
272
wt.commit('three', rev_id=r3, allow_pointless=False)
226
self.check_inventory_shape(wt.read_working_inventory(),
227
['a', 'a/hello', 'a/b'])
228
self.check_inventory_shape(b.repository.get_revision_inventory(r3),
229
['a', 'a/hello', 'a/b'])
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/'])
231
282
wt.move(['a/hello'], 'a/b')
232
283
r4 = 'test@rev-4'
233
284
wt.commit('four', rev_id=r4, allow_pointless=False)
234
self.check_inventory_shape(wt.read_working_inventory(),
235
['a', 'a/b/hello', 'a/b'])
287
self.check_inventory_shape(wt.read_working_inventory(),
288
['a/', 'a/b/hello', 'a/b/'])
237
292
inv = b.repository.get_revision_inventory(r4)
238
293
eq(inv['hello-id'].revision, r4)
239
294
eq(inv['a-id'].revision, r1)
240
295
eq(inv['b-id'].revision, r3)
242
297
def test_removed_commit(self):
243
298
"""Commit with a removed file"""
244
299
wt = self.make_branch_and_tree('.')
543
604
timestamp = rev.timestamp
544
605
timestamp_1ms = round(timestamp, 3)
545
606
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
def test_commit_kind_changes(self):
617
self.requireFeature(SymlinkFeature)
618
tree = self.make_branch_and_tree('.')
619
os.symlink('target', 'name')
620
tree.add('name', 'a-file-id')
621
tree.commit('Added a symlink')
622
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
625
self.build_tree(['name'])
626
tree.commit('Changed symlink to file')
627
self.assertBasisTreeKind('file', tree, 'a-file-id')
630
os.symlink('target', 'name')
631
tree.commit('file to symlink')
632
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
636
tree.commit('symlink to directory')
637
self.assertBasisTreeKind('directory', tree, 'a-file-id')
640
os.symlink('target', 'name')
641
tree.commit('directory to symlink')
642
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
644
# prepare for directory <-> file tests
647
tree.commit('symlink to directory')
648
self.assertBasisTreeKind('directory', tree, 'a-file-id')
651
self.build_tree(['name'])
652
tree.commit('Changed directory to file')
653
self.assertBasisTreeKind('file', tree, 'a-file-id')
657
tree.commit('file to directory')
658
self.assertBasisTreeKind('directory', tree, 'a-file-id')
660
def test_commit_unversioned_specified(self):
661
"""Commit should raise if specified files isn't in basis or worktree"""
662
tree = self.make_branch_and_tree('.')
663
self.assertRaises(errors.PathsNotVersionedError, tree.commit,
664
'message', specific_files=['bogus'])
666
class Callback(object):
668
def __init__(self, message, testcase):
670
self.message = message
671
self.testcase = testcase
673
def __call__(self, commit_obj):
675
self.testcase.assertTrue(isinstance(commit_obj, Commit))
678
def test_commit_callback(self):
679
"""Commit should invoke a callback to get the message"""
681
tree = self.make_branch_and_tree('.')
685
self.assertTrue(isinstance(e, BzrError))
686
self.assertEqual('The message or message_callback keyword'
687
' parameter is required for commit().', str(e))
689
self.fail('exception not raised')
690
cb = self.Callback(u'commit 1', self)
691
tree.commit(message_callback=cb)
692
self.assertTrue(cb.called)
693
repository = tree.branch.repository
694
message = repository.get_revision(tree.last_revision()).message
695
self.assertEqual('commit 1', message)
697
def test_no_callback_pointless(self):
698
"""Callback should not be invoked for pointless commit"""
699
tree = self.make_branch_and_tree('.')
700
cb = self.Callback(u'commit 2', self)
701
self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
702
allow_pointless=False)
703
self.assertFalse(cb.called)
705
def test_no_callback_netfailure(self):
706
"""Callback should not be invoked if connectivity fails"""
707
tree = self.make_branch_and_tree('.')
708
cb = self.Callback(u'commit 2', self)
709
repository = tree.branch.repository
710
# simulate network failure
711
def raise_(self, arg, arg2):
712
raise errors.NoSuchFile('foo')
713
repository.add_inventory = raise_
714
self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
715
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'))