Mercurial > public > mercurial-scm > hg-stable
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 |