Mercurial > hg
annotate tests/drawdag.py @ 31975:76169296e52f
obsolescence: add test for the "branch replacement" logic during push, case A2
Mercurial checks for the introduction of new heads on push. Evolution comes
into play to detect if existing branches on the server are being replaced by
some of the new one we push.
The current code for this logic is very basic (eg: issue4354) and was poorly
tested. We have a better implementation coming in the evolve extension fixing
these issues and with more serious tests coverage. In the process of upstreaming
this improved logic, we start with adding the test case that are already passing
with the current implementation. Once they are all in, we'll upstream the better
implementation and the extra test case.
See inline documentation for details about the test case added in this
changeset.
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Thu, 13 Apr 2017 16:23:01 +0200 |
parents | d761ef24d6e1 |
children | bd872f64a8ba |
rev | line source |
---|---|
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
1 # drawdag.py - convert ASCII revision DAG to actual changesets |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
2 # |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
3 # Copyright 2016 Facebook, Inc. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
4 # |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
7 """ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
8 create changesets from an ASCII graph for testing purpose. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
9 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
10 For example, given the following input:: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
11 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
12 c d |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
13 |/ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
14 b |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
15 | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
16 a |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
17 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
18 4 changesets and 4 local tags will be created. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
19 `hg log -G -T "{rev} {desc} (tag: {tags})"` will output:: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
20 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
21 o 3 d (tag: d tip) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
22 | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
23 | o 2 c (tag: c) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
24 |/ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
25 o 1 b (tag: b) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
26 | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
27 o 0 a (tag: a) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
28 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
29 For root nodes (nodes without parents) in the graph, they can be revsets |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
30 pointing to existing nodes. The ASCII graph could also have disconnected |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
31 components with same names referring to the same changeset. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
32 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
33 Therefore, given the repo having the 4 changesets (and tags) above, with the |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
34 following ASCII graph as input:: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
35 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
36 foo bar bar foo |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
37 | / | | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
38 ancestor(c,d) a baz |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
39 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
40 The result (`hg log -G -T "{desc}"`) will look like:: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
41 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
42 o foo |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
43 |\ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
44 +---o bar |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
45 | | | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
46 | o | baz |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
47 | / |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
48 +---o d |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
49 | | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
50 +---o c |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
51 | | |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
52 o | b |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
53 |/ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
54 o a |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
55 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
56 Note that if you take the above `hg log` output directly as input. It will work |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
57 as expected - the result would be an isomorphic graph:: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
58 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
59 o foo |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
60 |\ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
61 | | o d |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
62 | |/ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
63 | | o c |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
64 | |/ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
65 | | o bar |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
66 | |/| |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
67 | o | b |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
68 | |/ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
69 o / baz |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
70 / |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
71 o a |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
72 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
73 This is because 'o' is specially handled in the input: instead of using 'o' as |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
74 the node name, the word to the right will be used. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
75 """ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
76 from __future__ import absolute_import, print_function |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
77 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
78 import collections |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
79 import itertools |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
80 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
81 from mercurial.i18n import _ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
82 from mercurial import ( |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
83 cmdutil, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
84 context, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
85 error, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
86 node, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
87 scmutil, |
31671
d761ef24d6e1
drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30449
diff
changeset
|
88 tags as tagsmod, |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
89 ) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
90 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
91 cmdtable = {} |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
92 command = cmdutil.command(cmdtable) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
93 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
94 _pipechars = '\\/+-|' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
95 _nonpipechars = ''.join(chr(i) for i in xrange(33, 127) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
96 if chr(i) not in _pipechars) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
97 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
98 def _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
99 """char -> bool. return True if ch looks like part of a name, False |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
100 otherwise""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
101 return ch in _nonpipechars |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
102 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
103 def _parseasciigraph(text): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
104 """str -> {str : [str]}. convert the ASCII graph to edges""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
105 lines = text.splitlines() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
106 edges = collections.defaultdict(list) # {node: []} |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
107 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
108 def get(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
109 """(int, int) -> char. give a coordinate, return the char. return a |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
110 space for anything out of range""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
111 if x < 0 or y < 0: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
112 return ' ' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
113 try: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
114 return lines[y][x] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
115 except IndexError: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
116 return ' ' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
117 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
118 def getname(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
119 """(int, int) -> str. like get(y, x) but concatenate left and right |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
120 parts. if name is an 'o', try to replace it to the right""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
121 result = '' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
122 for i in itertools.count(0): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
123 ch = get(y, x - i) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
124 if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
125 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
126 result = ch + result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
127 for i in itertools.count(1): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
128 ch = get(y, x + i) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
129 if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
130 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
131 result += ch |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
132 if result == 'o': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
133 # special handling, find the name to the right |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
134 result = '' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
135 for i in itertools.count(2): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
136 ch = get(y, x + i) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
137 if ch == ' ' or ch in _pipechars: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
138 if result or x + i >= len(lines[y]): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
139 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
140 else: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
141 result += ch |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
142 return result or 'o' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
143 return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
144 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
145 def parents(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
146 """(int, int) -> [str]. follow the ASCII edges at given position, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
147 return a list of parents""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
148 visited = set([(y, x)]) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
149 visit = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
150 result = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
151 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
152 def follow(y, x, expected): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
153 """conditionally append (y, x) to visit array, if it's a char |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
154 in excepted. 'o' in expected means an '_isname' test. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
155 if '-' (or '+') is not in excepted, and get(y, x) is '-' (or '+'), |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
156 the next line (y + 1, x) will be checked instead.""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
157 ch = get(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
158 if any(ch == c and c not in expected for c in '-+'): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
159 y += 1 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
160 return follow(y + 1, x, expected) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
161 if ch in expected or ('o' in expected and _isname(ch)): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
162 visit.append((y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
163 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
164 # -o- # starting point: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
165 # /|\ # follow '-' (horizontally), and '/|\' (to the bottom) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
166 follow(y + 1, x, '|') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
167 follow(y + 1, x - 1, '/') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
168 follow(y + 1, x + 1, '\\') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
169 follow(y, x - 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
170 follow(y, x + 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
171 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
172 while visit: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
173 y, x = visit.pop() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
174 if (y, x) in visited: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
175 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
176 visited.add((y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
177 ch = get(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
178 if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
179 result.append(getname(y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
180 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
181 elif ch == '|': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
182 follow(y + 1, x, '/|o') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
183 follow(y + 1, x - 1, '/') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
184 follow(y + 1, x + 1, '\\') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
185 elif ch == '+': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
186 follow(y, x - 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
187 follow(y, x + 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
188 follow(y + 1, x - 1, '/') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
189 follow(y + 1, x + 1, '\\') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
190 follow(y + 1, x, '|') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
191 elif ch == '\\': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
192 follow(y + 1, x + 1, '\\|o') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
193 elif ch == '/': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
194 follow(y + 1, x - 1, '/|o') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
195 elif ch == '-': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
196 follow(y, x - 1, '-+o') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
197 follow(y, x + 1, '-+o') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
198 return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
199 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
200 for y, line in enumerate(lines): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
201 for x, ch in enumerate(line): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
202 if ch == '#': # comment |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
203 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
204 if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
205 edges[getname(y, x)] += parents(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
206 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
207 return dict(edges) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
208 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
209 class simplefilectx(object): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
210 def __init__(self, path, data): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
211 self._data = data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
212 self._path = path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
213 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
214 def data(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
215 return self._data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
216 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
217 def path(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
218 return self._path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
219 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
220 def renamed(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
221 return None |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
222 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
223 def flags(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
224 return '' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
225 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
226 class simplecommitctx(context.committablectx): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
227 def __init__(self, repo, name, parentctxs, added=None): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
228 opts = { |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
229 'changes': scmutil.status([], added or [], [], [], [], [], []), |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
230 'date': '0 0', |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
231 'extra': {'branch': 'default'}, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
232 } |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
233 super(simplecommitctx, self).__init__(self, name, **opts) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
234 self._repo = repo |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
235 self._name = name |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
236 self._parents = parentctxs |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
237 self._parents.sort(key=lambda c: c.node()) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
238 while len(self._parents) < 2: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
239 self._parents.append(repo[node.nullid]) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
240 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
241 def filectx(self, key): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
242 return simplefilectx(key, self._name) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
243 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
244 def commit(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
245 return self._repo.commitctx(self) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
246 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
247 def _walkgraph(edges): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
248 """yield node, parents in topologically order""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
249 visible = set(edges.keys()) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
250 remaining = {} # {str: [str]} |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
251 for k, vs in edges.iteritems(): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
252 for v in vs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
253 if v not in remaining: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
254 remaining[v] = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
255 remaining[k] = vs[:] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
256 while remaining: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
257 leafs = [k for k, v in remaining.items() if not v] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
258 if not leafs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
259 raise error.Abort(_('the graph has cycles')) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
260 for leaf in sorted(leafs): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
261 if leaf in visible: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
262 yield leaf, edges[leaf] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
263 del remaining[leaf] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
264 for k, v in remaining.iteritems(): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
265 if leaf in v: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
266 v.remove(leaf) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
267 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
268 @command('debugdrawdag', []) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
269 def debugdrawdag(ui, repo, **opts): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
270 """read an ASCII graph from stdin and create changesets |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
271 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
272 The ASCII graph is like what :hg:`log -G` outputs, with each `o` replaced |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
273 to the name of the node. The command will create dummy changesets and local |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
274 tags with those names to make the dummy changesets easier to be referred |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
275 to. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
276 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
277 If the name of a node is a single character 'o', It will be replaced by the |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
278 word to the right. This makes it easier to reuse |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
279 :hg:`log -G -T '{desc}'` outputs. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
280 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
281 For root (no parents) nodes, revset can be used to query existing repo. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
282 Note that the revset cannot have confusing characters which can be seen as |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
283 the part of the graph edges, like `|/+-\`. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
284 """ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
285 text = ui.fin.read() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
286 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
287 # parse the graph and make sure len(parents) <= 2 for each node |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
288 edges = _parseasciigraph(text) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
289 for k, v in edges.iteritems(): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
290 if len(v) > 2: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
291 raise error.Abort(_('%s: too many parents: %s') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
292 % (k, ' '.join(v))) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
293 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
294 committed = {None: node.nullid} # {name: node} |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
295 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
296 # for leaf nodes, try to find existing nodes in repo |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
297 for name, parents in edges.iteritems(): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
298 if len(parents) == 0: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
299 try: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
300 committed[name] = scmutil.revsingle(repo, name) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
301 except error.RepoLookupError: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
302 pass |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
303 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
304 # commit in topological order |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
305 for name, parents in _walkgraph(edges): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
306 if name in committed: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
307 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
308 pctxs = [repo[committed[n]] for n in parents] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
309 ctx = simplecommitctx(repo, name, pctxs, [name]) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
310 n = ctx.commit() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
311 committed[name] = n |
31671
d761ef24d6e1
drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30449
diff
changeset
|
312 tagsmod.tag(repo, name, n, message=None, user=None, date=None, |
d761ef24d6e1
drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30449
diff
changeset
|
313 local=True) |