/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: Vincent Ladeuil
  • Date: 2013-02-26 10:04:48 UTC
  • mto: This revision was merged to the branch mainline in revision 796.
  • Revision ID: v.ladeuil+lp@free.fr-20130226100448-buc0u114uvdtwq05
Commit messages never contain option references, trying to expand them makes no sense.

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, 2008, 2009, 2011, 2012, 2013 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
17
17
"""Test the Commit functionality."""
18
18
 
19
19
import os
 
20
import subprocess
 
21
from tempfile import NamedTemporaryFile
20
22
 
21
 
import gtk
 
23
from gi.repository import Gtk
22
24
 
23
25
from bzrlib import (
24
26
    branch,
25
 
    revision,
26
27
    tests,
27
28
    uncommit,
28
29
    )
29
30
try:
30
 
    from bzrlib import bencode
31
 
except ImportError:
32
 
    from bzrlib.util import bencode
 
31
    from bzrlib.tests.features import UnicodeFilenameFeature
 
32
except ImportError: # bzr < 2.5
 
33
    from bzrlib.tests import UnicodeFilenameFeature
 
34
from bzrlib import bencode
33
35
 
34
 
from bzrlib.plugins.gtk import commit
 
36
from bzrlib.plugins.gtk import (
 
37
    commit,
 
38
    commitmsgs,
 
39
    )
 
40
from bzrlib.plugins.gtk.commitmsgs import SavedCommitMessagesManager
 
41
from bzrlib.plugins.gtk.tests import MockMethod
35
42
 
36
43
 
37
44
# TODO: All we need is basic ancestry code to test this, we shouldn't need a
43
50
        tree = self.make_branch_and_tree('.')
44
51
        tree.commit('one')
45
52
 
46
 
        self.assertIs(None, commit.pending_revisions(tree))
 
53
        self.addCleanup(tree.lock_read().unlock)
 
54
        self.assertEquals([], list(commit.pending_revisions(tree)))
47
55
 
48
56
    def test_pending_revisions_simple(self):
49
57
        tree = self.make_branch_and_tree('tree')
53
61
        tree.merge_from_branch(tree2.branch)
54
62
        self.assertEqual([rev_id1, rev_id2], tree.get_parent_ids())
55
63
 
56
 
        pending_revisions = commit.pending_revisions(tree)
 
64
        self.addCleanup(tree.lock_read().unlock)
 
65
        pending_revisions = list(commit.pending_revisions(tree))
57
66
        # One primary merge
58
67
        self.assertEqual(1, len(pending_revisions))
59
68
        # Revision == rev_id2
71
80
        tree.merge_from_branch(tree2.branch)
72
81
        self.assertEqual([rev_id1, rev_id4], tree.get_parent_ids())
73
82
 
74
 
        pending_revisions = commit.pending_revisions(tree)
 
83
        self.addCleanup(tree.lock_read().unlock)
 
84
        pending_revisions = list(commit.pending_revisions(tree))
75
85
        # One primary merge
76
86
        self.assertEqual(1, len(pending_revisions))
77
87
        # Revision == rev_id2
94
104
        tree.merge_from_branch(tree3.branch, force=True)
95
105
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
96
106
 
97
 
        pending_revisions = commit.pending_revisions(tree)
 
107
        self.addCleanup(tree.lock_read().unlock)
 
108
        pending_revisions = list(commit.pending_revisions(tree))
98
109
        # Two primary merges
99
110
        self.assertEqual(2, len(pending_revisions))
100
111
        # Revision == rev_id2
137
148
 
138
149
class TestCommitDialogSimple(tests.TestCaseWithTransport):
139
150
 
 
151
    def test_init(self):
 
152
        MockMethod.bind(self, CommitDialogNoWidgets, 'setup_params')
 
153
        MockMethod.bind(self, CommitDialogNoWidgets, 'construct')
 
154
        MockMethod.bind(self, CommitDialogNoWidgets, 'fill_in_data')
 
155
 
 
156
        tree = self.make_branch_and_tree('tree')
 
157
        rev_id = tree.commit('first')
 
158
        dlg = CommitDialogNoWidgets(tree)
 
159
        self.assertIs(tree, dlg._wt)
 
160
        self.assertIs(None, dlg._selected)
 
161
        self.assertTrue(dlg._enable_per_file_commits)
 
162
        self.assertTrue(dlg._commit_all_changes)
 
163
        self.assertIs(None, dlg.committed_revision_id)
 
164
        self.assertIs(None, dlg._last_selected_file)
 
165
        self.assertIsInstance(
 
166
            dlg._saved_commit_messages_manager, SavedCommitMessagesManager)
 
167
        self.assertTrue(CommitDialogNoWidgets.setup_params.called)
 
168
        self.assertTrue(CommitDialogNoWidgets.construct.called)
 
169
        self.assertTrue(CommitDialogNoWidgets.fill_in_data.called)
 
170
 
140
171
    def test_setup_parameters_no_pending(self):
141
172
        tree = self.make_branch_and_tree('tree')
142
173
        rev_id = tree.commit('first')
143
174
 
144
175
        dlg = CommitDialogNoWidgets(tree)
145
176
        self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
146
 
        self.assertIs(None, dlg._pending)
 
177
        self.assertEquals([], dlg._pending)
147
178
        self.assertFalse(dlg._is_checkout)
148
179
 
149
180
    def test_setup_parameters_checkout(self):
154
185
 
155
186
        dlg = CommitDialogNoWidgets(tree2)
156
187
        self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
157
 
        self.assertIs(None, dlg._pending)
 
188
        self.assertEquals([], dlg._pending)
158
189
        self.assertTrue(dlg._is_checkout)
159
190
 
160
191
    def test_setup_parameters_pending(self):
185
216
        self.assertEqual([], delta.removed)
186
217
        self.assertEqual([(u'a', 'a-id', 'file')], delta.added)
187
218
 
 
219
    def test_on_treeview_files_cursor_changed_no_selection(self):
 
220
        MockMethod.bind(self, CommitDialogNoWidgets, '_update_per_file_info')
 
221
        tree = self.make_branch_and_tree('tree')
 
222
        rev_id = tree.commit('first')
 
223
        dlg = CommitDialogNoWidgets(tree)
 
224
        treeview = Gtk.TreeView()
 
225
        dlg._on_treeview_files_cursor_changed(treeview)
 
226
        self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
 
227
 
 
228
    def test_on_treeview_files_cursor_changed_with_destroyed_treeview(self):
 
229
        MockMethod.bind(self, CommitDialogNoWidgets, '_update_per_file_info')
 
230
        tree = self.make_branch_and_tree('tree')
 
231
        rev_id = tree.commit('first')
 
232
        dlg = CommitDialogNoWidgets(tree)
 
233
        treeview = Gtk.TreeView()
 
234
        treeview.destroy()
 
235
        dlg._on_treeview_files_cursor_changed(treeview)
 
236
        self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
 
237
 
 
238
    def test_get_line_height(self):
 
239
        tree = self.make_branch_and_tree('tree')
 
240
        dlg = CommitDialogNoWidgets(tree)
 
241
        textview = Gtk.TextView()
 
242
        line_height = dlg.get_line_height(textview)
 
243
        self.assertIsInstance(line_height, int)
 
244
 
188
245
 
189
246
class TestCommitDialog(tests.TestCaseWithTransport):
190
247
 
212
269
 
213
270
        commit_col = dlg._treeview_files.get_column(0)
214
271
        self.assertEqual('Commit', commit_col.get_title())
215
 
        renderer = commit_col.get_cell_renderers()[0]
 
272
        renderer = commit_col.get_cells()[0]
216
273
        self.assertTrue(renderer.get_property('activatable'))
217
274
 
218
275
        self.assertEqual('Commit all changes',
237
294
 
238
295
        commit_col = dlg._treeview_files.get_column(0)
239
296
        self.assertEqual('Commit*', commit_col.get_title())
240
 
        renderer = commit_col.get_cell_renderers()[0]
 
297
        renderer = commit_col.get_cells()[0]
241
298
        self.assertFalse(renderer.get_property('activatable'))
242
299
 
243
300
        values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
289
346
 
290
347
        dlg = commit.CommitDialog(tree)
291
348
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
292
 
        self.assertEqual([(None, None, True, 'All Files', ''),
 
349
        self.assertEqual([("", "", True, 'All Files', ''),
293
350
                          ('a-id', 'a', True, 'a', 'added'),
294
351
                          ('b-id', 'b', True, 'b/', 'added'),
295
352
                          ('c-id', 'b/c', True, 'b/c', 'added'),
306
363
 
307
364
        dlg = commit.CommitDialog(tree)
308
365
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
309
 
        self.assertEqual([(None, None, True, 'All Files', ''),
 
366
        self.assertEqual([("", "", True, 'All Files', ''),
310
367
                          ('b-id', 'd', True, 'b/ => d/', 'renamed'),
311
368
                          ('a-id', 'd/a', True, 'a => d/a', 'renamed'),
312
369
                         ], values)
321
378
 
322
379
        dlg = commit.CommitDialog(tree)
323
380
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
324
 
        self.assertEqual([(None, None, True, 'All Files', ''),
 
381
        self.assertEqual([("", "", True, 'All Files', ''),
325
382
                          ('a-id', 'a', True, 'a', 'modified'),
326
383
                         ], values)
327
384
 
341
398
 
342
399
        dlg = commit.CommitDialog(tree)
343
400
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
344
 
        self.assertEqual([(None, None, True, 'All Files', ''),
 
401
        self.assertEqual([("", "", True, 'All Files', ''),
345
402
                          ('b-id', 'd', True, 'b/ => d/', 'renamed'),
346
403
                          ('a-id', 'd/a', True, 'a => d/a', 'renamed and modified'),
347
404
                          ('c-id', 'd/c', True, 'd/c', 'modified'),
364
421
 
365
422
        dlg = commit.CommitDialog(tree)
366
423
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
367
 
        self.assertEqual([(None, None, True, 'All Files', ''),
 
424
        self.assertEqual([("", "", True, 'All Files', ''),
368
425
                          ('a-id', 'a', True, 'a => a/', 'kind changed'),
369
426
                          # ('b-id', 'c', True, 'b => c/', 'renamed and modified'),
370
427
                         ], values)
380
437
 
381
438
        dlg = commit.CommitDialog(tree)
382
439
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
383
 
        self.assertEqual([(None, None, True, 'All Files', ''),
 
440
        self.assertEqual([("", "", True, 'All Files', ''),
384
441
                          ('a-id', 'a', True, 'a', 'removed'),
385
442
                          ('b-id', 'b', True, 'b/', 'removed'),
386
443
                         ], values)
387
444
        # All Files should be selected
388
 
        self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
 
445
        self.assertEqual(
 
446
            (Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
389
447
 
390
448
    def test_filelist_with_selected(self):
391
449
        tree = self.make_branch_and_tree('tree')
394
452
 
395
453
        dlg = commit.CommitDialog(tree, selected='a')
396
454
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
397
 
        self.assertEqual([(None, None, False, 'All Files', ''),
 
455
        self.assertEqual([("", "", False, 'All Files', ''),
398
456
                          ('a-id', 'a', True, 'a', 'added'),
399
457
                          ('b-id', 'b', False, 'b/', 'added'),
400
458
                         ], values)
401
459
        # This file should also be selected in the file list, rather than the
402
460
        # 'All Files' selection
403
 
        self.assertEqual(((1,), None), dlg._treeview_files.get_cursor())
 
461
        self.assertEqual(
 
462
            (Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
404
463
 
405
464
    def test_diff_view(self):
406
465
        tree = self.make_branch_and_tree('tree')
414
473
        dlg = commit.CommitDialog(tree)
415
474
        diff_buffer = dlg._diff_view.buffer
416
475
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
417
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
476
                                    diff_buffer.get_end_iter(),
 
477
                                    True).splitlines(True)
418
478
 
419
479
        self.assertEqual("=== modified file 'a'\n", text[0])
420
480
        self.assertContainsRe(text[1],
465
525
        self.assertFalse(dlg._file_message_expander.get_expanded())
466
526
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
467
527
 
468
 
        dlg._treeview_files.set_cursor((1,))
 
528
        dlg._treeview_files.set_cursor(
 
529
            Gtk.TreePath(path=1), None, False)
469
530
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
470
531
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
471
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
532
                                    diff_buffer.get_end_iter(),
 
533
                                    True).splitlines(True)
472
534
        self.assertEqual("=== added file 'a'\n", text[0])
473
535
        self.assertContainsRe(text[1],
474
536
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
482
544
        self.assertTrue(dlg._file_message_expander.get_expanded())
483
545
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
484
546
 
485
 
        dlg._treeview_files.set_cursor((2,))
 
547
        dlg._treeview_files.set_cursor(
 
548
            Gtk.TreePath(path=2), None, False)
486
549
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
487
550
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
488
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
551
                                    diff_buffer.get_end_iter(),
 
552
                                    True).splitlines(True)
489
553
        self.assertEqual("=== added file 'b'\n", text[0])
490
554
        self.assertContainsRe(text[1],
491
555
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
499
563
        self.assertTrue(dlg._file_message_expander.get_expanded())
500
564
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
501
565
 
502
 
        dlg._treeview_files.set_cursor((0,))
 
566
        dlg._treeview_files.set_cursor(
 
567
            Gtk.TreePath(path=0), None, False)
503
568
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
504
569
        self.assertEqual('File commit message',
505
570
                         dlg._file_message_expander.get_label())
515
580
 
516
581
        def get_file_text():
517
582
            buf = dlg._file_message_text_view.get_buffer()
518
 
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
 
583
            return buf.get_text(
 
584
                buf.get_start_iter(), buf.get_end_iter(), True)
519
585
 
520
586
        def get_saved_text(path):
521
587
            """Get the saved text for a given record."""
528
594
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
529
595
        self.assertEqual('', get_file_text())
530
596
 
531
 
        dlg._treeview_files.set_cursor((1,))
 
597
        dlg._treeview_files.set_cursor(
 
598
            Gtk.TreePath(path=1), None, False)
532
599
        self.assertEqual('Commit message for a',
533
600
                         dlg._file_message_expander.get_label())
534
601
        self.assertTrue(dlg._file_message_expander.get_expanded())
541
608
        # We should have updated the ListStore with the new file commit info
542
609
        self.assertEqual('Some text\nfor a\n', get_saved_text(1))
543
610
 
544
 
        dlg._treeview_files.set_cursor((2,))
 
611
        dlg._treeview_files.set_cursor(
 
612
            Gtk.TreePath(path=2), None, False)
545
613
        self.assertEqual('Commit message for b/',
546
614
                         dlg._file_message_expander.get_label())
547
615
        self.assertTrue(dlg._file_message_expander.get_expanded())
552
620
        dlg._set_file_commit_message('More text\nfor b\n')
553
621
        # Now switch back to 'a'. The message should be saved, and the buffer
554
622
        # should be updated with the other text
555
 
        dlg._treeview_files.set_cursor((1,))
 
623
        dlg._treeview_files.set_cursor(
 
624
            Gtk.TreePath(path=1), None, False)
556
625
        self.assertEqual('More text\nfor b\n', get_saved_text(2))
557
626
        self.assertEqual('Commit message for a',
558
627
                         dlg._file_message_expander.get_label())
567
636
        tree.add(['a', 'b'], ['a-id', 'b-id'])
568
637
 
569
638
        dlg = commit.CommitDialog(tree)
570
 
        self.assertEqual([(None, None, True),
 
639
        self.assertEqual([("", "", True),
571
640
                          ('a-id', 'a', True),
572
641
                          ('b-id', 'b', True),
573
642
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
578
647
        #       do with. So instead, we just call toggle directly, and assume
579
648
        #       that toggle is hooked in correctly
580
649
        # column = dlg._treeview_files.get_column(0)
581
 
        # renderer = column.get_cell_renderers()[0]
 
650
        # renderer = column.get_cells()[0]
582
651
 
583
652
        # Toggle a single entry should set just that entry to False
584
653
        dlg._toggle_commit(None, 1, dlg._files_store)
585
 
        self.assertEqual([(None, None, True),
 
654
        self.assertEqual([("", "", True),
586
655
                          ('a-id', 'a', False),
587
656
                          ('b-id', 'b', True),
588
657
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
589
658
 
590
659
        # Toggling the main entry should set all entries
591
660
        dlg._toggle_commit(None, 0, dlg._files_store)
592
 
        self.assertEqual([(None, None, False),
 
661
        self.assertEqual([("", "", False),
593
662
                          ('a-id', 'a', False),
594
663
                          ('b-id', 'b', False),
595
664
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
596
665
 
597
666
        dlg._toggle_commit(None, 2, dlg._files_store)
598
 
        self.assertEqual([(None, None, False),
 
667
        self.assertEqual([("", "", False),
599
668
                          ('a-id', 'a', False),
600
669
                          ('b-id', 'b', True),
601
670
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
602
671
 
603
672
        dlg._toggle_commit(None, 0, dlg._files_store)
604
 
        self.assertEqual([(None, None, True),
 
673
        self.assertEqual([("", "", True),
605
674
                          ('a-id', 'a', True),
606
675
                          ('b-id', 'b', True),
607
676
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
631
700
        dlg._commit_selected_radio.set_active(True)
632
701
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
633
702
 
634
 
        dlg._treeview_files.set_cursor((1,))
 
703
        dlg._treeview_files.set_cursor(
 
704
            Gtk.TreePath(path=1), None, False)
635
705
        dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
636
 
        dlg._treeview_files.set_cursor((2,))
 
706
        dlg._treeview_files.set_cursor(
 
707
            Gtk.TreePath(path=2), None, False)
637
708
        dlg._set_file_commit_message('message\nfor b_dir\n')
638
709
 
639
710
        self.assertEqual((['a_file', 'b_dir'],
659
730
        dlg._commit_selected_radio.set_active(True)
660
731
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
661
732
 
662
 
        dlg._treeview_files.set_cursor((1,))
 
733
        dlg._treeview_files.set_cursor(
 
734
            Gtk.TreePath(path=1), None, False)
663
735
        dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
664
 
        dlg._treeview_files.set_cursor((2,))
 
736
        dlg._treeview_files.set_cursor(
 
737
            Gtk.TreePath(path=2), None, False)
665
738
        dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
666
739
 
667
740
        self.assertEqual((['a_file', 'b_dir'],
680
753
        def _question_yes(*args, **kwargs):
681
754
            self.questions.append(args)
682
755
            self.questions.append('YES')
683
 
            return gtk.RESPONSE_YES
 
756
            return Gtk.ResponseType.YES
684
757
        dlg._question_dialog = _question_yes
685
758
 
686
759
    def _set_question_no(self, dlg):
689
762
        def _question_no(*args, **kwargs):
690
763
            self.questions.append(args)
691
764
            self.questions.append('NO')
692
 
            return gtk.RESPONSE_NO
 
765
            return Gtk.ResponseType.NO
693
766
        dlg._question_dialog = _question_no
694
767
 
695
768
 
974
1047
 
975
1048
        dlg = commit.CommitDialog(tree)
976
1049
        dlg._commit_selected_radio.set_active(True) # enable partial
977
 
        dlg._treeview_files.set_cursor((1,))
 
1050
        dlg._treeview_files.set_cursor(
 
1051
            Gtk.TreePath(path=1), None, False)
978
1052
        dlg._set_file_commit_message('Message for A\n')
979
 
        dlg._treeview_files.set_cursor((2,))
 
1053
        dlg._treeview_files.set_cursor(
 
1054
            Gtk.TreePath(path=2), None, False)
980
1055
        dlg._set_file_commit_message('Message for B\n')
981
1056
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
982
1057
        dlg._set_global_commit_message('Commit just "a"')
1009
1084
        tree.merge_from_branch(tree2.branch)
1010
1085
 
1011
1086
        dlg = commit.CommitDialog(tree)
1012
 
        dlg._treeview_files.set_cursor((1,)) # 'a'
 
1087
        dlg._treeview_files.set_cursor(
 
1088
            Gtk.TreePath(path=1), None, False) # 'a'
1013
1089
        dlg._set_file_commit_message('Message for A\n')
1014
1090
        # No message for 'B'
1015
1091
        dlg._set_global_commit_message('Merging from "tree2"\n')
1032
1108
                         bencode.bdecode(file_info.encode('UTF-8')))
1033
1109
 
1034
1110
    def test_commit_unicode_messages(self):
1035
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
1111
        self.requireFeature(UnicodeFilenameFeature)
1036
1112
 
1037
1113
        tree = self.make_branch_and_tree('tree')
1038
1114
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1040
1116
        tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
1041
1117
 
1042
1118
        dlg = commit.CommitDialog(tree)
1043
 
        dlg._treeview_files.set_cursor((1,)) # 'a'
 
1119
        dlg._treeview_files.set_cursor(
 
1120
            Gtk.TreePath(path=1), None, False) # 'a'
1044
1121
        dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
1045
 
        dlg._treeview_files.set_cursor((2,)) # omega
 
1122
        dlg._treeview_files.set_cursor(
 
1123
            Gtk.TreePath(path=2), None, False) # omega
1046
1124
        dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1047
1125
        dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1048
1126
 
1104
1182
        super(TestSavedCommitMessages, self).setUp()
1105
1183
        # Install our hook
1106
1184
        branch.Branch.hooks.install_named_hook(
1107
 
            'post_uncommit', commit.save_commit_messages, None)
 
1185
            'post_uncommit', commitmsgs.save_commit_messages, None)
1108
1186
 
1109
1187
    def _get_file_info_dict(self, rank):
1110
 
        file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
1111
 
                     dict(path='b', file_id='b-id', message='b msg %d' % rank)]
 
1188
        file_info = [dict(path='a', file_id='a-id',
 
1189
                          message='a {msg} %d' % rank),
 
1190
                     dict(path='b', file_id='b-id',
 
1191
                          message='b msg %d' % rank)]
1112
1192
        return file_info
1113
1193
 
1114
1194
    def _get_file_info_revprops(self, rank):
1116
1196
        return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
1117
1197
 
1118
1198
    def _get_commit_message(self):
1119
 
        return self.config.get_user_option('gtk_global_commit_message')
 
1199
        return self.config.get_user_option(
 
1200
            'gtk_global_commit_message', expand=False)
1120
1201
 
1121
1202
    def _get_file_commit_messages(self):
1122
 
        return self.config.get_user_option('gtk_file_commit_messages')
 
1203
        return self.config.get_user_option(
 
1204
            'gtk_file_commit_messages', expand=False)
1123
1205
 
1124
1206
 
1125
1207
class TestUncommitHook(TestSavedCommitMessages):
1141
1223
    def test_uncommit_one_by_one(self):
1142
1224
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1143
1225
        self.assertEquals(u'three', self._get_commit_message())
1144
 
        self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
 
1226
        self.assertEquals(u'd4:a-id9:a {msg} 34:b-id7:b msg 3e',
1145
1227
                          self._get_file_commit_messages())
1146
1228
 
1147
1229
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1148
1230
        self.assertEquals(u'two\n******\nthree', self._get_commit_message())
1149
 
        self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
 
1231
        self.assertEquals(u'd4:a-id26:a {msg} 2\n******\na {msg} 3'
1150
1232
                          '4:b-id22:b msg 2\n******\nb msg 3e',
1151
1233
                          self._get_file_commit_messages())
1152
1234
 
1153
1235
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1154
1236
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
1155
1237
                          self._get_commit_message())
1156
 
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1157
 
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1158
 
                          self._get_file_commit_messages())
 
1238
        self.assertEquals(
 
1239
            u'd4:a-id43:a {msg} 1\n******\na {msg} 2\n******\na {msg} 3'
 
1240
            '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1241
            self._get_file_commit_messages())
1159
1242
 
1160
1243
    def test_uncommit_all_at_once(self):
1161
1244
        uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
1162
1245
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
1163
1246
                          self._get_commit_message())
1164
 
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1165
 
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1166
 
                          self._get_file_commit_messages())
 
1247
        self.assertEquals(
 
1248
            u'd4:a-id43:a {msg} 1\n******\na {msg} 2\n******\na {msg} 3'
 
1249
            '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1250
            self._get_file_commit_messages())
1167
1251
 
1168
1252
 
1169
1253
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1177
1261
        self.tree.add(['a'], ['a-id'])
1178
1262
        self.tree.add(['b'], ['b-id'])
1179
1263
        rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
1180
 
        rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
 
1264
        rev2 = self.tree.commit('two{x}',
 
1265
                                revprops=self._get_file_info_revprops(2))
1181
1266
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1182
1267
        self.build_tree_contents([('tree/a', 'new a content\n'),
1183
1268
                                  ('tree/b', 'new b content'),])
1192
1277
 
1193
1278
    def test_setup_saved_messages(self):
1194
1279
        # Check the initial setup
1195
 
        self.assertEquals(u'two', self._get_commit_message())
1196
 
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1280
        self.assertEquals(u'two{x}', self._get_commit_message())
 
1281
        self.assertEquals(u'd4:a-id9:a {msg} 24:b-id7:b msg 2e',
1197
1282
                          self._get_file_commit_messages())
1198
1283
 
1199
1284
    def test_messages_are_reloaded(self):
1200
1285
        dlg = self._get_commit_dialog(self.tree)
1201
 
        self.assertEquals(u'two', dlg._get_global_commit_message())
 
1286
        self.assertEquals(u'two{x}', dlg._get_global_commit_message())
1202
1287
        self.assertEquals(([u'a', u'b'],
1203
1288
                           [{ 'path': 'a',
1204
 
                             'file_id': 'a-id', 'message': 'a msg 2',},
 
1289
                             'file_id': 'a-id', 'message': 'a {msg} 2',},
1205
1290
                           {'path': 'b',
1206
1291
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
1207
1292
                          dlg._get_specific_files())
1216
1301
        dlg = self._get_commit_dialog(self.tree)
1217
1302
        self._set_question_yes(dlg) # Save messages
1218
1303
        dlg._do_cancel()
1219
 
        self.assertEquals(u'two', self._get_commit_message())
1220
 
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1304
        self.assertEquals(u'two{x}', self._get_commit_message())
 
1305
        self.assertEquals(u'd4:a-id9:a {msg} 24:b-id7:b msg 2e',
1221
1306
                          self._get_file_commit_messages())
1222
1307
 
1223
1308
    def test_messages_are_cleared_on_cancel_if_required(self):
1227
1312
        self.assertEquals(u'', self._get_commit_message())
1228
1313
        self.assertEquals(u'de',
1229
1314
                          self._get_file_commit_messages())
 
1315
 
 
1316
 
 
1317
class BzrHandlePatchTestCase(tests.TestCase):
 
1318
 
 
1319
    def setUp(self):
 
1320
        top = os.path.abspath(os.path.join(
 
1321
            os.path.dirname(__file__), os.pardir))
 
1322
        self.script = os.path.join(top, 'bzr-handle-patch')
 
1323
        self.env = dict(os.environ)
 
1324
        self.env['BZR_PLUGINS_AT'] = 'gtk@%s' % top
 
1325
        self.patch = NamedTemporaryFile()
 
1326
        self.patch.write('\n'.join([
 
1327
            "=== added file '_test.txt'",
 
1328
            "--- _test.txt      1970-01-01 00:00:00 +0000",
 
1329
            "+++ _test.txt      2012-02-03 20:00:34 +0000",
 
1330
            "@@ -0,0 +1,1 @@",
 
1331
            "+hello",
 
1332
            ]))
 
1333
        self.patch.flush()
 
1334
        super(BzrHandlePatchTestCase, self).setUp()
 
1335
 
 
1336
    def test_smoketest(self):
 
1337
        # This is a smoke test to verify the process starts.
 
1338
        bzr_notify = subprocess.Popen(
 
1339
            [self.script, self.patch.name, 'test'],
 
1340
            stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=self.env)
 
1341
        stdout, stderr = bzr_notify.communicate()
 
1342
        self.assertEqual('', stdout)
 
1343
        self.assertEqual('', stderr)