~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge3.py

  • Committer: John Arbash Meinel
  • Date: 2009-07-06 18:59:24 UTC
  • mto: This revision was merged to the branch mainline in revision 4522.
  • Revision ID: john@arbash-meinel.com-20090706185924-qlhn1j607117lgdj
Start implementing an Annotator.add_special_text functionality.

The Python implementation supports it. Basically, it is meant to allow things
like WT and PreviewTree to insert the 'current' content into the graph, so that
we can get local modifications into the annotations.
There is also some work here to get support for texts that are already cached
in the annotator. So that we avoid extracting them, and can shortcut the
history.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005 by Canonical Ltd
 
1
# Copyright (C) 2004, 2005 Canonical Ltd
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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
 
18
18
from bzrlib.tests import TestCaseInTempDir, TestCase
28
28
# common base
29
29
TZU = split_lines("""     The Nameless is the origin of Heaven and Earth;
30
30
     The named is the mother of all things.
31
 
     
 
31
 
32
32
     Therefore let there always be non-being,
33
33
       so we may see their subtlety,
34
34
     And let there always be being,
59
59
     The name that can be named is not the eternal name.
60
60
     The Nameless is the origin of Heaven and Earth;
61
61
     The named is the mother of all things.
62
 
     
 
62
 
63
63
     Therefore let there always be non-being,
64
64
       so we may see their subtlety,
65
65
     And let there always be being,
67
67
     The two are the same,
68
68
     But after they are produced,
69
69
       they have different names.
70
 
     
 
70
 
71
71
       -- The Way of Lao-Tzu, tr. Wing-tsit Chan
72
72
 
73
73
""")
85
85
       they have different names.
86
86
<<<<<<< LAO
87
87
=======
88
 
     
 
88
 
89
89
       -- The Way of Lao-Tzu, tr. Wing-tsit Chan
90
90
 
91
91
>>>>>>> TAO
132
132
        self.assertEquals(list(m3.merge_groups()),
133
133
                          [('a', ['aaa', 'bbb']),
134
134
                           ('unchanged', ['zz'])])
135
 
        
 
135
 
136
136
    def test_null_insert(self):
137
137
        m3 = Merge3([],
138
138
                    ['aaa', 'bbb'],
223
223
                            mid_marker='--',
224
224
                            end_marker='>>')
225
225
        self.assertEquals(''.join(ml), 'aaa\n222\nbbb\n')
226
 
        
 
226
 
227
227
 
228
228
    def test_insert_clash(self):
229
229
        """Both try to insert lines in the same place."""
357
357
        this_text = ("a\n"*10+"b\n" * 10).splitlines(True)
358
358
        other_text = ("a\n"*10+"c\n"+"b\n" * 8 + "c\n").splitlines(True)
359
359
        m3 = Merge3(base_text, other_text, this_text)
360
 
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True, 
 
360
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True,
361
361
                                 base_marker='|||||||')
362
362
        self.assertRaises(CantReprocessAndShowBase, list, m_lines)
363
363
 
364
364
    def test_binary(self):
365
365
        self.assertRaises(BinaryFile, Merge3, ['\x00'], ['a'], ['b'])
 
366
 
 
367
    def test_dos_text(self):
 
368
        base_text = 'a\r\n'
 
369
        this_text = 'b\r\n'
 
370
        other_text = 'c\r\n'
 
371
        m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
 
372
                    this_text.splitlines(True))
 
373
        m_lines = m3.merge_lines('OTHER', 'THIS')
 
374
        self.assertEqual('<<<<<<< OTHER\r\nc\r\n=======\r\nb\r\n'
 
375
            '>>>>>>> THIS\r\n'.splitlines(True), list(m_lines))
 
376
 
 
377
    def test_mac_text(self):
 
378
        base_text = 'a\r'
 
379
        this_text = 'b\r'
 
380
        other_text = 'c\r'
 
381
        m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
 
382
                    this_text.splitlines(True))
 
383
        m_lines = m3.merge_lines('OTHER', 'THIS')
 
384
        self.assertEqual('<<<<<<< OTHER\rc\r=======\rb\r'
 
385
            '>>>>>>> THIS\r'.splitlines(True), list(m_lines))
 
386
 
 
387
    def test_merge3_cherrypick(self):
 
388
        base_text = "a\nb\n"
 
389
        this_text = "a\n"
 
390
        other_text = "a\nb\nc\n"
 
391
        # When cherrypicking, lines in base are not part of the conflict
 
392
        m3 = Merge3(base_text.splitlines(True), this_text.splitlines(True),
 
393
                    other_text.splitlines(True), is_cherrypick=True)
 
394
        m_lines = m3.merge_lines()
 
395
        self.assertEqualDiff('a\n<<<<<<<\n=======\nc\n>>>>>>>\n',
 
396
                             ''.join(m_lines))
 
397
 
 
398
        # This is not symmetric
 
399
        m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
 
400
                    this_text.splitlines(True), is_cherrypick=True)
 
401
        m_lines = m3.merge_lines()
 
402
        self.assertEqualDiff('a\n<<<<<<<\nb\nc\n=======\n>>>>>>>\n',
 
403
                             ''.join(m_lines))
 
404
 
 
405
    def test_merge3_cherrypick_w_mixed(self):
 
406
        base_text = 'a\nb\nc\nd\ne\n'
 
407
        this_text = 'a\nb\nq\n'
 
408
        other_text = 'a\nb\nc\nd\nf\ne\ng\n'
 
409
        # When cherrypicking, lines in base are not part of the conflict
 
410
        m3 = Merge3(base_text.splitlines(True), this_text.splitlines(True),
 
411
                    other_text.splitlines(True), is_cherrypick=True)
 
412
        m_lines = m3.merge_lines()
 
413
        self.assertEqualDiff('a\n'
 
414
                             'b\n'
 
415
                             '<<<<<<<\n'
 
416
                             'q\n'
 
417
                             '=======\n'
 
418
                             'f\n'
 
419
                             '>>>>>>>\n'
 
420
                             '<<<<<<<\n'
 
421
                             '=======\n'
 
422
                             'g\n'
 
423
                             '>>>>>>>\n',
 
424
                             ''.join(m_lines))