~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-09-08 06:59:26 UTC
  • mfrom: (4678.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20090908065926-at5dgy2j2spzl8u5
(vila) More test fixes for FreeBSD passing the full test suite

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
2
2
#
3
3
# Authors:
4
4
#   Johan Rydberg <jrydberg@gnu.org>
930
930
    def check_not_reserved_id(version_id):
931
931
        revision.check_not_reserved_id(version_id)
932
932
 
933
 
    def clear_cache(self):
934
 
        """Clear whatever caches this VersionedFile holds.
935
 
 
936
 
        This is generally called after an operation has been performed, when we
937
 
        don't expect to be using this versioned file again soon.
938
 
        """
939
 
 
940
933
    def _check_lines_not_unicode(self, lines):
941
934
        """Check that lines being added to a versioned file are not unicode."""
942
935
        for line in lines:
1426
1419
    def __init__(self, plan, a_marker=TextMerge.A_MARKER,
1427
1420
                 b_marker=TextMerge.B_MARKER):
1428
1421
        TextMerge.__init__(self, a_marker, b_marker)
1429
 
        self.plan = list(plan)
 
1422
        self.plan = plan
1430
1423
 
1431
1424
    def _merge_struct(self):
1432
1425
        lines_a = []
1490
1483
        for struct in outstanding_struct():
1491
1484
            yield struct
1492
1485
 
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
1486
 
1548
1487
class WeaveMerge(PlanWeaveMerge):
1549
1488
    """Weave merge that takes a VersionedFile and two versions as its input."""