638
573
# do with. So instead, we just call toggle directly, and assume
639
574
# that toggle is hooked in correctly
640
575
# column = dlg._treeview_files.get_column(0)
641
# renderer = column.get_cells()[0]
576
# renderer = column.get_cell_renderers()[0]
643
578
# Toggle a single entry should set just that entry to False
644
579
dlg._toggle_commit(None, 1, dlg._files_store)
645
self.assertEqual([("", "", True),
580
self.assertEqual([(None, None, True),
646
581
('a-id', 'a', False),
647
582
('b-id', 'b', True),
648
583
], [(r[0], r[1], r[2]) for r in dlg._files_store])
650
585
# Toggling the main entry should set all entries
651
586
dlg._toggle_commit(None, 0, dlg._files_store)
652
self.assertEqual([("", "", False),
587
self.assertEqual([(None, None, False),
653
588
('a-id', 'a', False),
654
589
('b-id', 'b', False),
655
590
], [(r[0], r[1], r[2]) for r in dlg._files_store])
657
592
dlg._toggle_commit(None, 2, dlg._files_store)
658
self.assertEqual([("", "", False),
593
self.assertEqual([(None, None, False),
659
594
('a-id', 'a', False),
660
595
('b-id', 'b', True),
661
596
], [(r[0], r[1], r[2]) for r in dlg._files_store])
663
598
dlg._toggle_commit(None, 0, dlg._files_store)
664
self.assertEqual([("", "", True),
599
self.assertEqual([(None, None, True),
665
600
('a-id', 'a', True),
666
601
('b-id', 'b', True),
667
602
], [(r[0], r[1], r[2]) for r in dlg._files_store])
711
644
'message':'message\nfor b_dir\n'},
712
645
]), dlg._get_specific_files())
714
def test_specific_files_sanitizes_messages(self):
715
tree = self.make_branch_and_tree('tree')
716
tree.branch.get_config().set_user_option('per_file_commits', 'true')
717
self.build_tree(['tree/a_file', 'tree/b_dir/'])
718
tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
720
dlg = commit.CommitDialog(tree)
721
dlg._commit_selected_radio.set_active(True)
722
self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
724
dlg._treeview_files.set_cursor(
725
Gtk.TreePath(path=1), None, False)
726
dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
727
dlg._treeview_files.set_cursor(
728
Gtk.TreePath(path=2), None, False)
729
dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
731
self.assertEqual((['a_file', 'b_dir'],
732
[{'path':'a_file', 'file_id':'1a-id',
733
'message':'Test\nmessage\nfor a_file\n'},
734
{'path':'b_dir', 'file_id':'0b-id',
735
'message':'message\nfor\nb_dir\n'},
736
]), dlg._get_specific_files())
739
class QuestionHelpers(object):
648
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
649
"""Tests on the actual 'commit' button being pushed."""
741
651
def _set_question_yes(self, dlg):
742
652
"""Set the dialog to answer YES to any questions."""
743
653
self.questions = []
744
def _question_yes(*args, **kwargs):
654
def _question_yes(*args):
745
655
self.questions.append(args)
746
656
self.questions.append('YES')
747
return Gtk.ResponseType.YES
657
return gtk.RESPONSE_YES
748
658
dlg._question_dialog = _question_yes
750
660
def _set_question_no(self, dlg):
751
661
"""Set the dialog to answer NO to any questions."""
752
662
self.questions = []
753
def _question_no(*args, **kwargs):
663
def _question_no(*args):
754
664
self.questions.append(args)
755
665
self.questions.append('NO')
756
return Gtk.ResponseType.NO
666
return gtk.RESPONSE_NO
757
667
dlg._question_dialog = _question_no
760
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
761
"""Tests on the actual 'commit' button being pushed."""
763
669
def test_bound_commit_local(self):
764
670
tree = self.make_branch_and_tree('tree')
765
671
self.build_tree(['tree/a'])
1146
1030
{'path':u'\u03a9', 'file_id':'omega-id',
1147
1031
'message':u'\u03a9 is the end of all things.\n'},
1148
1032
], file_info_decoded)
1151
class TestSanitizeMessage(tests.TestCase):
1153
def assertSanitize(self, expected, original):
1154
self.assertEqual(expected,
1155
commit._sanitize_and_decode_message(original))
1157
def test_untouched(self):
1158
self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
1160
def test_converts_cr_to_lf(self):
1161
self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
1163
def test_converts_crlf_to_lf(self):
1164
self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
1166
def test_converts_mixed_to_lf(self):
1167
self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
1170
class TestSavedCommitMessages(tests.TestCaseWithTransport):
1173
super(TestSavedCommitMessages, self).setUp()
1175
branch.Branch.hooks.install_named_hook(
1176
'post_uncommit', commitmsgs.save_commit_messages, None)
1178
def _get_file_info_dict(self, rank):
1179
file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
1180
dict(path='b', file_id='b-id', message='b msg %d' % rank)]
1183
def _get_file_info_revprops(self, rank):
1184
file_info_prop = self._get_file_info_dict(rank)
1185
return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
1187
def _get_commit_message(self):
1188
return self.config.get_user_option('gtk_global_commit_message')
1190
def _get_file_commit_messages(self):
1191
return self.config.get_user_option('gtk_file_commit_messages')
1194
class TestUncommitHook(TestSavedCommitMessages):
1197
super(TestUncommitHook, self).setUp()
1198
self.tree = self.make_branch_and_tree('tree')
1199
self.config = self.tree.branch.get_config()
1200
self.build_tree(['tree/a', 'tree/b'])
1201
self.tree.add(['a'], ['a-id'])
1202
self.tree.add(['b'], ['b-id'])
1203
rev1 = self.tree.commit('one', rev_id='one-id',
1204
revprops=self._get_file_info_revprops(1))
1205
rev2 = self.tree.commit('two', rev_id='two-id',
1206
revprops=self._get_file_info_revprops(2))
1207
rev3 = self.tree.commit('three', rev_id='three-id',
1208
revprops=self._get_file_info_revprops(3))
1210
def test_uncommit_one_by_one(self):
1211
uncommit.uncommit(self.tree.branch, tree=self.tree)
1212
self.assertEquals(u'three', self._get_commit_message())
1213
self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
1214
self._get_file_commit_messages())
1216
uncommit.uncommit(self.tree.branch, tree=self.tree)
1217
self.assertEquals(u'two\n******\nthree', self._get_commit_message())
1218
self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
1219
'4:b-id22:b msg 2\n******\nb msg 3e',
1220
self._get_file_commit_messages())
1222
uncommit.uncommit(self.tree.branch, tree=self.tree)
1223
self.assertEquals(u'one\n******\ntwo\n******\nthree',
1224
self._get_commit_message())
1225
self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1226
'4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1227
self._get_file_commit_messages())
1229
def test_uncommit_all_at_once(self):
1230
uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
1231
self.assertEquals(u'one\n******\ntwo\n******\nthree',
1232
self._get_commit_message())
1233
self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1234
'4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1235
self._get_file_commit_messages())
1238
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1241
super(TestReusingSavedCommitMessages, self).setUp()
1242
self.tree = self.make_branch_and_tree('tree')
1243
self.config = self.tree.branch.get_config()
1244
self.config.set_user_option('per_file_commits', 'true')
1245
self.build_tree(['tree/a', 'tree/b'])
1246
self.tree.add(['a'], ['a-id'])
1247
self.tree.add(['b'], ['b-id'])
1248
rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
1249
rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
1250
uncommit.uncommit(self.tree.branch, tree=self.tree)
1251
self.build_tree_contents([('tree/a', 'new a content\n'),
1252
('tree/b', 'new b content'),])
1254
def _get_commit_dialog(self, tree):
1255
# Ensure we will never use a dialog that can actually prompt the user
1256
# during the test suite. Test *can* and *should* override with the
1257
# correct question dialog type.
1258
dlg = commit.CommitDialog(tree)
1259
self._set_question_no(dlg)
1262
def test_setup_saved_messages(self):
1263
# Check the initial setup
1264
self.assertEquals(u'two', self._get_commit_message())
1265
self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1266
self._get_file_commit_messages())
1268
def test_messages_are_reloaded(self):
1269
dlg = self._get_commit_dialog(self.tree)
1270
self.assertEquals(u'two', dlg._get_global_commit_message())
1271
self.assertEquals(([u'a', u'b'],
1273
'file_id': 'a-id', 'message': 'a msg 2',},
1275
'file_id': 'b-id', 'message': 'b msg 2',}],),
1276
dlg._get_specific_files())
1278
def test_messages_are_consumed(self):
1279
dlg = self._get_commit_dialog(self.tree)
1281
self.assertEquals(u'', self._get_commit_message())
1282
self.assertEquals(u'de', self._get_file_commit_messages())
1284
def test_messages_are_saved_on_cancel_if_required(self):
1285
dlg = self._get_commit_dialog(self.tree)
1286
self._set_question_yes(dlg) # Save messages
1288
self.assertEquals(u'two', self._get_commit_message())
1289
self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1290
self._get_file_commit_messages())
1292
def test_messages_are_cleared_on_cancel_if_required(self):
1293
dlg = self._get_commit_dialog(self.tree)
1294
self._set_question_no(dlg) # Don't save messages
1296
self.assertEquals(u'', self._get_commit_message())
1297
self.assertEquals(u'de',
1298
self._get_file_commit_messages())