~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/versionedfile.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-11-17 03:20:35 UTC
  • mfrom: (4792.4.3 456036)
  • Revision ID: pqm@pqm.ubuntu.com-20091117032035-s3sgtlixj1lrminn
(Gordon Tyler) Fix IndexError during 'bzr ignore /' (#456036)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1426
1426
    def __init__(self, plan, a_marker=TextMerge.A_MARKER,
1427
1427
                 b_marker=TextMerge.B_MARKER):
1428
1428
        TextMerge.__init__(self, a_marker, b_marker)
1429
 
        self.plan = list(plan)
 
1429
        self.plan = plan
1430
1430
 
1431
1431
    def _merge_struct(self):
1432
1432
        lines_a = []
1490
1490
        for struct in outstanding_struct():
1491
1491
            yield struct
1492
1492
 
1493
 
    def base_from_plan(self):
1494
 
        """Construct a BASE file from the plan text."""
1495
 
        base_lines = []
1496
 
        for state, line in self.plan:
1497
 
            if state in ('killed-a', 'killed-b', 'killed-both', 'unchanged'):
1498
 
                # If unchanged, then this line is straight from base. If a or b
1499
 
                # or both killed the line, then it *used* to be in base.
1500
 
                base_lines.append(line)
1501
 
            else:
1502
 
                if state not in ('killed-base', 'irrelevant',
1503
 
                                 'ghost-a', 'ghost-b',
1504
 
                                 'new-a', 'new-b',
1505
 
                                 'conflicted-a', 'conflicted-b'):
1506
 
                    # killed-base, irrelevant means it doesn't apply
1507
 
                    # ghost-a/ghost-b are harder to say for sure, but they
1508
 
                    # aren't in the 'inc_c' which means they aren't in the
1509
 
                    # shared base of a & b. So we don't include them.  And
1510
 
                    # obviously if the line is newly inserted, it isn't in base
1511
 
 
1512
 
                    # If 'conflicted-a' or b, then it is new vs one base, but
1513
 
                    # old versus another base. However, if we make it present
1514
 
                    # in the base, it will be deleted from the target, and it
1515
 
                    # seems better to get a line doubled in the merge result,
1516
 
                    # rather than have it deleted entirely.
1517
 
                    # Example, each node is the 'text' at that point:
1518
 
                    #           MN
1519
 
                    #          /   \
1520
 
                    #        MaN   MbN
1521
 
                    #         |  X  |
1522
 
                    #        MabN MbaN
1523
 
                    #          \   /
1524
 
                    #           ???
1525
 
                    # There was a criss-cross conflict merge. Both sides
1526
 
                    # include the other, but put themselves first.
1527
 
                    # Weave marks this as a 'clean' merge, picking OTHER over
1528
 
                    # THIS. (Though the details depend on order inserted into
1529
 
                    # weave, etc.)
1530
 
                    # LCA generates a plan:
1531
 
                    # [('unchanged', M),
1532
 
                    #  ('conflicted-b', b),
1533
 
                    #  ('unchanged', a),
1534
 
                    #  ('conflicted-a', b),
1535
 
                    #  ('unchanged', N)]
1536
 
                    # If you mark 'conflicted-*' as part of BASE, then a 3-way
1537
 
                    # merge tool will cleanly generate "MaN" (as BASE vs THIS
1538
 
                    # removes one 'b', and BASE vs OTHER removes the other)
1539
 
                    # If you include neither, 3-way creates a clean "MbabN" as
1540
 
                    # THIS adds one 'b', and OTHER does too.
1541
 
                    # It seems that having the line 2 times is better than
1542
 
                    # having it omitted. (Easier to manually delete than notice
1543
 
                    # it needs to be added.)
1544
 
                    raise AssertionError('Unknown state: %s' % (state,))
1545
 
        return base_lines
1546
 
 
1547
1493
 
1548
1494
class WeaveMerge(PlanWeaveMerge):
1549
1495
    """Weave merge that takes a VersionedFile and two versions as its input."""