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>
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."""
21
from tempfile import NamedTemporaryFile
23
from gi.repository import Gtk
23
25
from bzrlib import (
30
from bzrlib import bencode
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
34
from bzrlib.plugins.gtk import commit
36
from bzrlib.plugins.gtk import (
40
from bzrlib.plugins.gtk.commitmsgs import SavedCommitMessagesManager
41
from bzrlib.plugins.gtk.tests import MockMethod
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('.')
46
self.assertIs(None, commit.pending_revisions(tree))
53
self.addCleanup(tree.lock_read().unlock)
54
self.assertEquals([], list(commit.pending_revisions(tree)))
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())
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())
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())
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
138
149
class TestCommitDialogSimple(tests.TestCaseWithTransport):
152
MockMethod.bind(self, CommitDialogNoWidgets, 'setup_params')
153
MockMethod.bind(self, CommitDialogNoWidgets, 'construct')
154
MockMethod.bind(self, CommitDialogNoWidgets, 'fill_in_data')
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)
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')
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)
149
180
def test_setup_parameters_checkout(self):
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)
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)
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)
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()
235
dlg._on_treeview_files_cursor_changed(treeview)
236
self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
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)
189
246
class TestCommitDialog(tests.TestCaseWithTransport):
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'))
218
275
self.assertEqual('Commit all changes',
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'))
243
300
values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
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'),
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'),
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'),
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'),
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'),
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'),
387
444
# All Files should be selected
388
self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
446
(Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
390
448
def test_filelist_with_selected(self):
391
449
tree = self.make_branch_and_tree('tree')
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'),
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())
462
(Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
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)
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'))
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'))
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'))
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())
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())
584
buf.get_start_iter(), buf.get_end_iter(), True)
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())
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))
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'])
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]
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])
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])
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])
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())
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')
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())
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')
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
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
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)
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')))
1034
1110
def test_commit_unicode_messages(self):
1035
self.requireFeature(tests.UnicodeFilenameFeature)
1111
self.requireFeature(UnicodeFilenameFeature)
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'])
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')
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)
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
1114
1194
def _get_file_info_revprops(self, rank):
1116
1196
return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
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)
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)
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())
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())
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())
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())
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())
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())
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'),])
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())
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',},
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())
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())
1317
class BzrHandlePatchTestCase(tests.TestCase):
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",
1334
super(BzrHandlePatchTestCase, self).setUp()
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)