comparison mercurial/graphmod.py @ 12951:101366ad816c stable

graphmod: safer code when a changeset has two identical parents While this situation should never under normal use, some real life repos sometimes contain such changesets (older hg versions, broken rebases, etc...) hgweb was displaying an "Internal error" in this case, and graphlog displayed a redundant branch all the way to null: it does not cost us much to just ignore this extra parent when constructing the DAG.
author Nicolas Dumazet <nicdumz.commits@gmail.com>
date Mon, 08 Nov 2010 22:45:56 +0900
parents 94145b531cf9
children 9966c95b8c4f
comparison
equal deleted inserted replaced
12950:2405b4a5964a 12951:101366ad816c
30 integers which identify a node in the context of the graph returned. 30 integers which identify a node in the context of the graph returned.
31 """ 31 """
32 cur = start 32 cur = start
33 while cur >= stop: 33 while cur >= stop:
34 ctx = repo[cur] 34 ctx = repo[cur]
35 parents = [p.rev() for p in ctx.parents() if p.rev() != nullrev] 35 parents = set([p.rev() for p in ctx.parents() if p.rev() != nullrev])
36 yield (cur, CHANGESET, ctx, sorted(parents)) 36 yield (cur, CHANGESET, ctx, sorted(parents))
37 cur -= 1 37 cur -= 1
38 38
39 def filerevs(repo, path, start, stop, limit=None): 39 def filerevs(repo, path, start, stop, limit=None):
40 """file cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples 40 """file cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
45 filerev = len(repo.file(path)) - 1 45 filerev = len(repo.file(path)) - 1
46 rev = stop + 1 46 rev = stop + 1
47 count = 0 47 count = 0
48 while filerev >= 0 and rev > stop: 48 while filerev >= 0 and rev > stop:
49 fctx = repo.filectx(path, fileid=filerev) 49 fctx = repo.filectx(path, fileid=filerev)
50 parents = [f.linkrev() for f in fctx.parents() if f.path() == path] 50 parents = set([f.linkrev() for f in fctx.parents() if f.path() == path])
51 rev = fctx.rev() 51 rev = fctx.rev()
52 if rev <= start: 52 if rev <= start:
53 yield (rev, CHANGESET, fctx.changectx(), sorted(parents)) 53 yield (rev, CHANGESET, fctx.changectx(), sorted(parents))
54 count += 1 54 count += 1
55 if count == limit: 55 if count == limit:
63 that are in nodes, too. 63 that are in nodes, too.
64 """ 64 """
65 include = set(nodes) 65 include = set(nodes)
66 for node in nodes: 66 for node in nodes:
67 ctx = repo[node] 67 ctx = repo[node]
68 parents = [p.rev() for p in ctx.parents() if p.node() in include] 68 parents = set([p.rev() for p in ctx.parents() if p.node() in include])
69 yield (ctx.rev(), CHANGESET, ctx, sorted(parents)) 69 yield (ctx.rev(), CHANGESET, ctx, sorted(parents))
70 70
71 def colored(dag): 71 def colored(dag):
72 """annotates a DAG with colored edge information 72 """annotates a DAG with colored edge information
73 73