29
from bzrlib import bencode
31
from bzrlib.util import bencode
29
from bzrlib.tests.features import UnicodeFilenameFeature
30
except ImportError: # bzr < 2.5
31
from bzrlib.tests import UnicodeFilenameFeature
32
from bzrlib import bencode
33
from bzrlib.plugins.gtk import commit
34
from bzrlib.plugins.gtk import (
36
40
# TODO: All we need is basic ancestry code to test this, we shouldn't need a
52
57
tree.merge_from_branch(tree2.branch)
53
58
self.assertEqual([rev_id1, rev_id2], tree.get_parent_ids())
60
self.addCleanup(tree.lock_read().unlock)
55
61
pending_revisions = commit.pending_revisions(tree)
56
62
# One primary merge
57
63
self.assertEqual(1, len(pending_revisions))
70
76
tree.merge_from_branch(tree2.branch)
71
77
self.assertEqual([rev_id1, rev_id4], tree.get_parent_ids())
79
self.addCleanup(tree.lock_read().unlock)
73
80
pending_revisions = commit.pending_revisions(tree)
74
81
# One primary merge
75
82
self.assertEqual(1, len(pending_revisions))
93
100
tree.merge_from_branch(tree3.branch, force=True)
94
101
self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
103
self.addCleanup(tree.lock_read().unlock)
96
104
pending_revisions = commit.pending_revisions(tree)
97
105
# Two primary merges
98
106
self.assertEqual(2, len(pending_revisions))
212
220
commit_col = dlg._treeview_files.get_column(0)
213
221
self.assertEqual('Commit', commit_col.get_title())
214
renderer = commit_col.get_cell_renderers()[0]
222
renderer = commit_col.get_cells()[0]
215
223
self.assertTrue(renderer.get_property('activatable'))
217
225
self.assertEqual('Commit all changes',
237
245
commit_col = dlg._treeview_files.get_column(0)
238
246
self.assertEqual('Commit*', commit_col.get_title())
239
renderer = commit_col.get_cell_renderers()[0]
247
renderer = commit_col.get_cells()[0]
240
248
self.assertFalse(renderer.get_property('activatable'))
242
250
values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
289
297
dlg = commit.CommitDialog(tree)
290
298
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
291
self.assertEqual([(None, None, True, 'All Files', ''),
299
self.assertEqual([("", "", True, 'All Files', ''),
292
300
('a-id', 'a', True, 'a', 'added'),
293
301
('b-id', 'b', True, 'b/', 'added'),
294
302
('c-id', 'b/c', True, 'b/c', 'added'),
306
314
dlg = commit.CommitDialog(tree)
307
315
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
308
self.assertEqual([(None, None, True, 'All Files', ''),
316
self.assertEqual([("", "", True, 'All Files', ''),
309
317
('b-id', 'd', True, 'b/ => d/', 'renamed'),
310
318
('a-id', 'd/a', True, 'a => d/a', 'renamed'),
321
329
dlg = commit.CommitDialog(tree)
322
330
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
323
self.assertEqual([(None, None, True, 'All Files', ''),
331
self.assertEqual([("", "", True, 'All Files', ''),
324
332
('a-id', 'a', True, 'a', 'modified'),
341
349
dlg = commit.CommitDialog(tree)
342
350
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
343
self.assertEqual([(None, None, True, 'All Files', ''),
351
self.assertEqual([("", "", True, 'All Files', ''),
344
352
('b-id', 'd', True, 'b/ => d/', 'renamed'),
345
353
('a-id', 'd/a', True, 'a => d/a', 'renamed and modified'),
346
354
('c-id', 'd/c', True, 'd/c', 'modified'),
364
372
dlg = commit.CommitDialog(tree)
365
373
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
366
self.assertEqual([(None, None, True, 'All Files', ''),
374
self.assertEqual([("", "", True, 'All Files', ''),
367
375
('a-id', 'a', True, 'a => a/', 'kind changed'),
368
376
# ('b-id', 'c', True, 'b => c/', 'renamed and modified'),
380
388
dlg = commit.CommitDialog(tree)
381
389
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
382
self.assertEqual([(None, None, True, 'All Files', ''),
390
self.assertEqual([("", "", True, 'All Files', ''),
383
391
('a-id', 'a', True, 'a', 'removed'),
384
392
('b-id', 'b', True, 'b/', 'removed'),
386
394
# All Files should be selected
387
self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
396
(Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
389
398
def test_filelist_with_selected(self):
390
399
tree = self.make_branch_and_tree('tree')
394
403
dlg = commit.CommitDialog(tree, selected='a')
395
404
values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
396
self.assertEqual([(None, None, False, 'All Files', ''),
405
self.assertEqual([("", "", False, 'All Files', ''),
397
406
('a-id', 'a', True, 'a', 'added'),
398
407
('b-id', 'b', False, 'b/', 'added'),
400
409
# This file should also be selected in the file list, rather than the
401
410
# 'All Files' selection
402
self.assertEqual(((1,), None), dlg._treeview_files.get_cursor())
412
(Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
404
414
def test_diff_view(self):
405
415
tree = self.make_branch_and_tree('tree')
413
423
dlg = commit.CommitDialog(tree)
414
424
diff_buffer = dlg._diff_view.buffer
415
425
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
416
diff_buffer.get_end_iter()).splitlines(True)
426
diff_buffer.get_end_iter(),
427
True).splitlines(True)
418
429
self.assertEqual("=== modified file 'a'\n", text[0])
419
430
self.assertContainsRe(text[1],
464
475
self.assertFalse(dlg._file_message_expander.get_expanded())
465
476
self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
467
dlg._treeview_files.set_cursor((1,))
478
dlg._treeview_files.set_cursor(
479
Gtk.TreePath(path=1), None, False)
468
480
self.assertEqual('Diff for a', dlg._diff_label.get_text())
469
481
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
470
diff_buffer.get_end_iter()).splitlines(True)
482
diff_buffer.get_end_iter(),
483
True).splitlines(True)
471
484
self.assertEqual("=== added file 'a'\n", text[0])
472
485
self.assertContainsRe(text[1],
473
486
r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
481
494
self.assertTrue(dlg._file_message_expander.get_expanded())
482
495
self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
484
dlg._treeview_files.set_cursor((2,))
497
dlg._treeview_files.set_cursor(
498
Gtk.TreePath(path=2), None, False)
485
499
self.assertEqual('Diff for b', dlg._diff_label.get_text())
486
500
text = diff_buffer.get_text(diff_buffer.get_start_iter(),
487
diff_buffer.get_end_iter()).splitlines(True)
501
diff_buffer.get_end_iter(),
502
True).splitlines(True)
488
503
self.assertEqual("=== added file 'b'\n", text[0])
489
504
self.assertContainsRe(text[1],
490
505
r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
498
513
self.assertTrue(dlg._file_message_expander.get_expanded())
499
514
self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
501
dlg._treeview_files.set_cursor((0,))
516
dlg._treeview_files.set_cursor(
517
Gtk.TreePath(path=0), None, False)
502
518
self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
503
519
self.assertEqual('File commit message',
504
520
dlg._file_message_expander.get_label())
515
531
def get_file_text():
516
532
buf = dlg._file_message_text_view.get_buffer()
517
return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
534
buf.get_start_iter(), buf.get_end_iter(), True)
519
536
def get_saved_text(path):
520
537
"""Get the saved text for a given record."""
527
544
self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
528
545
self.assertEqual('', get_file_text())
530
dlg._treeview_files.set_cursor((1,))
547
dlg._treeview_files.set_cursor(
548
Gtk.TreePath(path=1), None, False)
531
549
self.assertEqual('Commit message for a',
532
550
dlg._file_message_expander.get_label())
533
551
self.assertTrue(dlg._file_message_expander.get_expanded())
540
558
# We should have updated the ListStore with the new file commit info
541
559
self.assertEqual('Some text\nfor a\n', get_saved_text(1))
543
dlg._treeview_files.set_cursor((2,))
561
dlg._treeview_files.set_cursor(
562
Gtk.TreePath(path=2), None, False)
544
563
self.assertEqual('Commit message for b/',
545
564
dlg._file_message_expander.get_label())
546
565
self.assertTrue(dlg._file_message_expander.get_expanded())
551
570
dlg._set_file_commit_message('More text\nfor b\n')
552
571
# Now switch back to 'a'. The message should be saved, and the buffer
553
572
# should be updated with the other text
554
dlg._treeview_files.set_cursor((1,))
573
dlg._treeview_files.set_cursor(
574
Gtk.TreePath(path=1), None, False)
555
575
self.assertEqual('More text\nfor b\n', get_saved_text(2))
556
576
self.assertEqual('Commit message for a',
557
577
dlg._file_message_expander.get_label())
566
586
tree.add(['a', 'b'], ['a-id', 'b-id'])
568
588
dlg = commit.CommitDialog(tree)
569
self.assertEqual([(None, None, True),
589
self.assertEqual([("", "", True),
570
590
('a-id', 'a', True),
571
591
('b-id', 'b', True),
572
592
], [(r[0], r[1], r[2]) for r in dlg._files_store])
577
597
# do with. So instead, we just call toggle directly, and assume
578
598
# that toggle is hooked in correctly
579
599
# column = dlg._treeview_files.get_column(0)
580
# renderer = column.get_cell_renderers()[0]
600
# renderer = column.get_cells()[0]
582
602
# Toggle a single entry should set just that entry to False
583
603
dlg._toggle_commit(None, 1, dlg._files_store)
584
self.assertEqual([(None, None, True),
604
self.assertEqual([("", "", True),
585
605
('a-id', 'a', False),
586
606
('b-id', 'b', True),
587
607
], [(r[0], r[1], r[2]) for r in dlg._files_store])
589
609
# Toggling the main entry should set all entries
590
610
dlg._toggle_commit(None, 0, dlg._files_store)
591
self.assertEqual([(None, None, False),
611
self.assertEqual([("", "", False),
592
612
('a-id', 'a', False),
593
613
('b-id', 'b', False),
594
614
], [(r[0], r[1], r[2]) for r in dlg._files_store])
596
616
dlg._toggle_commit(None, 2, dlg._files_store)
597
self.assertEqual([(None, None, False),
617
self.assertEqual([("", "", False),
598
618
('a-id', 'a', False),
599
619
('b-id', 'b', True),
600
620
], [(r[0], r[1], r[2]) for r in dlg._files_store])
602
622
dlg._toggle_commit(None, 0, dlg._files_store)
603
self.assertEqual([(None, None, True),
623
self.assertEqual([("", "", True),
604
624
('a-id', 'a', True),
605
625
('b-id', 'b', True),
606
626
], [(r[0], r[1], r[2]) for r in dlg._files_store])
630
650
dlg._commit_selected_radio.set_active(True)
631
651
self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
633
dlg._treeview_files.set_cursor((1,))
653
dlg._treeview_files.set_cursor(
654
Gtk.TreePath(path=1), None, False)
634
655
dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
635
dlg._treeview_files.set_cursor((2,))
656
dlg._treeview_files.set_cursor(
657
Gtk.TreePath(path=2), None, False)
636
658
dlg._set_file_commit_message('message\nfor b_dir\n')
638
660
self.assertEqual((['a_file', 'b_dir'],
658
680
dlg._commit_selected_radio.set_active(True)
659
681
self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
661
dlg._treeview_files.set_cursor((1,))
683
dlg._treeview_files.set_cursor(
684
Gtk.TreePath(path=1), None, False)
662
685
dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
663
dlg._treeview_files.set_cursor((2,))
686
dlg._treeview_files.set_cursor(
687
Gtk.TreePath(path=2), None, False)
664
688
dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
666
690
self.assertEqual((['a_file', 'b_dir'],
974
998
dlg = commit.CommitDialog(tree)
975
999
dlg._commit_selected_radio.set_active(True) # enable partial
976
dlg._treeview_files.set_cursor((1,))
1000
dlg._treeview_files.set_cursor(
1001
Gtk.TreePath(path=1), None, False)
977
1002
dlg._set_file_commit_message('Message for A\n')
978
dlg._treeview_files.set_cursor((2,))
1003
dlg._treeview_files.set_cursor(
1004
Gtk.TreePath(path=2), None, False)
979
1005
dlg._set_file_commit_message('Message for B\n')
980
1006
dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
981
1007
dlg._set_global_commit_message('Commit just "a"')
1008
1034
tree.merge_from_branch(tree2.branch)
1010
1036
dlg = commit.CommitDialog(tree)
1011
dlg._treeview_files.set_cursor((1,)) # 'a'
1037
dlg._treeview_files.set_cursor(
1038
Gtk.TreePath(path=1), None, False) # 'a'
1012
1039
dlg._set_file_commit_message('Message for A\n')
1013
1040
# No message for 'B'
1014
1041
dlg._set_global_commit_message('Merging from "tree2"\n')
1031
1058
bencode.bdecode(file_info.encode('UTF-8')))
1033
1060
def test_commit_unicode_messages(self):
1034
self.requireFeature(tests.UnicodeFilenameFeature)
1061
self.requireFeature(UnicodeFilenameFeature)
1036
1063
tree = self.make_branch_and_tree('tree')
1037
1064
tree.branch.get_config().set_user_option('per_file_commits', 'true')
1039
1066
tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
1041
1068
dlg = commit.CommitDialog(tree)
1042
dlg._treeview_files.set_cursor((1,)) # 'a'
1069
dlg._treeview_files.set_cursor(
1070
Gtk.TreePath(path=1), None, False) # 'a'
1043
1071
dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
1044
dlg._treeview_files.set_cursor((2,)) # omega
1072
dlg._treeview_files.set_cursor(
1073
Gtk.TreePath(path=2), None, False) # omega
1045
1074
dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1046
1075
dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1103
1132
super(TestSavedCommitMessages, self).setUp()
1104
1133
# Install our hook
1105
1134
branch.Branch.hooks.install_named_hook(
1106
'post_uncommit', commit.save_commit_messages, None)
1135
'post_uncommit', commitmsgs.save_commit_messages, None)
1108
1137
def _get_file_info_dict(self, rank):
1109
1138
file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),