author | Boris Feld <boris.feld@octobus.net> |
Tue, 01 Aug 2017 17:58:20 +0200 | |
changeset 33688 | 2194a8723138 |
parent 33558 | 0103e7187237 |
child 33788 | 0531ffd59a98 |
permissions | -rw-r--r-- |
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. |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
75 |
|
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
76 |
Some special comments could have side effects: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
77 |
|
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
78 |
- Create obsmarkers |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
79 |
# replace: A -> B -> C -> D # chained 1 to 1 replacements |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
80 |
# split: A -> B, C # 1 to many |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
81 |
# prune: A, B, C # many to nothing |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
82 |
""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
83 |
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
|
84 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
85 |
import collections |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
86 |
import itertools |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
87 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
88 |
from mercurial.i18n import _ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
89 |
from mercurial import ( |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
90 |
context, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
91 |
error, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
92 |
node, |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
93 |
obsolete, |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32305
diff
changeset
|
94 |
registrar, |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
95 |
scmutil, |
31671
d761ef24d6e1
drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30449
diff
changeset
|
96 |
tags as tagsmod, |
30449
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 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
99 |
cmdtable = {} |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32305
diff
changeset
|
100 |
command = registrar.command(cmdtable) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
101 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
102 |
_pipechars = '\\/+-|' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
103 |
_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
|
104 |
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
|
105 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
106 |
def _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
107 |
"""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
|
108 |
otherwise""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
109 |
return ch in _nonpipechars |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
110 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
111 |
def _parseasciigraph(text): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
112 |
"""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
|
113 |
lines = text.splitlines() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
114 |
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
|
115 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
116 |
def get(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
117 |
"""(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
|
118 |
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
|
119 |
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
|
120 |
return ' ' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
121 |
try: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
122 |
return lines[y][x] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
123 |
except IndexError: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
124 |
return ' ' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
125 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
126 |
def getname(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
127 |
"""(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
|
128 |
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
|
129 |
result = '' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
130 |
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
|
131 |
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
|
132 |
if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
133 |
break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
134 |
result = ch + 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(1): |
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 not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
138 |
break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
139 |
result += ch |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
140 |
if result == 'o': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
141 |
# 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
|
142 |
result = '' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
143 |
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
|
144 |
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
|
145 |
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
|
146 |
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
|
147 |
break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
148 |
else: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
149 |
result += ch |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
150 |
return result or 'o' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
151 |
return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
152 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
153 |
def parents(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
154 |
"""(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
|
155 |
return a list of parents""" |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
31671
diff
changeset
|
156 |
visited = {(y, x)} |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
157 |
visit = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
158 |
result = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
159 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
160 |
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
|
161 |
"""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
|
162 |
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
|
163 |
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
|
164 |
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
|
165 |
ch = get(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
166 |
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
|
167 |
y += 1 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
168 |
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
|
169 |
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
|
170 |
visit.append((y, x)) |
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 |
# -o- # starting point: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
173 |
# /|\ # 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
|
174 |
follow(y + 1, x, '|') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
175 |
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
|
176 |
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
|
177 |
follow(y, x - 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
178 |
follow(y, x + 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
179 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
180 |
while visit: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
181 |
y, x = visit.pop() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
182 |
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
|
183 |
continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
184 |
visited.add((y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
185 |
ch = get(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
186 |
if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
187 |
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
|
188 |
continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
189 |
elif ch == '|': |
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, '/|o') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
191 |
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
|
192 |
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
|
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, x - 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
195 |
follow(y, x + 1, '-') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
196 |
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
|
197 |
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
|
198 |
follow(y + 1, x, '|') |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
199 |
elif ch == '\\': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
200 |
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
|
201 |
elif ch == '/': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
202 |
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
|
203 |
elif ch == '-': |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
204 |
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
|
205 |
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
|
206 |
return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
207 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
208 |
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
|
209 |
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
|
210 |
if ch == '#': # comment |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
211 |
break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
212 |
if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
213 |
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
|
214 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
215 |
return dict(edges) |
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 |
class simplefilectx(object): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
218 |
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
|
219 |
self._data = data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
220 |
self._path = path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
221 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
222 |
def data(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
223 |
return self._data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
224 |
|
32305
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
225 |
def filenode(self): |
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
226 |
return None |
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
227 |
|
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
228 |
def path(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
229 |
return self._path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
230 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
231 |
def renamed(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
232 |
return None |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
233 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
234 |
def flags(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
235 |
return '' |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
236 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
237 |
class simplecommitctx(context.committablectx): |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
238 |
def __init__(self, repo, name, parentctxs, added): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
239 |
opts = { |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
240 |
'changes': scmutil.status([], list(added), [], [], [], [], []), |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
241 |
'date': '0 0', |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
242 |
'extra': {'branch': 'default'}, |
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 |
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
|
245 |
self._repo = repo |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
246 |
self._added = added |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
247 |
self._parents = parentctxs |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
248 |
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
|
249 |
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
|
250 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
251 |
def filectx(self, key): |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
252 |
return simplefilectx(key, self._added[key]) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
253 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
254 |
def commit(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
255 |
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
|
256 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
257 |
def _walkgraph(edges): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
258 |
"""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
|
259 |
visible = set(edges.keys()) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
260 |
remaining = {} # {str: [str]} |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
261 |
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
|
262 |
for v in vs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
263 |
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
|
264 |
remaining[v] = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
265 |
remaining[k] = vs[:] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
266 |
while remaining: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
267 |
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
|
268 |
if not leafs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
269 |
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
|
270 |
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
|
271 |
if leaf in visible: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
272 |
yield leaf, edges[leaf] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
273 |
del remaining[leaf] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
274 |
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
|
275 |
if leaf in v: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
276 |
v.remove(leaf) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
277 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
278 |
@command('debugdrawdag', []) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
279 |
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
|
280 |
"""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
|
281 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
282 |
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
|
283 |
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
|
284 |
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
|
285 |
to. |
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 |
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
|
288 |
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
|
289 |
: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
|
290 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
291 |
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
|
292 |
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
|
293 |
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
|
294 |
""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
295 |
text = ui.fin.read() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
296 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
297 |
# 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
|
298 |
edges = _parseasciigraph(text) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
299 |
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
|
300 |
if len(v) > 2: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
301 |
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
|
302 |
% (k, ' '.join(v))) |
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 |
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
|
305 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
306 |
# 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
|
307 |
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
|
308 |
if len(parents) == 0: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
309 |
try: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
310 |
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
|
311 |
except error.RepoLookupError: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
312 |
pass |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
313 |
|
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
314 |
# commit in topological order |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
315 |
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
|
316 |
if name in committed: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
317 |
continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
318 |
pctxs = [repo[committed[n]] for n in parents] |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
319 |
pctxs.sort(key=lambda c: c.node()) |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
320 |
added = {} |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
321 |
if len(parents) > 1: |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
322 |
# If it's a merge, take the files and contents from the parents |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
323 |
for f in pctxs[1].manifest(): |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
324 |
if f not in pctxs[0].manifest(): |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
325 |
added[f] = pctxs[1][f].data() |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
326 |
else: |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
327 |
# If it's not a merge, add a single file |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
328 |
added[name] = name |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
329 |
ctx = simplecommitctx(repo, name, pctxs, added) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
330 |
n = ctx.commit() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
331 |
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
|
332 |
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
|
333 |
local=True) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
334 |
|
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
335 |
# handle special comments |
33172
0830c841fc7f
drawdag: inline transaction() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33153
diff
changeset
|
336 |
with repo.wlock(), repo.lock(), repo.transaction('drawdag'): |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
337 |
getctx = lambda x: repo.unfiltered()[committed[x.strip()]] |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
338 |
for line in text.splitlines(): |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
339 |
if ' # ' not in line: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
340 |
continue |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
341 |
|
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
342 |
rels = [] # obsolete relationships |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
343 |
comment = line.split(' # ', 1)[1].split(' # ')[0].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
344 |
args = comment.split(':', 1) |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
345 |
if len(args) <= 1: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
346 |
continue |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
347 |
|
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
348 |
cmd = args[0].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
349 |
arg = args[1].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
350 |
|
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
351 |
if cmd in ('replace', 'rebase', 'amend'): |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
352 |
nodes = [getctx(m) for m in arg.split('->')] |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
353 |
for i in range(len(nodes) - 1): |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
354 |
rels.append((nodes[i], (nodes[i + 1],))) |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
355 |
elif cmd in ('split',): |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
356 |
pre, succs = arg.split('->') |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
357 |
succs = succs.split(',') |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
358 |
rels.append((getctx(pre), (getctx(s) for s in succs))) |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
359 |
elif cmd in ('prune',): |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
360 |
for n in arg.split(','): |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
361 |
rels.append((getctx(n), ())) |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
362 |
if rels: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
363 |
obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd) |