415
411
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
416
412
diff_buffer.get_end_iter()).splitlines(True)
418
self.assertEqual("=== modified file 'a'\n", text[0])
414
self.assertEqual("=== removed file 'b'\n", text[0])
419
415
self.assertContainsRe(text[1],
416
r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
417
self.assertEqual('+++ b\t1970-01-01 00:00:00 +0000\n', text[2])
418
self.assertEqual('@@ -1,1 +0,0 @@\n', text[3])
419
self.assertEqual('-contents of tree/b\n', text[4])
420
self.assertEqual('\n', text[5])
422
self.assertEqual("=== modified file 'a'\n", text[6])
423
self.assertContainsRe(text[7],
420
424
r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
421
self.assertContainsRe(text[2],
422
r"\+\+\+ a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
423
self.assertEqual('@@ -1,1 +1,1 @@\n', text[3])
424
self.assertEqual('-contents of tree/a\n', text[4])
425
self.assertEqual('+new contents for a\n', text[5])
426
self.assertEqual('\n', text[6])
428
self.assertEqual("=== removed file 'b'\n", text[7])
429
425
self.assertContainsRe(text[8],
430
r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
431
self.assertEqual('+++ b\t1970-01-01 00:00:00 +0000\n', text[9])
432
self.assertEqual('@@ -1,1 +0,0 @@\n', text[10])
433
self.assertEqual('-contents of tree/b\n', text[11])
426
r"\+\+\+ a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
427
self.assertEqual('@@ -1,1 +1,1 @@\n', text[9])
428
self.assertEqual('-contents of tree/a\n', text[10])
429
self.assertEqual('+new contents for a\n', text[11])
434
430
self.assertEqual('\n', text[12])
436
432
self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
648
644
'message':'message\nfor b_dir\n'},
649
645
]), dlg._get_specific_files())
651
def test_specific_files_sanitizes_messages(self):
652
tree = self.make_branch_and_tree('tree')
653
tree.branch.get_config().set_user_option('per_file_commits', 'true')
654
self.build_tree(['tree/a_file', 'tree/b_dir/'])
655
tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
657
dlg = commit.CommitDialog(tree)
658
dlg._commit_selected_radio.set_active(True)
659
self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
661
dlg._treeview_files.set_cursor((1,))
662
dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
663
dlg._treeview_files.set_cursor((2,))
664
dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
666
self.assertEqual((['a_file', 'b_dir'],
667
[{'path':'a_file', 'file_id':'1a-id',
668
'message':'Test\nmessage\nfor a_file\n'},
669
{'path':'b_dir', 'file_id':'0b-id',
670
'message':'message\nfor\nb_dir\n'},
671
]), dlg._get_specific_files())
674
class QuestionHelpers(object):
648
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
649
"""Tests on the actual 'commit' button being pushed."""
676
651
def _set_question_yes(self, dlg):
677
652
"""Set the dialog to answer YES to any questions."""
678
653
self.questions = []
679
def _question_yes(*args, **kwargs):
654
def _question_yes(*args):
680
655
self.questions.append(args)
681
656
self.questions.append('YES')
682
return Gtk.ResponseType.YES
657
return gtk.RESPONSE_YES
683
658
dlg._question_dialog = _question_yes
685
660
def _set_question_no(self, dlg):
686
661
"""Set the dialog to answer NO to any questions."""
687
662
self.questions = []
688
def _question_no(*args, **kwargs):
663
def _question_no(*args):
689
664
self.questions.append(args)
690
665
self.questions.append('NO')
691
return Gtk.ResponseType.NO
666
return gtk.RESPONSE_NO
692
667
dlg._question_dialog = _question_no
695
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
696
"""Tests on the actual 'commit' button being pushed."""
698
669
def test_bound_commit_local(self):
699
670
tree = self.make_branch_and_tree('tree')
700
671
self.build_tree(['tree/a'])
1076
1031
{'path':u'\u03a9', 'file_id':'omega-id',
1077
1032
'message':u'\u03a9 is the end of all things.\n'},
1078
1033
], file_info_decoded)
1081
class TestSanitizeMessage(tests.TestCase):
1083
def assertSanitize(self, expected, original):
1084
self.assertEqual(expected,
1085
commit._sanitize_and_decode_message(original))
1087
def test_untouched(self):
1088
self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
1090
def test_converts_cr_to_lf(self):
1091
self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
1093
def test_converts_crlf_to_lf(self):
1094
self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
1096
def test_converts_mixed_to_lf(self):
1097
self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
1100
class TestSavedCommitMessages(tests.TestCaseWithTransport):
1103
super(TestSavedCommitMessages, self).setUp()
1105
branch.Branch.hooks.install_named_hook(
1106
'post_uncommit', commit.save_commit_messages, None)
1108
def _get_file_info_dict(self, rank):
1109
file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
1110
dict(path='b', file_id='b-id', message='b msg %d' % rank)]
1113
def _get_file_info_revprops(self, rank):
1114
file_info_prop = self._get_file_info_dict(rank)
1115
return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
1117
def _get_commit_message(self):
1118
return self.config.get_user_option('gtk_global_commit_message')
1120
def _get_file_commit_messages(self):
1121
return self.config.get_user_option('gtk_file_commit_messages')
1124
class TestUncommitHook(TestSavedCommitMessages):
1127
super(TestUncommitHook, self).setUp()
1128
self.tree = self.make_branch_and_tree('tree')
1129
self.config = self.tree.branch.get_config()
1130
self.build_tree(['tree/a', 'tree/b'])
1131
self.tree.add(['a'], ['a-id'])
1132
self.tree.add(['b'], ['b-id'])
1133
rev1 = self.tree.commit('one', rev_id='one-id',
1134
revprops=self._get_file_info_revprops(1))
1135
rev2 = self.tree.commit('two', rev_id='two-id',
1136
revprops=self._get_file_info_revprops(2))
1137
rev3 = self.tree.commit('three', rev_id='three-id',
1138
revprops=self._get_file_info_revprops(3))
1140
def test_uncommit_one_by_one(self):
1141
uncommit.uncommit(self.tree.branch, tree=self.tree)
1142
self.assertEquals(u'three', self._get_commit_message())
1143
self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
1144
self._get_file_commit_messages())
1146
uncommit.uncommit(self.tree.branch, tree=self.tree)
1147
self.assertEquals(u'two\n******\nthree', self._get_commit_message())
1148
self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
1149
'4:b-id22:b msg 2\n******\nb msg 3e',
1150
self._get_file_commit_messages())
1152
uncommit.uncommit(self.tree.branch, tree=self.tree)
1153
self.assertEquals(u'one\n******\ntwo\n******\nthree',
1154
self._get_commit_message())
1155
self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1156
'4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1157
self._get_file_commit_messages())
1159
def test_uncommit_all_at_once(self):
1160
uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
1161
self.assertEquals(u'one\n******\ntwo\n******\nthree',
1162
self._get_commit_message())
1163
self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1164
'4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1165
self._get_file_commit_messages())
1168
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1171
super(TestReusingSavedCommitMessages, self).setUp()
1172
self.tree = self.make_branch_and_tree('tree')
1173
self.config = self.tree.branch.get_config()
1174
self.config.set_user_option('per_file_commits', 'true')
1175
self.build_tree(['tree/a', 'tree/b'])
1176
self.tree.add(['a'], ['a-id'])
1177
self.tree.add(['b'], ['b-id'])
1178
rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
1179
rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
1180
uncommit.uncommit(self.tree.branch, tree=self.tree)
1181
self.build_tree_contents([('tree/a', 'new a content\n'),
1182
('tree/b', 'new b content'),])
1184
def _get_commit_dialog(self, tree):
1185
# Ensure we will never use a dialog that can actually prompt the user
1186
# during the test suite. Test *can* and *should* override with the
1187
# correct question dialog type.
1188
dlg = commit.CommitDialog(tree)
1189
self._set_question_no(dlg)
1192
def test_setup_saved_messages(self):
1193
# Check the initial setup
1194
self.assertEquals(u'two', self._get_commit_message())
1195
self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1196
self._get_file_commit_messages())
1198
def test_messages_are_reloaded(self):
1199
dlg = self._get_commit_dialog(self.tree)
1200
self.assertEquals(u'two', dlg._get_global_commit_message())
1201
self.assertEquals(([u'a', u'b'],
1203
'file_id': 'a-id', 'message': 'a msg 2',},
1205
'file_id': 'b-id', 'message': 'b msg 2',}],),
1206
dlg._get_specific_files())
1208
def test_messages_are_consumed(self):
1209
dlg = self._get_commit_dialog(self.tree)
1211
self.assertEquals(u'', self._get_commit_message())
1212
self.assertEquals(u'de', self._get_file_commit_messages())
1214
def test_messages_are_saved_on_cancel_if_required(self):
1215
dlg = self._get_commit_dialog(self.tree)
1216
self._set_question_yes(dlg) # Save messages
1218
self.assertEquals(u'two', self._get_commit_message())
1219
self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1220
self._get_file_commit_messages())
1222
def test_messages_are_cleared_on_cancel_if_required(self):
1223
dlg = self._get_commit_dialog(self.tree)
1224
self._set_question_no(dlg) # Don't save messages
1226
self.assertEquals(u'', self._get_commit_message())
1227
self.assertEquals(u'de',
1228
self._get_file_commit_messages())