~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revision.py

  • Committer: Robert Collins
  • Date: 2005-09-28 05:37:53 UTC
  • mfrom: (1092.3.4)
  • mto: This revision was merged to the branch mainline in revision 1397.
  • Revision ID: robertc@robertcollins.net-20050928053753-68e6e4c0642eccea
merge from symlink branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
 
18
18
import bzrlib.errors
19
 
from bzrlib.graph import farthest_nodes, node_distances, all_descendants
 
19
from bzrlib.graph import node_distances, select_farthest, all_descendants
 
20
 
 
21
NULL_REVISION="null:"
20
22
 
21
23
class RevisionReference(object):
22
24
    """
109
111
    def __ne__(self, other):
110
112
        return not self.__eq__(other)
111
113
 
112
 
 
 
114
        
113
115
REVISION_ID_RE = None
114
116
 
115
117
def validate_revision_id(rid):
130
132
    revisions_source is an object supporting a get_revision operation that
131
133
    behaves like Branch's.
132
134
    """
133
 
 
 
135
    if candidate_id is None:
 
136
        return True
134
137
    for ancestor_id, distance in iter_ancestors(revision_id, revision_source):
135
138
        if ancestor_id == candidate_id:
136
139
            return True
230
233
    while len(lines) > 0:
231
234
        new_lines = set()
232
235
        for line in lines:
233
 
            try:
234
 
                rev = revision_source.get_revision(line)
235
 
                parents = [p.revision_id for p in rev.parents]
236
 
                if len(parents) == 0:
237
 
                    root = line
238
 
            except bzrlib.errors.NoSuchRevision:
239
 
                if line == revision:
240
 
                    raise
241
 
                parents = None
 
236
            if line == NULL_REVISION:
 
237
                parents = []
 
238
                root = NULL_REVISION
 
239
            else:
 
240
                try:
 
241
                    rev = revision_source.get_revision(line)
 
242
                    parents = [p.revision_id for p in rev.parents]
 
243
                    if len(parents) == 0:
 
244
                        parents = [NULL_REVISION]
 
245
                except bzrlib.errors.NoSuchRevision:
 
246
                    if line == revision:
 
247
                        raise
 
248
                    parents = None
242
249
            if parents is not None:
243
250
                for parent in parents:
244
251
                    if parent not in ancestors:
253
260
    assert root not in ancestors[root]
254
261
    return root, ancestors, descendants
255
262
 
 
263
 
256
264
def combined_graph(revision_a, revision_b, revision_source):
257
265
    """Produce a combined ancestry graph.
258
266
    Return graph root, ancestors map, descendants map, set of common nodes"""
259
267
    root, ancestors, descendants = revision_graph(revision_a, revision_source)
260
268
    root_b, ancestors_b, descendants_b = revision_graph(revision_b, 
261
269
                                                        revision_source)
262
 
    assert root == root_b
 
270
    if root != root_b:
 
271
        raise bzrlib.errors.NoCommonRoot(revision_a, revision_b)
263
272
    common = set()
264
273
    for node, node_anc in ancestors_b.iteritems():
265
274
        if node in ancestors:
269
278
        ancestors[node].update(node_anc)
270
279
    for node, node_dec in descendants_b.iteritems():
271
280
        if node not in descendants:
272
 
            descendants[node] = set()
 
281
            descendants[node] = {}
273
282
        descendants[node].update(node_dec)
274
283
    return root, ancestors, descendants, common
275
284
 
 
285
 
276
286
def common_ancestor(revision_a, revision_b, revision_source):
277
 
    root, ancestors, descendants, common = \
278
 
        combined_graph(revision_a, revision_b, revision_source)
279
 
    nodes = farthest_nodes(descendants, ancestors, root)
280
 
    for node in nodes:
281
 
        if node in common:
282
 
            return node
 
287
    try:
 
288
        root, ancestors, descendants, common = \
 
289
            combined_graph(revision_a, revision_b, revision_source)
 
290
    except bzrlib.errors.NoCommonRoot:
 
291
        raise bzrlib.errors.NoCommonAncestor(revision_a, revision_b)
 
292
        
 
293
    distances = node_distances (descendants, ancestors, root)
 
294
    farthest = select_farthest(distances, common)
 
295
    if farthest is None or farthest == NULL_REVISION:
 
296
        raise bzrlib.errors.NoCommonAncestor(revision_a, revision_b)
 
297
    return farthest
 
298
 
283
299
 
284
300
class MultipleRevisionSources(object):
285
301
    """Proxy that looks in multiple branches for revisions."""