~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

  • Committer: Martin Pool
  • Date: 2008-06-18 07:56:09 UTC
  • mto: This revision was merged to the branch mainline in revision 3510.
  • Revision ID: mbp@sourcefrog.net-20080618075609-zehkroqkqufck2zb
VersionedFiles review cleanups

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2008 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
1243
1243
 
1244
1244
class _PlanMergeBase(object):
1245
1245
 
1246
 
    def __init__(self, a_rev, b_rev, vf, prefix):
 
1246
    def __init__(self, a_rev, b_rev, vf, key_prefix):
1247
1247
        """Contructor.
1248
1248
 
1249
1249
        :param a_rev: Revision-id of one revision to merge
1250
1250
        :param b_rev: Revision-id of the other revision to merge
1251
1251
        :param vf: A VersionedFiles containing both revisions
1252
 
        :param prefix: A prefix for accessing keys in vf.
 
1252
        :param key_prefix: A prefix for accessing keys in vf, typically
 
1253
            (file_id,).
1253
1254
        """
1254
1255
        self.a_rev = a_rev
1255
1256
        self.b_rev = b_rev
1257
1258
        self._last_lines = None
1258
1259
        self._last_lines_revision_id = None
1259
1260
        self._cached_matching_blocks = {}
1260
 
        self._prefix = prefix
 
1261
        self._key_prefix = key_prefix
1261
1262
        lines = self.get_lines([a_rev, b_rev])
1262
1263
        self.lines_a = lines[a_rev]
1263
1264
        self.lines_b = lines[b_rev]
1265
1266
    def get_lines(self, revisions):
1266
1267
        """Get lines for revisions from the backing VersionedFiles.
1267
1268
        
1268
 
        :raises RevisionNotPresent on absent texts.
 
1269
        :raises RevisionNotPresent: on absent texts.
1269
1270
        """
1270
 
        keys = dict((self._prefix + (rev,), rev) for rev in revisions)
 
1271
        keys = [(self._key_prefix + (rev,)) for rev in revisions]
1271
1272
        result = {}
1272
1273
        for record in self.vf.get_record_stream(keys, 'unordered', True):
1273
1274
            if record.storage_kind == 'absent':
1274
1275
                raise errors.RevisionNotPresent(record.key, self.vf)
1275
 
            result[keys[record.key]] = osutils.split_lines(
 
1276
            result[record.key[-1]] = osutils.split_lines(
1276
1277
                record.get_bytes_as('fulltext'))
1277
1278
        return result
1278
1279
 
1391
1392
class _PlanMerge(_PlanMergeBase):
1392
1393
    """Plan an annotate merge using on-the-fly annotation"""
1393
1394
 
1394
 
    def __init__(self, a_rev, b_rev, vf, prefix):
1395
 
        _PlanMergeBase.__init__(self, a_rev, b_rev, vf, prefix)
 
1395
    def __init__(self, a_rev, b_rev, vf, key_prefix):
 
1396
        _PlanMergeBase.__init__(self, a_rev, b_rev, vf, key_prefix)
1396
1397
        graph = Graph(vf)
1397
1398
        # XXX: There is probably a better API to use to examine less history.
1398
1399
        a_ancestry = set(chain(*graph._make_breadth_first_searcher(
1399
 
            [prefix + (a_rev,)])))
 
1400
            [key_prefix + (a_rev,)])))
1400
1401
        b_ancestry = set(chain(*graph._make_breadth_first_searcher(
1401
 
            [prefix + (b_rev,)])))
 
1402
            [key_prefix + (b_rev,)])))
1402
1403
        self.uncommon = set(key[-1] for key in
1403
1404
            a_ancestry.symmetric_difference(b_ancestry))
1404
1405
 
1426
1427
        """
1427
1428
        if version_id not in self.uncommon:
1428
1429
            return set()
1429
 
        key = self._prefix + (version_id,)
 
1430
        key = self._key_prefix + (version_id,)
1430
1431
        parent_map = self.vf.get_parent_map([key])
1431
1432
        parents = tuple(parent[-1] for parent in parent_map[key])
1432
1433
        if len(parents) == 0:
1458
1459
    This is faster, and hopefully produces more useful output.
1459
1460
    """
1460
1461
 
1461
 
    def __init__(self, a_rev, b_rev, vf, prefix, graph):
1462
 
        _PlanMergeBase.__init__(self, a_rev, b_rev, vf, prefix)
1463
 
        lcas = graph.find_lca(prefix + (a_rev,), prefix + (b_rev,))
 
1462
    def __init__(self, a_rev, b_rev, vf, key_prefix, graph):
 
1463
        _PlanMergeBase.__init__(self, a_rev, b_rev, vf, key_prefix)
 
1464
        lcas = graph.find_lca(key_prefix + (a_rev,), key_prefix + (b_rev,))
1464
1465
        self.lcas = set()
1465
1466
        for lca in lcas:
1466
1467
            if lca == NULL_REVISION: