Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/graphmod.py @ 8840:d9acbe7b0049
graphmod/graphlog: make dag walks carry data as type, payload
author | Peter Arrenbrecht <peter.arrenbrecht@gmail.com> |
---|---|
date | Fri, 19 Jun 2009 13:22:32 +0200 |
parents | d8e3a98018cb |
children | 94ac080e7af9 |
comparison
equal
deleted
inserted
replaced
8839:bbfa21b6f18a | 8840:d9acbe7b0049 |
---|---|
4 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net> | 4 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net> |
5 # | 5 # |
6 # This software may be used and distributed according to the terms of the | 6 # This software may be used and distributed according to the terms of the |
7 # GNU General Public License version 2, incorporated herein by reference. | 7 # GNU General Public License version 2, incorporated herein by reference. |
8 | 8 |
9 from node import nullrev | 9 """supports walking the history as DAGs suitable for graphical output |
10 | |
11 The most basic format we use is that of:: | |
12 | |
13 (id, type, data, [parentids]) | |
14 | |
15 The node and parent ids are arbitrary integers which identify a node in the | |
16 context of the graph returned. Type is a constant specifying the node type. | |
17 Data depends on type. | |
18 """ | |
19 | |
20 from mercurial.node import nullrev | |
21 | |
22 CHANGESET = 'C' | |
10 | 23 |
11 def revisions(repo, start, stop): | 24 def revisions(repo, start, stop): |
12 """cset DAG generator yielding (rev, node, [parents]) tuples | 25 """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples |
13 | 26 |
14 This generator function walks through the revision history from revision | 27 This generator function walks through the revision history from revision |
15 start to revision stop (which must be less than or equal to start). | 28 start to revision stop (which must be less than or equal to start). It |
29 returns a tuple for each node. The node and parent ids are arbitrary | |
30 integers which identify a node in the context of the graph returned. | |
16 """ | 31 """ |
17 assert start >= stop | 32 assert start >= stop |
18 cur = start | 33 cur = start |
19 while cur >= stop: | 34 while cur >= stop: |
20 ctx = repo[cur] | 35 ctx = repo[cur] |
21 parents = [p.rev() for p in ctx.parents() if p.rev() != nullrev] | 36 parents = [p.rev() for p in ctx.parents() if p.rev() != nullrev] |
22 parents.sort() | 37 yield (cur, CHANGESET, ctx, sorted(parents)) |
23 yield (ctx, parents) | |
24 cur -= 1 | 38 cur -= 1 |
25 | 39 |
26 def filerevs(repo, path, start, stop): | 40 def filerevs(repo, path, start, stop): |
27 """file cset DAG generator yielding (rev, node, [parents]) tuples | 41 """file cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples |
28 | 42 |
29 This generator function walks through the revision history of a single | 43 This generator function walks through the revision history of a single |
30 file from revision start to revision stop (which must be less than or | 44 file from revision start to revision stop (which must be less than or |
31 equal to start). | 45 equal to start). |
32 """ | 46 """ |
33 assert start >= stop | 47 assert start >= stop |
34 filerev = len(repo.file(path)) - 1 | 48 filerev = len(repo.file(path)) - 1 |
35 while filerev >= 0: | 49 while filerev >= 0: |
36 fctx = repo.filectx(path, fileid=filerev) | 50 fctx = repo.filectx(path, fileid=filerev) |
37 parents = [f.linkrev() for f in fctx.parents() if f.path() == path] | 51 parents = [f.linkrev() for f in fctx.parents() if f.path() == path] |
38 parents.sort() | 52 rev = fctx.rev() |
39 if fctx.rev() <= start: | 53 if rev <= start: |
40 yield (fctx, parents) | 54 yield (rev, CHANGESET, fctx, sorted(parents)) |
41 if fctx.rev() <= stop: | 55 if rev <= stop: |
42 break | 56 break |
43 filerev -= 1 | 57 filerev -= 1 |
44 | 58 |
45 def nodes(repo, nodes): | 59 def nodes(repo, nodes): |
60 """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples | |
61 | |
62 This generator function walks the given nodes. It only returns parents | |
63 that are in nodes, too. | |
64 """ | |
46 include = set(nodes) | 65 include = set(nodes) |
47 for node in nodes: | 66 for node in nodes: |
48 ctx = repo[node] | 67 ctx = repo[node] |
49 parents = [p.rev() for p in ctx.parents() if p.node() in include] | 68 parents = [p.rev() for p in ctx.parents() if p.node() in include] |
50 parents.sort() | 69 yield (ctx.rev(), CHANGESET, ctx, sorted(parents)) |
51 yield (ctx, parents) | |
52 | 70 |
53 def graph(repo, start_rev, stop_rev): | 71 def graph(repo, start_rev, stop_rev): |
54 """incremental revision grapher | 72 """incremental revision grapher |
55 | 73 |
56 This generator function walks through the revision history from | 74 This generator function walks through the revision history from |