/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to tests/test_commit.py

  • Committer: Jelmer Vernooij
  • Date: 2008-03-28 19:26:53 UTC
  • mto: (450.1.13 trunk)
  • mto: This revision was merged to the branch mainline in revision 458.
  • Revision ID: jelmer@samba.org-20080328192653-trzptkwahx1tulz9
Add module for preferences code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007, 2008 John Arbash Meinel <john@arbash-meinel.com>
 
1
# Copyright (C) 2007 John Arbash Meinel <john@arbash-meinel.com>
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
18
18
 
19
19
import os
20
20
 
21
 
from gi.repository import Gtk
 
21
import gtk
22
22
 
23
23
from bzrlib import (
24
 
    branch,
25
24
    tests,
26
 
    uncommit,
 
25
    revision,
27
26
    )
28
 
try:
29
 
    from bzrlib import bencode
30
 
except ImportError:
31
 
    from bzrlib.util import bencode
 
27
from bzrlib.util import bencode
32
28
 
33
29
from bzrlib.plugins.gtk import commit
34
30
 
85
81
        rev_id1 = tree.commit('one')
86
82
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
87
83
        rev_id2 = tree2.commit('two')
 
84
        rev_id3 = tree2.commit('three')
88
85
        tree3 = tree2.bzrdir.sprout('tree3').open_workingtree()
89
 
        rev_id3 = tree2.commit('three')
90
86
        rev_id4 = tree3.commit('four')
91
87
        rev_id5 = tree3.commit('five')
92
88
        tree.merge_from_branch(tree2.branch)
93
 
        tree.merge_from_branch(tree3.branch, force=True)
 
89
        tree.merge_from_branch(tree3.branch)
94
90
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
95
91
 
96
92
        pending_revisions = commit.pending_revisions(tree)
270
266
                               committer='Jerry Foo <jerry@foo.com>',
271
267
                               timestamp=1191372278.05,
272
268
                               timezone=+7200)
273
 
        tree.merge_from_branch(tree3.branch, force=True)
 
269
        tree.merge_from_branch(tree3.branch)
274
270
 
275
271
        dlg = commit.CommitDialog(tree)
276
272
        # TODO: assert that the pending box is set to show
415
411
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
416
412
                                    diff_buffer.get_end_iter()).splitlines(True)
417
413
 
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])
 
421
 
 
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])
427
 
 
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])
435
431
 
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())
650
646
 
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'])
656
 
 
657
 
        dlg = commit.CommitDialog(tree)
658
 
        dlg._commit_selected_radio.set_active(True)
659
 
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
660
 
 
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')
665
 
 
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())
672
 
 
673
 
 
674
 
class QuestionHelpers(object):
 
647
 
 
648
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
 
649
    """Tests on the actual 'commit' button being pushed."""
675
650
 
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
684
659
 
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
693
668
 
694
 
 
695
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
696
 
    """Tests on the actual 'commit' button being pushed."""
697
 
 
698
669
    def test_bound_commit_local(self):
699
670
        tree = self.make_branch_and_tree('tree')
700
671
        self.build_tree(['tree/a'])
716
687
        self.assertEqual(last_rev, dlg.committed_revision_id)
717
688
        self.assertEqual(rev_id1, tree.branch.last_revision())
718
689
 
719
 
    def test_commit_global_sanitizes_message(self):
720
 
        tree = self.make_branch_and_tree('tree')
721
 
        self.build_tree(['tree/a'])
722
 
        tree.add(['a'], ['a-id'])
723
 
        rev_id1 = tree.commit('one')
724
 
 
725
 
        self.build_tree(['tree/b'])
726
 
        tree.add(['b'], ['b-id'])
727
 
        dlg = commit.CommitDialog(tree)
728
 
        # With the check box set, it should only effect the local branch
729
 
        dlg._set_global_commit_message('Commit\r\nmessage\rfoo\n')
730
 
        dlg._do_commit()
731
 
        rev = tree.branch.repository.get_revision(tree.last_revision())
732
 
        self.assertEqual('Commit\nmessage\nfoo\n', rev.message)
733
 
 
734
690
    def test_bound_commit_both(self):
735
691
        tree = self.make_branch_and_tree('tree')
736
692
        self.build_tree(['tree/a'])
752
708
        self.assertEqual(last_rev, dlg.committed_revision_id)
753
709
        self.assertEqual(last_rev, tree.branch.last_revision())
754
710
 
755
 
    def test_commit_empty_message(self):
 
711
    def test_commit_no_message(self):
756
712
        tree = self.make_branch_and_tree('tree')
757
713
        self.build_tree(['tree/a', 'tree/b'])
758
714
        tree.add(['a'], ['a-id'])
987
943
        rev = tree.branch.repository.get_revision(rev_id2)
988
944
        self.assertEqual('Commit just "a"', rev.message)
989
945
        file_info = rev.properties['file-info']
990
 
        self.assertEqual(u'ld7:file_id4:a-id'
991
 
                         '7:message14:Message for A\n'
992
 
                         '4:path1:a'
993
 
                         'ee',
994
 
                         file_info)
 
946
        self.assertEqual('ld7:file_id4:a-id'
 
947
                           '7:message14:Message for A\n'
 
948
                           '4:path1:a'
 
949
                         'ee', file_info)
995
950
        self.assertEqual([{'path':'a', 'file_id':'a-id',
996
 
                           'message':'Message for A\n'},],
997
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
951
                           'message':'Message for A\n'},
 
952
                         ], bencode.bdecode(file_info))
998
953
 
999
954
    def test_commit_messages_after_merge(self):
1000
955
        tree = self.make_branch_and_tree('tree')
1021
976
        self.assertEqual('Merging from "tree2"\n', rev.message)
1022
977
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
1023
978
        file_info = rev.properties['file-info']
1024
 
        self.assertEqual(u'ld7:file_id4:a-id'
1025
 
                         '7:message14:Message for A\n'
1026
 
                         '4:path1:a'
1027
 
                         'ee',
1028
 
                         file_info)
 
979
        self.assertEqual('ld7:file_id4:a-id'
 
980
                           '7:message14:Message for A\n'
 
981
                           '4:path1:a'
 
982
                         'ee', file_info)
1029
983
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1030
 
                           'message':'Message for A\n'},],
1031
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
984
                           'message':'Message for A\n'},
 
985
                         ], bencode.bdecode(file_info))
1032
986
 
1033
987
    def test_commit_unicode_messages(self):
1034
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
988
        from bzrlib.tests.test_diff import UnicodeFilename
 
989
        self.requireFeature(UnicodeFilename)
1035
990
 
1036
991
        tree = self.make_branch_and_tree('tree')
1037
992
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
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)
1079
 
 
1080
 
 
1081
 
class TestSanitizeMessage(tests.TestCase):
1082
 
 
1083
 
    def assertSanitize(self, expected, original):
1084
 
        self.assertEqual(expected,
1085
 
                         commit._sanitize_and_decode_message(original))
1086
 
 
1087
 
    def test_untouched(self):
1088
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
1089
 
 
1090
 
    def test_converts_cr_to_lf(self):
1091
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
1092
 
 
1093
 
    def test_converts_crlf_to_lf(self):
1094
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
1095
 
 
1096
 
    def test_converts_mixed_to_lf(self):
1097
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
1098
 
 
1099
 
 
1100
 
class TestSavedCommitMessages(tests.TestCaseWithTransport):
1101
 
 
1102
 
    def setUp(self):
1103
 
        super(TestSavedCommitMessages, self).setUp()
1104
 
        # Install our hook
1105
 
        branch.Branch.hooks.install_named_hook(
1106
 
            'post_uncommit', commit.save_commit_messages, None)
1107
 
 
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)]
1111
 
        return file_info
1112
 
 
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')}
1116
 
 
1117
 
    def _get_commit_message(self):
1118
 
        return self.config.get_user_option('gtk_global_commit_message')
1119
 
 
1120
 
    def _get_file_commit_messages(self):
1121
 
        return self.config.get_user_option('gtk_file_commit_messages')
1122
 
 
1123
 
 
1124
 
class TestUncommitHook(TestSavedCommitMessages):
1125
 
 
1126
 
    def setUp(self):
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))
1139
 
 
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())
1145
 
 
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())
1151
 
 
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())
1158
 
 
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())
1166
 
 
1167
 
 
1168
 
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1169
 
 
1170
 
    def setUp(self):
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'),])
1183
 
 
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)
1190
 
        return dlg
1191
 
 
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())
1197
 
 
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'],
1202
 
                           [{ 'path': 'a',
1203
 
                             'file_id': 'a-id', 'message': 'a msg 2',},
1204
 
                           {'path': 'b',
1205
 
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
1206
 
                          dlg._get_specific_files())
1207
 
 
1208
 
    def test_messages_are_consumed(self):
1209
 
        dlg = self._get_commit_dialog(self.tree)
1210
 
        dlg._do_commit()
1211
 
        self.assertEquals(u'', self._get_commit_message())
1212
 
        self.assertEquals(u'de', self._get_file_commit_messages())
1213
 
 
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
1217
 
        dlg._do_cancel()
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())
1221
 
 
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
1225
 
        dlg._do_cancel()
1226
 
        self.assertEquals(u'', self._get_commit_message())
1227
 
        self.assertEquals(u'de',
1228
 
                          self._get_file_commit_messages())