annotate tests/drawdag.py @ 31976:e0b6421b2fc5

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