~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge3.py

  • Committer: Michael Ellerman
  • Date: 2006-02-28 14:45:51 UTC
  • mto: (1558.1.18 Aaron's integration)
  • mto: This revision was merged to the branch mainline in revision 1586.
  • Revision ID: michael@ellerman.id.au-20060228144551-3d9941ecde4a0b0a
Update contrib/pwk for -p1 diffs from bzr

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2004, 2005 Canonical Ltd
2
 
#
 
1
# Copyright (C) 2004, 2005 by Canonical Ltd
 
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
#
 
7
 
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
18
from bzrlib.tests import TestCaseInTempDir, TestCase
19
19
from bzrlib.merge3 import Merge3
20
 
from bzrlib.errors import CantReprocessAndShowBase, BinaryFile
 
20
from bzrlib.errors import CantReprocessAndShowBase
21
21
 
22
22
def split_lines(t):
23
23
    from cStringIO import StringIO
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."""
302
302
        self.log(''.join(ml))
303
303
        self.assertEquals(ml, MERGED_RESULT)
304
304
 
305
 
    def test_minimal_conflicts_common(self):
 
305
    def test_minimal_conflicts(self):
306
306
        """Reprocessing"""
307
307
        base_text = ("a\n" * 20).splitlines(True)
308
308
        this_text = ("a\n"*10+"b\n" * 10).splitlines(True)
310
310
        m3 = Merge3(base_text, other_text, this_text)
311
311
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True)
312
312
        merged_text = "".join(list(m_lines))
313
 
        optimal_text = ("a\n" * 10 + "<<<<<<< OTHER\nc\n"
314
 
            + 8* "b\n" + "c\n=======\n"
315
 
            + 10*"b\n" + ">>>>>>> THIS\n")
316
 
        self.assertEqualDiff(optimal_text, merged_text)
317
 
 
318
 
    def test_minimal_conflicts_unique(self):
319
 
        def add_newline(s):
320
 
            """Add a newline to each entry in the string"""
321
 
            return [(x+'\n') for x in s]
322
 
 
323
 
        base_text = add_newline("abcdefghijklm")
324
 
        this_text = add_newline("abcdefghijklmNOPQRSTUVWXYZ")
325
 
        other_text = add_newline("abcdefghijklm1OPQRSTUVWXY2")
326
 
        m3 = Merge3(base_text, other_text, this_text)
327
 
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True)
328
 
        merged_text = "".join(list(m_lines))
329
 
        optimal_text = ''.join(add_newline("abcdefghijklm")
330
 
            + ["<<<<<<< OTHER\n1\n=======\nN\n>>>>>>> THIS\n"]
331
 
            + add_newline('OPQRSTUVWXY')
332
 
            + ["<<<<<<< OTHER\n2\n=======\nZ\n>>>>>>> THIS\n"]
333
 
            )
334
 
        self.assertEqualDiff(optimal_text, merged_text)
335
 
 
336
 
    def test_minimal_conflicts_nonunique(self):
337
 
        def add_newline(s):
338
 
            """Add a newline to each entry in the string"""
339
 
            return [(x+'\n') for x in s]
340
 
 
341
 
        base_text = add_newline("abacddefgghij")
342
 
        this_text = add_newline("abacddefgghijkalmontfprz")
343
 
        other_text = add_newline("abacddefgghijknlmontfprd")
344
 
        m3 = Merge3(base_text, other_text, this_text)
345
 
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True)
346
 
        merged_text = "".join(list(m_lines))
347
 
        optimal_text = ''.join(add_newline("abacddefgghijk")
348
 
            + ["<<<<<<< OTHER\nn\n=======\na\n>>>>>>> THIS\n"]
349
 
            + add_newline('lmontfpr')
350
 
            + ["<<<<<<< OTHER\nd\n=======\nz\n>>>>>>> THIS\n"]
351
 
            )
352
 
        self.assertEqualDiff(optimal_text, merged_text)
 
313
        optimal_text = "a\n" * 10 + "<<<<<<< OTHER\nc\n=======\n>>>>>>> THIS"\
 
314
            + "\n" + 8* "b\n" + "<<<<<<< OTHER\nc\n=======\nb\nb\n>>>>>>>"\
 
315
            + " THIS\n"
 
316
        self.assertEqualDiff(merged_text, optimal_text)
353
317
 
354
318
    def test_reprocess_and_base(self):
355
319
        """Reprocessing and showing base breaks correctly"""
357
321
        this_text = ("a\n"*10+"b\n" * 10).splitlines(True)
358
322
        other_text = ("a\n"*10+"c\n"+"b\n" * 8 + "c\n").splitlines(True)
359
323
        m3 = Merge3(base_text, other_text, this_text)
360
 
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True,
 
324
        m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True, 
361
325
                                 base_marker='|||||||')
362
326
        self.assertRaises(CantReprocessAndShowBase, list, m_lines)
363
 
 
364
 
    def test_binary(self):
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))