Mercurial > hg
annotate tests/drawdag.py @ 49603:3eda36e9b3d6 stable
matcher: fix issues regex flag contained in pattern (issue6759)
Python 3.11 is now enforcing that flag must be at the beginning of the regex
This creates a serious regression for people using Python 3.11 with an hgignore
using flag in a "relre" pattern.
We now detect any flags in such pattern and "prepend" our ".*" pattern after them.
In addition, we now insert the flag in the regexp to only affect the pattern we
are rewriting. Otherwise, the regex built from the combined pattern would these
flags in the middle of it anyway.
As a side effect of this last change, we fix a bug… before this change regex
flag in a pattern would affect all combined patterns. That was bad and is not
longer the case.
The Rust code needs to be updated to fix that very bug, but we will do it in
another changeset.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 16 Nov 2022 13:05:01 +0100 |
parents | 642e31cb55f0 |
children |
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 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
84 import collections |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
85 import itertools |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
86 import re |
30449
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, |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
92 obsolete, |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
93 pycompat, |
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 |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
102 _pipechars = b'\\/+-|' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
103 _nonpipechars = b''.join( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
104 pycompat.bytechr(i) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
105 for i in range(33, 127) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
106 if pycompat.bytechr(i) not in _pipechars |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
107 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
108 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
109 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
110 def _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
111 """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
|
112 otherwise""" |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
113 return ch in _nonpipechars |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
114 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
115 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
116 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
|
117 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
|
118 |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
119 >>> import pprint |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
120 >>> 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
|
121 ... 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
|
122 ... G |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
123 ... | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
124 ... 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
|
125 ... \ \| | # 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
|
126 ... 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
|
127 ... \|/ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
128 ... A |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
129 ... ''').items()}) |
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 'B': ['A'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
132 'C': ['B'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
133 'D': ['B'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
134 'E': ['A'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
135 'F': ['E'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
136 'G': ['F'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
137 'H': ['A'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
138 'I': ['H']} |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
139 >>> 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
|
140 ... 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
|
141 ... o foo |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
142 ... |\ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
143 ... +---o bar |
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 | baz |
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 d |
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 c |
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 | b |
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 a |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
154 ... ''').items()}) |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
155 {'a': [], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
156 'b': ['a'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
157 'bar': ['b', 'a'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
158 'baz': [], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
159 'c': ['b'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
160 'd': ['b'], |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
161 'foo': ['baz', 'b']} |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
162 """ |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
163 lines = text.splitlines() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
164 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
|
165 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
166 def get(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
167 """(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
|
168 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
|
169 if x < 0 or y < 0: |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
170 return b' ' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
171 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
172 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
|
173 except IndexError: |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
174 return b' ' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
175 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
176 def getname(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
177 """(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
|
178 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
|
179 result = b'' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
180 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
|
181 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
|
182 if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
183 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
184 result = ch + result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
185 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
|
186 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
|
187 if not _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
188 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
189 result += ch |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
190 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
|
191 # special handling, find the name to the right |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
192 result = b'' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
193 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
|
194 ch = get(y, x + i) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
195 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
|
196 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
|
197 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
198 else: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
199 result += ch |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
200 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
|
201 return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
202 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
203 def parents(y, x): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
204 """(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
|
205 return a list of parents""" |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
31671
diff
changeset
|
206 visited = {(y, x)} |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
207 visit = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
208 result = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
209 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
210 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
|
211 """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
|
212 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
|
213 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
|
214 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
|
215 ch = get(y, x) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
216 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
|
217 y += 1 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
218 return follow(y + 1, x, expected) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
219 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
|
220 visit.append((y, x)) |
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 # -o- # starting point: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
223 # /|\ # follow '-' (horizontally), and '/|\' (to the bottom) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
224 follow(y + 1, x, b'|') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
225 follow(y + 1, x - 1, b'/') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
226 follow(y + 1, x + 1, b'\\') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
227 follow(y, x - 1, b'-') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
228 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
|
229 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
230 while visit: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
231 y, x = visit.pop() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
232 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
|
233 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
234 visited.add((y, x)) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
235 ch = get(y, x) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
236 if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
237 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
|
238 continue |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
239 elif ch == b'|': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
240 follow(y + 1, x, b'/|o') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
241 follow(y + 1, x - 1, b'/') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
242 follow(y + 1, x + 1, b'\\') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
243 elif ch == b'+': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
244 follow(y, x - 1, b'-') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
245 follow(y, x + 1, b'-') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
246 follow(y + 1, x - 1, b'/') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
247 follow(y + 1, x + 1, b'\\') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
248 follow(y + 1, x, b'|') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
249 elif ch == b'\\': |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
250 follow(y + 1, x + 1, b'\\|o') |
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, x - 1, b'-+o') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
255 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
|
256 return result |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
257 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
258 for y, line in enumerate(lines): |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
259 for x, ch in enumerate(pycompat.bytestr(line)): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
260 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
|
261 break |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
262 if _isname(ch): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
263 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
|
264 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
265 return dict(edges) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
266 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
267 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
268 class simplefilectx: |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
269 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
|
270 self._data = data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
271 self._path = path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
272 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
273 def data(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
274 return self._data |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
275 |
32305
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
276 def filenode(self): |
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
277 return None |
911057981ba4
drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents:
32291
diff
changeset
|
278 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
279 def path(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
280 return self._path |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
281 |
41774
2e2076c8c25f
commit: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents:
41542
diff
changeset
|
282 def copysource(self): |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
283 return None |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
284 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
285 def flags(self): |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
286 return b'' |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
287 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
288 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
289 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
|
290 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
|
291 opts = { |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
292 'changes': scmutil.status([], list(added), [], [], [], [], []), |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
293 'date': b'0 0', |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
294 '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
|
295 } |
39442
9a813e4c8406
drawdag: correctly pass repo to super constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
36742
diff
changeset
|
296 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
|
297 self._added = added |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
298 self._parents = parentctxs |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
299 while len(self._parents) < 2: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46113
diff
changeset
|
300 self._parents.append(repo[repo.nullid]) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
301 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
302 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
|
303 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
|
304 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
305 def commit(self): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
306 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
|
307 |
42513
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
308 def p1copies(self): |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
309 return {} |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
310 |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
311 def p2copies(self): |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
312 return {} |
15f04d652b62
drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents:
41774
diff
changeset
|
313 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
314 |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
315 def _walkgraph(edges): |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
316 """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
|
317 visible = set(edges.keys()) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
318 remaining = {} # {str: [str]} |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
319 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
|
320 for v in vs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
321 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
|
322 remaining[v] = [] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
323 remaining[k] = vs[:] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
324 while remaining: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
325 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
|
326 if not leafs: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
327 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
|
328 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
|
329 if leaf in visible: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
330 yield leaf, edges[leaf] |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
331 del remaining[leaf] |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
332 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
|
333 if leaf in v: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
334 v.remove(leaf) |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
335 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
336 |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
337 def _getcomments(text): |
41542
8d4ee2d9ffb8
drawdag: use raw strings for docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39442
diff
changeset
|
338 r""" |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
339 >>> [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
|
340 ... G |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
341 ... | |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
342 ... 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
|
343 ... \ \| | # 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
|
344 ... 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
|
345 ... \|/ |
1e71dddc10a2
drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents:
34205
diff
changeset
|
346 ... A |
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 ['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
|
349 """ |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
350 for line in text.splitlines(): |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
351 if b' # ' not in line: |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
352 continue |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
353 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
|
354 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
355 |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
356 @command(b'debugdrawdag', []) |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
357 def debugdrawdag(ui, repo, **opts): |
41542
8d4ee2d9ffb8
drawdag: use raw strings for docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39442
diff
changeset
|
358 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
|
359 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 to. |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
364 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
365 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
|
366 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
|
367 :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
|
368 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
369 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
|
370 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
|
371 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
|
372 """ |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
373 text = ui.fin.read() |
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 # 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
|
376 edges = _parseasciigraph(text) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
377 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
|
378 if len(v) > 2: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
379 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
|
380 |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
381 # parse comments to get extra file content instructions |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
382 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
|
383 comments = list(_getcomments(text)) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
384 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
|
385 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
|
386 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
|
387 files[name][path] = content |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
388 |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46113
diff
changeset
|
389 committed = {None: repo.nullid} # {name: node} |
30449
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
390 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
391 # 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
|
392 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
|
393 if len(parents) == 0: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
394 try: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
395 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
|
396 except error.RepoLookupError: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
397 pass |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
398 |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
399 # commit in topological order |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
400 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
|
401 if name in committed: |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
402 continue |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
403 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
|
404 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
|
405 added = {} |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
406 if len(parents) > 1: |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
407 # 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
|
408 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
|
409 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
|
410 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
|
411 else: |
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
412 # 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
|
413 added[name] = name |
33788
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
414 # add extra file contents in comments |
0531ffd59a98
drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents:
33558
diff
changeset
|
415 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
|
416 added[path] = content |
33558
0103e7187237
drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents:
33172
diff
changeset
|
417 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
|
418 n = ctx.commit() |
a31634336471
drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
419 committed[name] = n |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
420 tagsmod.tag( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
421 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
|
422 ) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
423 |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
424 # handle special comments |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
425 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
|
426 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
|
427 for comment in comments: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42513
diff
changeset
|
428 rels = [] # obsolete relationships |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
429 args = comment.split(b':', 1) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
430 if len(args) <= 1: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
431 continue |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
432 |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
433 cmd = args[0].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
434 arg = args[1].strip() |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
435 |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
436 if cmd in (b'replace', b'rebase', b'amend'): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
437 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
|
438 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
|
439 rels.append(((nodes[i],), (nodes[i + 1],))) |
34207
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
440 elif cmd in (b'split',): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
441 pre, succs = arg.split(b'->') |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
442 succs = succs.split(b',') |
44380
dda2341d6664
drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents:
43076
diff
changeset
|
443 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
|
444 elif cmd in (b'prune',): |
5a1b41268b7c
drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents:
34206
diff
changeset
|
445 for n in arg.split(b','): |
44380
dda2341d6664
drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents:
43076
diff
changeset
|
446 rels.append(((getctx(n),), ())) |
33153
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
447 if rels: |
4d780d510b44
drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents:
32337
diff
changeset
|
448 obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd) |