226
217
wt.move(['hello'], 'a')
227
218
r2 = 'test@rev-2'
228
219
wt.commit('two', rev_id=r2, allow_pointless=False)
231
self.check_inventory_shape(wt.read_working_inventory(),
232
['a/', 'a/hello', 'b/'])
220
self.check_inventory_shape(wt.read_working_inventory(),
221
['a', 'a/hello', 'b'])
236
223
wt.move(['b'], 'a')
237
224
r3 = 'test@rev-3'
238
225
wt.commit('three', rev_id=r3, allow_pointless=False)
241
self.check_inventory_shape(wt.read_working_inventory(),
242
['a/', 'a/hello', 'a/b/'])
243
self.check_inventory_shape(b.repository.get_revision_inventory(r3),
244
['a/', 'a/hello', 'a/b/'])
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'])
248
231
wt.move(['a/hello'], 'a/b')
249
232
r4 = 'test@rev-4'
250
233
wt.commit('four', rev_id=r4, allow_pointless=False)
253
self.check_inventory_shape(wt.read_working_inventory(),
254
['a/', 'a/b/hello', 'a/b/'])
234
self.check_inventory_shape(wt.read_working_inventory(),
235
['a', 'a/b/hello', 'a/b'])
258
237
inv = b.repository.get_revision_inventory(r4)
259
238
eq(inv['hello-id'].revision, r4)
260
239
eq(inv['a-id'].revision, r1)
261
240
eq(inv['b-id'].revision, r3)
263
242
def test_removed_commit(self):
264
243
"""Commit with a removed file"""
265
244
wt = self.make_branch_and_tree('.')
574
543
timestamp = rev.timestamp
575
544
timestamp_1ms = round(timestamp, 3)
576
545
self.assertEqual(timestamp_1ms, timestamp)
578
def assertBasisTreeKind(self, kind, tree, file_id):
579
basis = tree.basis_tree()
582
self.assertEqual(kind, basis.kind(file_id))
586
def test_commit_kind_changes(self):
587
if not osutils.has_symlinks():
588
raise tests.TestSkipped('Test requires symlink support')
589
tree = self.make_branch_and_tree('.')
590
os.symlink('target', 'name')
591
tree.add('name', 'a-file-id')
592
tree.commit('Added a symlink')
593
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
596
self.build_tree(['name'])
597
tree.commit('Changed symlink to file')
598
self.assertBasisTreeKind('file', tree, 'a-file-id')
601
os.symlink('target', 'name')
602
tree.commit('file to symlink')
603
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
607
tree.commit('symlink to directory')
608
self.assertBasisTreeKind('directory', tree, 'a-file-id')
611
os.symlink('target', 'name')
612
tree.commit('directory to symlink')
613
self.assertBasisTreeKind('symlink', tree, 'a-file-id')
615
# prepare for directory <-> file tests
618
tree.commit('symlink to directory')
619
self.assertBasisTreeKind('directory', tree, 'a-file-id')
622
self.build_tree(['name'])
623
tree.commit('Changed directory to file')
624
self.assertBasisTreeKind('file', tree, 'a-file-id')
628
tree.commit('file to directory')
629
self.assertBasisTreeKind('directory', tree, 'a-file-id')
631
def test_commit_unversioned_specified(self):
632
"""Commit should raise if specified files isn't in basis or worktree"""
633
tree = self.make_branch_and_tree('.')
634
self.assertRaises(errors.PathsNotVersionedError, tree.commit,
635
'message', specific_files=['bogus'])
637
class Callback(object):
639
def __init__(self, message, testcase):
641
self.message = message
642
self.testcase = testcase
644
def __call__(self, commit_obj):
646
self.testcase.assertTrue(isinstance(commit_obj, Commit))
649
def test_commit_callback(self):
650
"""Commit should invoke a callback to get the message"""
652
tree = self.make_branch_and_tree('.')
656
self.assertTrue(isinstance(e, BzrError))
657
self.assertEqual('The message or message_callback keyword'
658
' parameter is required for commit().', str(e))
660
self.fail('exception not raised')
661
cb = self.Callback(u'commit 1', self)
662
tree.commit(message_callback=cb)
663
self.assertTrue(cb.called)
664
repository = tree.branch.repository
665
message = repository.get_revision(tree.last_revision()).message
666
self.assertEqual('commit 1', message)
668
def test_no_callback_pointless(self):
669
"""Callback should not be invoked for pointless commit"""
670
tree = self.make_branch_and_tree('.')
671
cb = self.Callback(u'commit 2', self)
672
self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
673
allow_pointless=False)
674
self.assertFalse(cb.called)
676
def test_no_callback_netfailure(self):
677
"""Callback should not be invoked if connectivity fails"""
678
tree = self.make_branch_and_tree('.')
679
cb = self.Callback(u'commit 2', self)
680
repository = tree.branch.repository
681
# simulate network failure
682
def raise_(self, arg, arg2):
683
raise errors.NoSuchFile('foo')
684
repository.add_inventory = raise_
685
self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
686
self.assertFalse(cb.called)
688
def test_selected_file_merge_commit(self):
689
"""Ensure the correct error is raised"""
690
tree = self.make_branch_and_tree('foo')
691
# pending merge would turn into a left parent
692
tree.commit('commit 1')
693
tree.add_parent_tree_id('example')
694
self.build_tree(['foo/bar', 'foo/baz'])
695
tree.add(['bar', 'baz'])
696
err = self.assertRaises(errors.CannotCommitSelectedFileMerge,
697
tree.commit, 'commit 2', specific_files=['bar', 'baz'])
698
self.assertEqual(['bar', 'baz'], err.files)
699
self.assertEqual('Selected-file commit of merges is not supported'
700
' yet: files bar, baz', str(err))
702
def test_commit_ordering(self):
703
"""Test of corner-case commit ordering error"""
704
tree = self.make_branch_and_tree('.')
705
self.build_tree(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
706
tree.add(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
708
self.build_tree(['a/c/d/'])
710
tree.rename_one('a/z/x', 'a/c/d/x')
711
tree.commit('test', specific_files=['a/z/y'])
713
def test_commit_no_author(self):
714
"""The default kwarg author in MutableTree.commit should not add
715
the 'author' revision property.
717
tree = self.make_branch_and_tree('foo')
718
rev_id = tree.commit('commit 1')
719
rev = tree.branch.repository.get_revision(rev_id)
720
self.assertFalse('author' in rev.properties)
722
def test_commit_author(self):
723
"""Passing a non-empty author kwarg to MutableTree.commit should add
724
the 'author' revision property.
726
tree = self.make_branch_and_tree('foo')
727
rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
728
rev = tree.branch.repository.get_revision(rev_id)
729
self.assertEqual('John Doe <jdoe@example.com>',
730
rev.properties['author'])