Mercurial > hg
annotate tests/drawdag.py @ 45049:513b3ef277a3
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
The println macro is not used to avoid string usage.
Dealing only with bytes allows us to be compatible with any encoding
and not just UTF8.
Later on, format macro will be made to have more readable code.
Differential Revision: https://phab.mercurial-scm.org/D8612
author | Antoine Cezar <antoine.cezar@octobus.net> |
---|---|
date | Fri, 05 Jun 2020 09:01:35 +0200 |
parents | dda2341d6664 |
children | 59fa3890d40a |
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. |
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 |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
87 import re |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
88 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
89 from mercurial.i18n import _ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
90 from mercurial import ( |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
91 context, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
92 error, |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
93 node, |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
94 obsolete, |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
95 pycompat, |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32305
diff
changeset
|
96 registrar, |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
97 scmutil, |
31671
d761ef24d6e1
drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30449
diff
changeset
|
98 tags as tagsmod, |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
99 ) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
100 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
101 cmdtable = {} |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32305
diff
changeset
|
102 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
|
103 |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
104 _pipechars = b'\\/+-|' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
105 _nonpipechars = b''.join( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
106 pycompat.bytechr(i) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
107 for i in range(33, 127) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
108 if pycompat.bytechr(i) not in _pipechars |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
109 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
110 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
111 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
112 def _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
113 """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
|
114 otherwise""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
115 return ch in _nonpipechars |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
116 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
117 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
118 def _parseasciigraph(text): |
34206
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
119 r"""str -> {str : [str]}. convert the ASCII graph to edges |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
120 |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
121 >>> import pprint |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
122 >>> pprint.pprint({pycompat.sysstr(k): [pycompat.sysstr(vv) for vv in v] |
34206
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
123 ... for k, v in _parseasciigraph(br''' |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
124 ... G |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
125 ... | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
126 ... I D C F # split: B -> E, F, G |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
127 ... \ \| | # replace: C -> D -> H |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
128 ... H B E # prune: F, I |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
129 ... \|/ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
130 ... A |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
131 ... ''').items()}) |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
132 {'A': [], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
133 'B': ['A'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
134 'C': ['B'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
135 'D': ['B'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
136 'E': ['A'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
137 'F': ['E'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
138 'G': ['F'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
139 'H': ['A'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
140 'I': ['H']} |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
141 >>> pprint.pprint({pycompat.sysstr(k): [pycompat.sysstr(vv) for vv in v] |
34206
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
142 ... for k, v in _parseasciigraph(br''' |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
143 ... o foo |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
144 ... |\ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
145 ... +---o bar |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
146 ... | | | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
147 ... | o | baz |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
148 ... | / |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
149 ... +---o d |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
150 ... | | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
151 ... +---o c |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
152 ... | | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
153 ... o | b |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
154 ... |/ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
155 ... o a |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
156 ... ''').items()}) |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
157 {'a': [], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
158 'b': ['a'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
159 'bar': ['b', 'a'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
160 'baz': [], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
161 'c': ['b'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
162 'd': ['b'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
163 'foo': ['baz', 'b']} |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
164 """ |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
165 lines = text.splitlines() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
166 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
|
167 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
168 def get(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
169 """(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
|
170 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
|
171 if x < 0 or y < 0: |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
172 return b' ' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
173 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
174 return lines[y][x : x + 1] or b' ' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
175 except IndexError: |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
176 return b' ' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
177 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
178 def getname(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
179 """(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
|
180 parts. if name is an 'o', try to replace it to the right""" |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
181 result = b'' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
182 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
|
183 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
|
184 if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
185 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
186 result = ch + result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
187 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
|
188 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
|
189 if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
190 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
191 result += ch |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
192 if result == b'o': |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
193 # special handling, find the name to the right |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
194 result = b'' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
195 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
|
196 ch = get(y, x + i) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
197 if ch == b' ' or ch in _pipechars: |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
198 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
|
199 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
200 else: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
201 result += ch |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
202 return result or b'o' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
203 return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
204 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
205 def parents(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
206 """(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
|
207 return a list of parents""" |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
31671
diff
changeset
|
208 visited = {(y, x)} |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
209 visit = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
210 result = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
211 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
212 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
|
213 """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
|
214 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
|
215 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
|
216 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
|
217 ch = get(y, x) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
218 if any(ch == c and c not in expected for c in (b'-', b'+')): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
219 y += 1 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
220 return follow(y + 1, x, expected) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
221 if ch in expected or (b'o' in expected and _isname(ch)): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
222 visit.append((y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
223 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
224 # -o- # starting point: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
225 # /|\ # follow '-' (horizontally), and '/|\' (to the bottom) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
226 follow(y + 1, x, b'|') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
227 follow(y + 1, x - 1, b'/') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
228 follow(y + 1, x + 1, b'\\') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
229 follow(y, x - 1, b'-') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
230 follow(y, x + 1, b'-') |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
231 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
232 while visit: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
233 y, x = visit.pop() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
234 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
|
235 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
236 visited.add((y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
237 ch = get(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
238 if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
239 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
|
240 continue |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
241 elif ch == b'|': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
242 follow(y + 1, x, b'/|o') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
243 follow(y + 1, x - 1, b'/') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
244 follow(y + 1, x + 1, b'\\') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
245 elif ch == b'+': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
246 follow(y, x - 1, b'-') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
247 follow(y, x + 1, b'-') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
248 follow(y + 1, x - 1, b'/') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
249 follow(y + 1, x + 1, b'\\') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
250 follow(y + 1, x, b'|') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
251 elif ch == b'\\': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
252 follow(y + 1, x + 1, b'\\|o') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
253 elif ch == b'/': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
254 follow(y + 1, x - 1, b'/|o') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
255 elif ch == b'-': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
256 follow(y, x - 1, b'-+o') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
257 follow(y, x + 1, b'-+o') |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
258 return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
259 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
260 for y, line in enumerate(lines): |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
261 for x, ch in enumerate(pycompat.bytestr(line)): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
262 if ch == b'#': # comment |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
263 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
264 if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
265 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
|
266 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
267 return dict(edges) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
268 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
269 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
270 class simplefilectx(object): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
271 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
|
272 self._data = data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
273 self._path = path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
274 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
275 def data(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
276 return self._data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
277 |
32305
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
278 def filenode(self): |
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
279 return None |
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
280 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
281 def path(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
282 return self._path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
283 |
41774
2e2076c8c25f
commit: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41542
diff
changeset
|
284 def copysource(self): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
285 return None |
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 def flags(self): |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
288 return b'' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
289 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
290 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
291 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
|
292 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
|
293 opts = { |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
294 'changes': scmutil.status([], list(added), [], [], [], [], []), |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
295 'date': b'0 0', |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
296 'extra': {b'branch': b'default'}, |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
297 } |
39442
9a813e4c8406
drawdag: correctly pass repo to super constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
36742
diff
changeset
|
298 super(simplecommitctx, self).__init__(repo, name, **opts) |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
299 self._added = added |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
300 self._parents = parentctxs |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
301 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
|
302 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
|
303 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
304 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
|
305 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
|
306 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
307 def commit(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
308 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
|
309 |
42513
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
310 def p1copies(self): |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
311 return {} |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
312 |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
313 def p2copies(self): |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
314 return {} |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
315 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
316 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
317 def _walkgraph(edges): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
318 """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
|
319 visible = set(edges.keys()) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
320 remaining = {} # {str: [str]} |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
321 for k, vs in edges.items(): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
322 for v in vs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
323 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
|
324 remaining[v] = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
325 remaining[k] = vs[:] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
326 while remaining: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
327 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
|
328 if not leafs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
329 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
|
330 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
|
331 if leaf in visible: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
332 yield leaf, edges[leaf] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
333 del remaining[leaf] |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
334 for k, v in remaining.items(): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
335 if leaf in v: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
336 v.remove(leaf) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
337 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
338 |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
339 def _getcomments(text): |
41542
8d4ee2d9ffb8
drawdag: use raw strings for docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39442
diff
changeset
|
340 r""" |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
341 >>> [pycompat.sysstr(s) for s in _getcomments(br''' |
34206
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
342 ... G |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
343 ... | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
344 ... I D C F # split: B -> E, F, G |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
345 ... \ \| | # replace: C -> D -> H |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
346 ... H B E # prune: F, I |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
347 ... \|/ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
348 ... A |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
349 ... ''')] |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
350 ['split: B -> E, F, G', 'replace: C -> D -> H', 'prune: F, I'] |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
351 """ |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
352 for line in text.splitlines(): |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
353 if b' # ' not in line: |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
354 continue |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
355 yield line.split(b' # ', 1)[1].split(b' # ')[0].strip() |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
356 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
357 |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
358 @command(b'debugdrawdag', []) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
359 def debugdrawdag(ui, repo, **opts): |
41542
8d4ee2d9ffb8
drawdag: use raw strings for docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39442
diff
changeset
|
360 r"""read an ASCII graph from stdin and create changesets |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
361 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
362 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
|
363 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
|
364 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
|
365 to. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
366 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
367 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
|
368 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
|
369 :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
|
370 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
371 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
|
372 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
|
373 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
|
374 """ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
375 text = ui.fin.read() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
376 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
377 # 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
|
378 edges = _parseasciigraph(text) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
379 for k, v in edges.items(): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
380 if len(v) > 2: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
381 raise error.Abort(_('%s: too many parents: %s') % (k, b' '.join(v))) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
382 |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
383 # parse comments to get extra file content instructions |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
384 files = collections.defaultdict(dict) # {(name, path): content} |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
385 comments = list(_getcomments(text)) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
386 filere = re.compile(br'^(\w+)/([\w/]+)\s*=\s*(.*)$', re.M) |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
387 for name, path, content in filere.findall(b'\n'.join(comments)): |
36742
4e41b59633fa
lfs: add a test showing bundle application could be broken
Jun Wu <quark@fb.com>
parents:
34207
diff
changeset
|
388 content = content.replace(br'\n', b'\n').replace(br'\1', b'\1') |
4e41b59633fa
lfs: add a test showing bundle application could be broken
Jun Wu <quark@fb.com>
parents:
34207
diff
changeset
|
389 files[name][path] = content |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
390 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
391 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
|
392 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
393 # for leaf nodes, try to find existing nodes in repo |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
394 for name, parents in edges.items(): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
395 if len(parents) == 0: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
396 try: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
397 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
|
398 except error.RepoLookupError: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
399 pass |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
400 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
401 # commit in topological order |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
402 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
|
403 if name in committed: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
404 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
405 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
|
406 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
|
407 added = {} |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
408 if len(parents) > 1: |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
409 # 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
|
410 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
|
411 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
|
412 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
|
413 else: |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
414 # 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
|
415 added[name] = name |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
416 # add extra file contents in comments |
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
417 for path, content in files.get(name, {}).items(): |
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
418 added[path] = content |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
419 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
|
420 n = ctx.commit() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
421 committed[name] = n |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
422 tagsmod.tag( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
423 repo, [name], n, message=None, user=None, date=None, local=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
424 ) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
425 |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
426 # handle special comments |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
427 with repo.wlock(), repo.lock(), repo.transaction(b'drawdag'): |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
428 getctx = lambda x: repo.unfiltered()[committed[x.strip()]] |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
429 for comment in comments: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
430 rels = [] # obsolete relationships |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
431 args = comment.split(b':', 1) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
432 if len(args) <= 1: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
433 continue |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
434 |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
435 cmd = args[0].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
436 arg = args[1].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
437 |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
438 if cmd in (b'replace', b'rebase', b'amend'): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
439 nodes = [getctx(m) for m in arg.split(b'->')] |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
440 for i in range(len(nodes) - 1): |
44380
dda2341d6664
drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents:
43076
diff
changeset
|
441 rels.append(((nodes[i],), (nodes[i + 1],))) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
442 elif cmd in (b'split',): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
443 pre, succs = arg.split(b'->') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
444 succs = succs.split(b',') |
44380
dda2341d6664
drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents:
43076
diff
changeset
|
445 rels.append(((getctx(pre),), (getctx(s) for s in succs))) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
446 elif cmd in (b'prune',): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
447 for n in arg.split(b','): |
44380
dda2341d6664
drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents:
43076
diff
changeset
|
448 rels.append(((getctx(n),), ())) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
449 if rels: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
450 obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd) |