~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_merge.py

  • Committer: John Arbash Meinel
  • Date: 2008-08-01 14:26:55 UTC
  • mto: (3697.7.4 1.7)
  • mto: This revision was merged to the branch mainline in revision 3748.
  • Revision ID: john@arbash-meinel.com-20080801142655-fi5f6rtys5tlu6ez
Add a test for proper behavior when *everything* is a WT.

This only really happens in the test suite, you'll never get a LCA Tree as a WT
in standard behavior (I don't know if you could get a BASE tree as a wT).
Also, clean up some trailing whitespace.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1189
1189
        #     |\ /| |
1190
1190
        #     | X | |\
1191
1191
        #     |/ \| | :
1192
 
        #   : D   E |  
1193
 
        #    \|   |/ 
 
1192
        #   : D   E |
 
1193
        #    \|   |/
1194
1194
        #     G   H
1195
1195
        builder = self.setup_criss_cross_graph()
1196
1196
        builder.build_snapshot('F-id', ['A-id'], [])
1247
1247
            interesting_files=interesting_files,
1248
1248
            interesting_ids=interesting_ids)
1249
1249
        return merger.make_merger()
1250
 
        
 
1250
 
1251
1251
    def test_simple(self):
1252
1252
        builder = self.get_builder()
1253
1253
        builder.build_snapshot('A-id', None,
1281
1281
        # LCA's all have the same last-modified revision for the file, as do
1282
1282
        # the tips, but the base has something different
1283
1283
        #       A    base, doesn't have the file
1284
 
        #       |\ 
 
1284
        #       |\
1285
1285
        #       B C  B introduces 'foo', C introduces 'bar'
1286
1286
        #       |X|
1287
1287
        #       D E  D and E now both have 'foo' and 'bar'
1288
1288
        #       |X|
1289
1289
        #       F G  the files are now in F, G, D and E, but not in A
1290
1290
        #            G modifies 'bar'
1291
 
            
 
1291
 
1292
1292
        builder = self.get_builder()
1293
1293
        builder.build_snapshot('A-id', None,
1294
1294
            [('add', (u'', 'a-root-id', 'directory', None))])
1385
1385
 
1386
1386
    def test_not_in_other_or_lca(self):
1387
1387
        #       A    base, introduces 'foo'
1388
 
        #       |\ 
 
1388
        #       |\
1389
1389
        #       B C  B nothing, C deletes foo
1390
1390
        #       |X|
1391
1391
        #       D E  D restores foo (same as B), E leaves it deleted
1452
1452
        # One LCA supersede's the other LCA's last modified value, but the
1453
1453
        # value is not the same as BASE.
1454
1454
        #       A    base, introduces 'foo', last mod A
1455
 
        #       |\ 
 
1455
        #       |\
1456
1456
        #       B C  B modifies 'foo' (mod B), C does nothing (mod A)
1457
1457
        #       |X|
1458
1458
        #       D E  D does nothing (mod B), E updates 'foo' (mod E)
1569
1569
    def test_both_sides_revert(self):
1570
1570
        # Both sides of a criss-cross revert the text to the lca
1571
1571
        #       A    base, introduces 'foo'
1572
 
        #       |\ 
 
1572
        #       |\
1573
1573
        #       B C  B modifies 'foo', C modifies 'foo'
1574
1574
        #       |X|
1575
1575
        #       D E  D reverts to B, E reverts to C
1597
1597
    def test_different_lca_resolve_one_side_updates_content(self):
1598
1598
        # Both sides converge, but then one side updates the text.
1599
1599
        #       A    base, introduces 'foo'
1600
 
        #       |\ 
 
1600
        #       |\
1601
1601
        #       B C  B modifies 'foo', C modifies 'foo'
1602
1602
        #       |X|
1603
1603
        #       D E  D reverts to B, E reverts to C
1630
1630
    def test_same_lca_resolution_one_side_updates_content(self):
1631
1631
        # Both sides converge, but then one side updates the text.
1632
1632
        #       A    base, introduces 'foo'
1633
 
        #       |\ 
 
1633
        #       |\
1634
1634
        #       B C  B modifies 'foo', C modifies 'foo'
1635
1635
        #       |X|
1636
1636
        #       D E  D and E use C's value
1930
1930
    def test_executable_changes(self):
1931
1931
        #   A       Path at 'foo'
1932
1932
        #  / \
1933
 
        # B   C 
 
1933
        # B   C
1934
1934
        # |\ /|
1935
1935
        # | X |
1936
1936
        # |/ \|
1967
1967
 
1968
1968
    def test_create_symlink(self):
1969
1969
        self.requireFeature(tests.SymlinkFeature)
1970
 
        #   A       
 
1970
        #   A
1971
1971
        #  / \
1972
 
        # B   C 
 
1972
        # B   C
1973
1973
        # |\ /|
1974
1974
        # | X |
1975
1975
        # |/ \|
2004
2004
    def test_both_sides_revert(self):
2005
2005
        # Both sides of a criss-cross revert the text to the lca
2006
2006
        #       A    base, introduces 'foo'
2007
 
        #       |\ 
 
2007
        #       |\
2008
2008
        #       B C  B modifies 'foo', C modifies 'foo'
2009
2009
        #       |X|
2010
2010
        #       D E  D reverts to B, E reverts to C
2249
2249
        self.assertEqual(0, conflicts)
2250
2250
        self.assertEqual('F content\n', wt.get_file_text('foo-id'))
2251
2251
 
 
2252
    def test_all_wt(self):
 
2253
        """Check behavior if all trees are Working Trees."""
 
2254
        # The big issue is that entry.revision is None for WorkingTrees. (as is
 
2255
        # entry.text_sha1, etc. So we need to make sure we handle that case
 
2256
        # correctly.
 
2257
        #   A   Content of 'foo', path of 'a'
 
2258
        #   |\
 
2259
        #   B C B modifies content, C renames 'a' => 'b'
 
2260
        #   |X|
 
2261
        #   D E E updates content, renames 'b' => 'c'
 
2262
        builder = self.get_builder()
 
2263
        builder.build_snapshot('A-id', None,
 
2264
            [('add', (u'', 'a-root-id', 'directory', None)),
 
2265
             ('add', (u'a', 'a-id', 'file', 'base content\n')),
 
2266
             ('add', (u'foo', 'foo-id', 'file', 'base content\n'))])
 
2267
        builder.build_snapshot('B-id', ['A-id'],
 
2268
            [('modify', ('foo-id', 'B content\n'))])
 
2269
        builder.build_snapshot('C-id', ['A-id'],
 
2270
            [('rename', ('a', 'b'))])
 
2271
        builder.build_snapshot('E-id', ['C-id', 'B-id'],
 
2272
            [('rename', ('b', 'c')),
 
2273
             ('modify', ('foo-id', 'E content\n'))])
 
2274
        builder.build_snapshot('D-id', ['B-id', 'C-id'],
 
2275
            [('rename', ('a', 'b'))]) # merged change
 
2276
        wt_this = self.get_wt_from_builder(builder)
 
2277
        wt_base = wt_this.bzrdir.sprout('base', 'A-id').open_workingtree()
 
2278
        wt_base.lock_read()
 
2279
        self.addCleanup(wt_base.unlock)
 
2280
        wt_lca1 = wt_this.bzrdir.sprout('b-tree', 'B-id').open_workingtree()
 
2281
        wt_lca1.lock_read()
 
2282
        self.addCleanup(wt_lca1.unlock)
 
2283
        wt_lca2 = wt_this.bzrdir.sprout('c-tree', 'C-id').open_workingtree()
 
2284
        wt_lca2.lock_read()
 
2285
        self.addCleanup(wt_lca2.unlock)
 
2286
        wt_other = wt_this.bzrdir.sprout('other', 'E-id').open_workingtree()
 
2287
        wt_other.lock_read()
 
2288
        self.addCleanup(wt_other.unlock)
 
2289
        merge_obj = _mod_merge.Merge3Merger(wt_this, wt_this, wt_base,
 
2290
            wt_other, lca_trees=[wt_lca1, wt_lca2], do_merge=False)
 
2291
        entries = list(merge_obj._entries_lca())
 
2292
        root_id = 'a-root-id'
 
2293
        self.assertEqual([('a-id', False,
 
2294
                           ((root_id, [root_id, root_id]), root_id, root_id),
 
2295
                           ((u'a', [u'a', u'b']), u'c', u'b'),
 
2296
                           ((False, [False, False]), False, False)),
 
2297
                          ('foo-id', True,
 
2298
                           ((root_id, [root_id, root_id]), root_id, root_id),
 
2299
                           ((u'foo', [u'foo', u'foo']), u'foo', u'foo'),
 
2300
                           ((False, [False, False]), False, False)),
 
2301
                         ], entries)
 
2302
 
2252
2303
 
2253
2304
class TestLCAMultiWay(tests.TestCase):
2254
2305