1
# Copyright (C) 2007, 2008, 2009, 2011, 2012, 2013 John Arbash Meinel <john@arbash-meinel.com>
1
# Copyright (C) 2007, 2008 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
25
23
from bzrlib import (
31
from bzrlib.tests.features import UnicodeFilenameFeature
32
except ImportError: # bzr < 2.5
33
from bzrlib.tests import UnicodeFilenameFeature
34
from bzrlib import bencode
30
from bzrlib import bencode
32
from bzrlib.util import bencode
36
from bzrlib.plugins.gtk import (
40
from bzrlib.plugins.gtk.commitmsgs import SavedCommitMessagesManager
41
from bzrlib.plugins.gtk.tests import MockMethod
34
from bzrlib.plugins.gtk import commit
44
37
# TODO: All we need is basic ancestry code to test this, we shouldn't need a
50
43
tree = self.make_branch_and_tree('.')
53
self.addCleanup(tree.lock_read().unlock)
54
self.assertEquals([], list(commit.pending_revisions(tree)))
46
self.assertIs(None, commit.pending_revisions(tree))
56
48
def test_pending_revisions_simple(self):
57
49
tree = self.make_branch_and_tree('tree')
61
53
tree.merge_from_branch(tree2.branch)
62
54
self.assertEqual([rev_id1, rev_id2], tree.get_parent_ids())
64
self.addCleanup(tree.lock_read().unlock)
65
pending_revisions = list(commit.pending_revisions(tree))
56
pending_revisions = commit.pending_revisions(tree)
66
57
# One primary merge
67
58
self.assertEqual(1, len(pending_revisions))
68
59
# Revision == rev_id2
80
71
tree.merge_from_branch(tree2.branch)
81
72
self.assertEqual([rev_id1, rev_id4], tree.get_parent_ids())
83
self.addCleanup(tree.lock_read().unlock)
84
pending_revisions = list(commit.pending_revisions(tree))
74
pending_revisions = commit.pending_revisions(tree)
85
75
# One primary merge
86
76
self.assertEqual(1, len(pending_revisions))
87
77
# Revision == rev_id2
104
94
tree.merge_from_branch(tree3.branch, force=True)
105
95
self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
107
self.addCleanup(tree.lock_read().unlock)
108
pending_revisions = list(commit.pending_revisions(tree))
97
pending_revisions = commit.pending_revisions(tree)
109
98
# Two primary merges
110
99
self.assertEqual(2, len(pending_revisions))
111
100
# Revision == rev_id2
149
138
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)
171
140
def test_setup_parameters_no_pending(self):
172
141
tree = self.make_branch_and_tree('tree')
173
142
rev_id = tree.commit('first')
175
144
dlg = CommitDialogNoWidgets(tree)
176
145
self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
177
self.assertEquals([], dlg._pending)
146
self.assertIs(None, dlg._pending)
178
147
self.assertFalse(dlg._is_checkout)
180
149
def test_setup_parameters_checkout(self):
186
155
dlg = CommitDialogNoWidgets(tree2)
187
156
self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
188
self.assertEquals([], dlg._pending)
157
self.assertIs(None, dlg._pending)
189
158
self.assertTrue(dlg._is_checkout)
191
160
def test_setup_parameters_pending(self):
216
185
self.assertEqual([], delta.removed)
217
186
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)
246
189
class TestCommitDialog(tests.TestCaseWithTransport):
270
213
commit_col = dlg._treeview_files.get_column(0)
271
214
self.assertEqual('Commit', commit_col.get_title())
272
renderer = commit_col.get_cells()[0]
215
renderer = commit_col.get_cell_renderers()[0]
273
216
self.assertTrue(renderer.get_property('activatable'))
275
218
self.assertEqual('Commit all changes',
295
238
commit_col = dlg._treeview_files.get_column(0)
296
239
self.assertEqual('Commit*', commit_col.get_title())
297
renderer = commit_col.get_cells()[0]
240
renderer = commit_col.get_cell_renderers()[0]
298
241
self.assertFalse(renderer.get_property('activatable'))
300
243
values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
347
290
dlg = commit.CommitDialog(tree)
348
291
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
349
self.assertEqual([("", "", True, 'All Files', ''),
292
self.assertEqual([(None, None, True, 'All Files', ''),
350
293
('a-id', 'a', True, 'a', 'added'),
351
294
('b-id', 'b', True, 'b/', 'added'),
352
295
('c-id', 'b/c', True, 'b/c', 'added'),
364
307
dlg = commit.CommitDialog(tree)
365
308
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
366
self.assertEqual([("", "", True, 'All Files', ''),
309
self.assertEqual([(None, None, True, 'All Files', ''),
367
310
('b-id', 'd', True, 'b/ => d/', 'renamed'),
368
311
('a-id', 'd/a', True, 'a => d/a', 'renamed'),
379
322
dlg = commit.CommitDialog(tree)
380
323
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
381
self.assertEqual([("", "", True, 'All Files', ''),
324
self.assertEqual([(None, None, True, 'All Files', ''),
382
325
('a-id', 'a', True, 'a', 'modified'),
399
342
dlg = commit.CommitDialog(tree)
400
343
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
401
self.assertEqual([("", "", True, 'All Files', ''),
344
self.assertEqual([(None, None, True, 'All Files', ''),
402
345
('b-id', 'd', True, 'b/ => d/', 'renamed'),
403
346
('a-id', 'd/a', True, 'a => d/a', 'renamed and modified'),
404
347
('c-id', 'd/c', True, 'd/c', 'modified'),
422
365
dlg = commit.CommitDialog(tree)
423
366
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
424
self.assertEqual([("", "", True, 'All Files', ''),
367
self.assertEqual([(None, None, True, 'All Files', ''),
425
368
('a-id', 'a', True, 'a => a/', 'kind changed'),
426
369
# ('b-id', 'c', True, 'b => c/', 'renamed and modified'),
438
381
dlg = commit.CommitDialog(tree)
439
382
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
440
self.assertEqual([("", "", True, 'All Files', ''),
383
self.assertEqual([(None, None, True, 'All Files', ''),
441
384
('a-id', 'a', True, 'a', 'removed'),
442
385
('b-id', 'b', True, 'b/', 'removed'),
444
387
# All Files should be selected
446
(Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
388
self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
448
390
def test_filelist_with_selected(self):
449
391
tree = self.make_branch_and_tree('tree')
453
395
dlg = commit.CommitDialog(tree, selected='a')
454
396
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
455
self.assertEqual([("", "", False, 'All Files', ''),
397
self.assertEqual([(None, None, False, 'All Files', ''),
456
398
('a-id', 'a', True, 'a', 'added'),
457
399
('b-id', 'b', False, 'b/', 'added'),
459
401
# This file should also be selected in the file list, rather than the
460
402
# 'All Files' selection
462
(Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
403
self.assertEqual(((1,), None), dlg._treeview_files.get_cursor())
464
405
def test_diff_view(self):
465
406
tree = self.make_branch_and_tree('tree')
473
414
dlg = commit.CommitDialog(tree)
474
415
diff_buffer = dlg._diff_view.buffer
475
416
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
476
diff_buffer.get_end_iter(),
477
True).splitlines(True)
417
diff_buffer.get_end_iter()).splitlines(True)
479
419
self.assertEqual("=== modified file 'a'\n", text[0])
480
420
self.assertContainsRe(text[1],
525
465
self.assertFalse(dlg._file_message_expander.get_expanded())
526
466
self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
528
dlg._treeview_files.set_cursor(
529
Gtk.TreePath(path=1), None, False)
468
dlg._treeview_files.set_cursor((1,))
530
469
self.assertEqual('Diff for a', dlg._diff_label.get_text())
531
470
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
532
diff_buffer.get_end_iter(),
533
True).splitlines(True)
471
diff_buffer.get_end_iter()).splitlines(True)
534
472
self.assertEqual("=== added file 'a'\n", text[0])
535
473
self.assertContainsRe(text[1],
536
474
r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
544
482
self.assertTrue(dlg._file_message_expander.get_expanded())
545
483
self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
547
dlg._treeview_files.set_cursor(
548
Gtk.TreePath(path=2), None, False)
485
dlg._treeview_files.set_cursor((2,))
549
486
self.assertEqual('Diff for b', dlg._diff_label.get_text())
550
487
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
551
diff_buffer.get_end_iter(),
552
True).splitlines(True)
488
diff_buffer.get_end_iter()).splitlines(True)
553
489
self.assertEqual("=== added file 'b'\n", text[0])
554
490
self.assertContainsRe(text[1],
555
491
r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
563
499
self.assertTrue(dlg._file_message_expander.get_expanded())
564
500
self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
566
dlg._treeview_files.set_cursor(
567
Gtk.TreePath(path=0), None, False)
502
dlg._treeview_files.set_cursor((0,))
568
503
self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
569
504
self.assertEqual('File commit message',
570
505
dlg._file_message_expander.get_label())
581
516
def get_file_text():
582
517
buf = dlg._file_message_text_view.get_buffer()
584
buf.get_start_iter(), buf.get_end_iter(), True)
518
return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
586
520
def get_saved_text(path):
587
521
"""Get the saved text for a given record."""
594
528
self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
595
529
self.assertEqual('', get_file_text())
597
dlg._treeview_files.set_cursor(
598
Gtk.TreePath(path=1), None, False)
531
dlg._treeview_files.set_cursor((1,))
599
532
self.assertEqual('Commit message for a',
600
533
dlg._file_message_expander.get_label())
601
534
self.assertTrue(dlg._file_message_expander.get_expanded())
608
541
# We should have updated the ListStore with the new file commit info
609
542
self.assertEqual('Some text\nfor a\n', get_saved_text(1))
611
dlg._treeview_files.set_cursor(
612
Gtk.TreePath(path=2), None, False)
544
dlg._treeview_files.set_cursor((2,))
613
545
self.assertEqual('Commit message for b/',
614
546
dlg._file_message_expander.get_label())
615
547
self.assertTrue(dlg._file_message_expander.get_expanded())
620
552
dlg._set_file_commit_message('More text\nfor b\n')
621
553
# Now switch back to 'a'. The message should be saved, and the buffer
622
554
# should be updated with the other text
623
dlg._treeview_files.set_cursor(
624
Gtk.TreePath(path=1), None, False)
555
dlg._treeview_files.set_cursor((1,))
625
556
self.assertEqual('More text\nfor b\n', get_saved_text(2))
626
557
self.assertEqual('Commit message for a',
627
558
dlg._file_message_expander.get_label())
636
567
tree.add(['a', 'b'], ['a-id', 'b-id'])
638
569
dlg = commit.CommitDialog(tree)
639
self.assertEqual([("", "", True),
570
self.assertEqual([(None, None, True),
640
571
('a-id', 'a', True),
641
572
('b-id', 'b', True),
642
573
], [(r[0], r[1], r[2]) for r in dlg._files_store])
647
578
# do with. So instead, we just call toggle directly, and assume
648
579
# that toggle is hooked in correctly
649
580
# column = dlg._treeview_files.get_column(0)
650
# renderer = column.get_cells()[0]
581
# renderer = column.get_cell_renderers()[0]
652
583
# Toggle a single entry should set just that entry to False
653
584
dlg._toggle_commit(None, 1, dlg._files_store)
654
self.assertEqual([("", "", True),
585
self.assertEqual([(None, None, True),
655
586
('a-id', 'a', False),
656
587
('b-id', 'b', True),
657
588
], [(r[0], r[1], r[2]) for r in dlg._files_store])
659
590
# Toggling the main entry should set all entries
660
591
dlg._toggle_commit(None, 0, dlg._files_store)
661
self.assertEqual([("", "", False),
592
self.assertEqual([(None, None, False),
662
593
('a-id', 'a', False),
663
594
('b-id', 'b', False),
664
595
], [(r[0], r[1], r[2]) for r in dlg._files_store])
666
597
dlg._toggle_commit(None, 2, dlg._files_store)
667
self.assertEqual([("", "", False),
598
self.assertEqual([(None, None, False),
668
599
('a-id', 'a', False),
669
600
('b-id', 'b', True),
670
601
], [(r[0], r[1], r[2]) for r in dlg._files_store])
672
603
dlg._toggle_commit(None, 0, dlg._files_store)
673
self.assertEqual([("", "", True),
604
self.assertEqual([(None, None, True),
674
605
('a-id', 'a', True),
675
606
('b-id', 'b', True),
676
607
], [(r[0], r[1], r[2]) for r in dlg._files_store])
700
631
dlg._commit_selected_radio.set_active(True)
701
632
self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
703
dlg._treeview_files.set_cursor(
704
Gtk.TreePath(path=1), None, False)
634
dlg._treeview_files.set_cursor((1,))
705
635
dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
706
dlg._treeview_files.set_cursor(
707
Gtk.TreePath(path=2), None, False)
636
dlg._treeview_files.set_cursor((2,))
708
637
dlg._set_file_commit_message('message\nfor b_dir\n')
710
639
self.assertEqual((['a_file', 'b_dir'],
730
659
dlg._commit_selected_radio.set_active(True)
731
660
self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
733
dlg._treeview_files.set_cursor(
734
Gtk.TreePath(path=1), None, False)
662
dlg._treeview_files.set_cursor((1,))
735
663
dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
736
dlg._treeview_files.set_cursor(
737
Gtk.TreePath(path=2), None, False)
664
dlg._treeview_files.set_cursor((2,))
738
665
dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
740
667
self.assertEqual((['a_file', 'b_dir'],
753
680
def _question_yes(*args, **kwargs):
754
681
self.questions.append(args)
755
682
self.questions.append('YES')
756
return Gtk.ResponseType.YES
683
return gtk.RESPONSE_YES
757
684
dlg._question_dialog = _question_yes
759
686
def _set_question_no(self, dlg):
762
689
def _question_no(*args, **kwargs):
763
690
self.questions.append(args)
764
691
self.questions.append('NO')
765
return Gtk.ResponseType.NO
692
return gtk.RESPONSE_NO
766
693
dlg._question_dialog = _question_no
1048
975
dlg = commit.CommitDialog(tree)
1049
976
dlg._commit_selected_radio.set_active(True) # enable partial
1050
dlg._treeview_files.set_cursor(
1051
Gtk.TreePath(path=1), None, False)
977
dlg._treeview_files.set_cursor((1,))
1052
978
dlg._set_file_commit_message('Message for A\n')
1053
dlg._treeview_files.set_cursor(
1054
Gtk.TreePath(path=2), None, False)
979
dlg._treeview_files.set_cursor((2,))
1055
980
dlg._set_file_commit_message('Message for B\n')
1056
981
dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
1057
982
dlg._set_global_commit_message('Commit just "a"')
1084
1009
tree.merge_from_branch(tree2.branch)
1086
1011
dlg = commit.CommitDialog(tree)
1087
dlg._treeview_files.set_cursor(
1088
Gtk.TreePath(path=1), None, False) # 'a'
1012
dlg._treeview_files.set_cursor((1,)) # 'a'
1089
1013
dlg._set_file_commit_message('Message for A\n')
1090
1014
# No message for 'B'
1091
1015
dlg._set_global_commit_message('Merging from "tree2"\n')
1108
1032
bencode.bdecode(file_info.encode('UTF-8')))
1110
1034
def test_commit_unicode_messages(self):
1111
self.requireFeature(UnicodeFilenameFeature)
1035
self.requireFeature(tests.UnicodeFilenameFeature)
1113
1037
tree = self.make_branch_and_tree('tree')
1114
1038
tree.branch.get_config().set_user_option('per_file_commits', 'true')
1116
1040
tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
1118
1042
dlg = commit.CommitDialog(tree)
1119
dlg._treeview_files.set_cursor(
1120
Gtk.TreePath(path=1), None, False) # 'a'
1043
dlg._treeview_files.set_cursor((1,)) # 'a'
1121
1044
dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
1122
dlg._treeview_files.set_cursor(
1123
Gtk.TreePath(path=2), None, False) # omega
1045
dlg._treeview_files.set_cursor((2,)) # omega
1124
1046
dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1125
1047
dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1182
1104
super(TestSavedCommitMessages, self).setUp()
1183
1105
# Install our hook
1184
1106
branch.Branch.hooks.install_named_hook(
1185
'post_uncommit', commitmsgs.save_commit_messages, None)
1107
'post_uncommit', commit.save_commit_messages, None)
1187
1109
def _get_file_info_dict(self, 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)]
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)]
1192
1112
return file_info
1194
1114
def _get_file_info_revprops(self, rank):
1196
1116
return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
1198
1118
def _get_commit_message(self):
1199
return self.config.get_user_option(
1200
'gtk_global_commit_message', expand=False)
1119
return self.config.get_user_option('gtk_global_commit_message')
1202
1121
def _get_file_commit_messages(self):
1203
return self.config.get_user_option(
1204
'gtk_file_commit_messages', expand=False)
1122
return self.config.get_user_option('gtk_file_commit_messages')
1207
1125
class TestUncommitHook(TestSavedCommitMessages):
1223
1141
def test_uncommit_one_by_one(self):
1224
1142
uncommit.uncommit(self.tree.branch, tree=self.tree)
1225
1143
self.assertEquals(u'three', self._get_commit_message())
1226
self.assertEquals(u'd4:a-id9:a {msg} 34:b-id7:b msg 3e',
1144
self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
1227
1145
self._get_file_commit_messages())
1229
1147
uncommit.uncommit(self.tree.branch, tree=self.tree)
1230
1148
self.assertEquals(u'two\n******\nthree', self._get_commit_message())
1231
self.assertEquals(u'd4:a-id26:a {msg} 2\n******\na {msg} 3'
1149
self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
1232
1150
'4:b-id22:b msg 2\n******\nb msg 3e',
1233
1151
self._get_file_commit_messages())
1235
1153
uncommit.uncommit(self.tree.branch, tree=self.tree)
1236
1154
self.assertEquals(u'one\n******\ntwo\n******\nthree',
1237
1155
self._get_commit_message())
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())
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())
1243
1160
def test_uncommit_all_at_once(self):
1244
1161
uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
1245
1162
self.assertEquals(u'one\n******\ntwo\n******\nthree',
1246
1163
self._get_commit_message())
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())
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())
1253
1169
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1261
1177
self.tree.add(['a'], ['a-id'])
1262
1178
self.tree.add(['b'], ['b-id'])
1263
1179
rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
1264
rev2 = self.tree.commit('two{x}',
1265
revprops=self._get_file_info_revprops(2))
1180
rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
1266
1181
uncommit.uncommit(self.tree.branch, tree=self.tree)
1267
1182
self.build_tree_contents([('tree/a', 'new a content\n'),
1268
1183
('tree/b', 'new b content'),])
1278
1193
def test_setup_saved_messages(self):
1279
1194
# Check the initial setup
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',
1195
self.assertEquals(u'two', self._get_commit_message())
1196
self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1282
1197
self._get_file_commit_messages())
1284
1199
def test_messages_are_reloaded(self):
1285
1200
dlg = self._get_commit_dialog(self.tree)
1286
self.assertEquals(u'two{x}', dlg._get_global_commit_message())
1201
self.assertEquals(u'two', dlg._get_global_commit_message())
1287
1202
self.assertEquals(([u'a', u'b'],
1288
1203
[{ 'path': 'a',
1289
'file_id': 'a-id', 'message': 'a {msg} 2',},
1204
'file_id': 'a-id', 'message': 'a msg 2',},
1291
1206
'file_id': 'b-id', 'message': 'b msg 2',}],),
1292
1207
dlg._get_specific_files())
1301
1216
dlg = self._get_commit_dialog(self.tree)
1302
1217
self._set_question_yes(dlg) # Save messages
1303
1218
dlg._do_cancel()
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',
1219
self.assertEquals(u'two', self._get_commit_message())
1220
self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1306
1221
self._get_file_commit_messages())
1308
1223
def test_messages_are_cleared_on_cancel_if_required(self):
1312
1227
self.assertEquals(u'', self._get_commit_message())
1313
1228
self.assertEquals(u'de',
1314
1229
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)