annotate tests/drawdag.py @ 33289:abd7dedbaa36

sparse: vendor Facebook-developed extension Facebook has developed an extension to enable "sparse" checkouts - a working directory with a subset of files. This feature is a critical component in enabling repositories to scale to infinite number of files while retaining reasonable performance. It's worth noting that sparse checkout is only one possible solution to this problem: another is virtual filesystems that realize files on first access. But given that virtual filesystems may not be accessible to all users, sparse checkout is necessary as a fallback. Per mailing list discussion at https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-March/095868.html we want to add sparse checkout to the Mercurial distribution via roughly the following mechanism: 1. Vendor extension as-is with minimal modifications (this patch) 2. Refactor extension so it is more clearly experimental and inline with Mercurial practices 3. Move code from extension into core where possible 4. Drop experimental labeling and/or move feature into core after sign-off from narrow clone feature owners This commit essentially copies the sparse extension and tests from revision 71e0a2aeca92a4078fe1b8c76e32c88ff1929737 of the https://bitbucket.org/facebook/hg-experimental repository. A list of modifications made as part of vendoring is as follows: * "EXPERIMENTAL" added to module docstring * Imports were changed to match Mercurial style conventions * "testedwith" value was updated to core Mercurial special value and comment boilerplate was inserted * A "clone_sparse" function was renamed to "clonesparse" to appease the style checker * Paths to the sparse extension in tests reflect built-in location * test-sparse-extensions.t was renamed to test-sparse-fsmonitor.t and references to "simplecache" were removed. The test always skips because it isn't trivial to run it given the way we currently run fsmonitor tests * A double empty line was removed from test-sparse-profiles.t There are aspects of the added code that are obviously not ideal. The goal is to make a minimal number of modifications as part of the vendoring to make it easier to track changes from the original implementation. Refactoring will occur in subsequent patches.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 01 Jul 2017 10:43:29 -0700
parents 0830c841fc7f
children 0103e7187237
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.
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
75
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
76 Some special comments could have side effects:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
77
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
78 - Create obsmarkers
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
79 # replace: A -> B -> C -> D # chained 1 to 1 replacements
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
80 # split: A -> B, C # 1 to many
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
81 # prune: A, B, C # many to nothing
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
82 """
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
83 from __future__ import absolute_import, print_function
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
84
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
85 import collections
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
86 import itertools
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
87
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
88 from mercurial.i18n import _
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
89 from mercurial import (
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
90 context,
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
91 error,
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
92 node,
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
93 obsolete,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32305
diff changeset
94 registrar,
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
95 scmutil,
31671
d761ef24d6e1 drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30449
diff changeset
96 tags as tagsmod,
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
97 )
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
98
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
99 cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32305
diff changeset
100 command = registrar.command(cmdtable)
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
101
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
102 _pipechars = '\\/+-|'
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
103 _nonpipechars = ''.join(chr(i) for i in xrange(33, 127)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
104 if chr(i) not in _pipechars)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
105
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
106 def _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
107 """char -> bool. return True if ch looks like part of a name, False
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
108 otherwise"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
109 return ch in _nonpipechars
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
110
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
111 def _parseasciigraph(text):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
112 """str -> {str : [str]}. convert the ASCII graph to edges"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
113 lines = text.splitlines()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
114 edges = collections.defaultdict(list) # {node: []}
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
115
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
116 def get(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
117 """(int, int) -> char. give a coordinate, return the char. return a
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
118 space for anything out of range"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
119 if x < 0 or y < 0:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
120 return ' '
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
121 try:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
122 return lines[y][x]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
123 except IndexError:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
124 return ' '
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
125
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
126 def getname(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
127 """(int, int) -> str. like get(y, x) but concatenate left and right
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
128 parts. if name is an 'o', try to replace it to the right"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
129 result = ''
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
130 for i in itertools.count(0):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
131 ch = get(y, x - i)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
132 if not _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
133 break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
134 result = ch + result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
135 for i in itertools.count(1):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
136 ch = get(y, x + i)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
137 if not _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
138 break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
139 result += ch
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
140 if result == 'o':
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
141 # special handling, find the name to the right
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
142 result = ''
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
143 for i in itertools.count(2):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
144 ch = get(y, x + i)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
145 if ch == ' ' or ch in _pipechars:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
146 if result or x + i >= len(lines[y]):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
147 break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
148 else:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
149 result += ch
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
150 return result or 'o'
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
151 return result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
152
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
153 def parents(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
154 """(int, int) -> [str]. follow the ASCII edges at given position,
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
155 return a list of parents"""
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 31671
diff changeset
156 visited = {(y, x)}
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
157 visit = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
158 result = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
159
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
160 def follow(y, x, expected):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
161 """conditionally append (y, x) to visit array, if it's a char
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
162 in excepted. 'o' in expected means an '_isname' test.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
163 if '-' (or '+') is not in excepted, and get(y, x) is '-' (or '+'),
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
164 the next line (y + 1, x) will be checked instead."""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
165 ch = get(y, x)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
166 if any(ch == c and c not in expected for c in '-+'):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
167 y += 1
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
168 return follow(y + 1, x, expected)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
169 if ch in expected or ('o' in expected and _isname(ch)):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
170 visit.append((y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
171
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
172 # -o- # starting point:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
173 # /|\ # follow '-' (horizontally), and '/|\' (to the bottom)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
174 follow(y + 1, x, '|')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
175 follow(y + 1, x - 1, '/')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
176 follow(y + 1, x + 1, '\\')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
177 follow(y, x - 1, '-')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
178 follow(y, x + 1, '-')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
179
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
180 while visit:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
181 y, x = visit.pop()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
182 if (y, x) in visited:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
183 continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
184 visited.add((y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
185 ch = get(y, x)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
186 if _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
187 result.append(getname(y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
188 continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
189 elif ch == '|':
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
190 follow(y + 1, x, '/|o')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
191 follow(y + 1, x - 1, '/')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
192 follow(y + 1, x + 1, '\\')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
193 elif ch == '+':
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
194 follow(y, x - 1, '-')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
195 follow(y, x + 1, '-')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
196 follow(y + 1, x - 1, '/')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
197 follow(y + 1, x + 1, '\\')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
198 follow(y + 1, x, '|')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
199 elif ch == '\\':
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
200 follow(y + 1, x + 1, '\\|o')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
201 elif ch == '/':
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
202 follow(y + 1, x - 1, '/|o')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
203 elif ch == '-':
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
204 follow(y, x - 1, '-+o')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
205 follow(y, x + 1, '-+o')
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
206 return result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
207
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
208 for y, line in enumerate(lines):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
209 for x, ch in enumerate(line):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
210 if ch == '#': # comment
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
211 break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
212 if _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
213 edges[getname(y, x)] += parents(y, x)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
214
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
215 return dict(edges)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
216
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
217 class simplefilectx(object):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
218 def __init__(self, path, data):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
219 self._data = data
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
220 self._path = path
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
221
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
222 def data(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
223 return self._data
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
224
32305
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32291
diff changeset
225 def filenode(self):
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32291
diff changeset
226 return None
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32291
diff changeset
227
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
228 def path(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
229 return self._path
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
230
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
231 def renamed(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
232 return None
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
233
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
234 def flags(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
235 return ''
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
236
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
237 class simplecommitctx(context.committablectx):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
238 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
239 opts = {
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
240 '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
241 'date': '0 0',
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
242 'extra': {'branch': 'default'},
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
243 }
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
244 super(simplecommitctx, self).__init__(self, name, **opts)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
245 self._repo = repo
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
246 self._name = name
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
247 self._parents = parentctxs
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
248 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
249 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
250 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
251
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
252 def filectx(self, key):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
253 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
254
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
255 def commit(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
256 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
257
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
258 def _walkgraph(edges):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
259 """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
260 visible = set(edges.keys())
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
261 remaining = {} # {str: [str]}
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
262 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
263 for v in vs:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
264 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
265 remaining[v] = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
266 remaining[k] = vs[:]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
267 while remaining:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
268 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
269 if not leafs:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
270 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
271 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
272 if leaf in visible:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
273 yield leaf, edges[leaf]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
274 del remaining[leaf]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
275 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
276 if leaf in v:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
277 v.remove(leaf)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
278
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
279 @command('debugdrawdag', [])
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
280 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
281 """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
282
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
283 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
284 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
285 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
286 to.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
287
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
288 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
289 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
290 :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
291
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
292 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
293 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
294 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
295 """
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
296 text = ui.fin.read()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
297
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
298 # 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
299 edges = _parseasciigraph(text)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
300 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
301 if len(v) > 2:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
302 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
303 % (k, ' '.join(v)))
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 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
306
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
307 # 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
308 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
309 if len(parents) == 0:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
310 try:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
311 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
312 except error.RepoLookupError:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
313 pass
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
314
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
315 # commit in topological order
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
316 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
317 if name in committed:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
318 continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
319 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
320 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
321 n = ctx.commit()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
322 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
323 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
324 local=True)
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
325
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
326 # handle special comments
33172
0830c841fc7f drawdag: inline transaction() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33153
diff changeset
327 with repo.wlock(), repo.lock(), repo.transaction('drawdag'):
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
328 getctx = lambda x: repo.unfiltered()[committed[x.strip()]]
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
329 for line in text.splitlines():
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
330 if ' # ' not in line:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
331 continue
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
332
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
333 rels = [] # obsolete relationships
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
334 comment = line.split(' # ', 1)[1].split(' # ')[0].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
335 args = comment.split(':', 1)
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
336 if len(args) <= 1:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
337 continue
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
338
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
339 cmd = args[0].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
340 arg = args[1].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
341
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
342 if cmd in ('replace', 'rebase', 'amend'):
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
343 nodes = [getctx(m) for m in arg.split('->')]
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
344 for i in range(len(nodes) - 1):
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
345 rels.append((nodes[i], (nodes[i + 1],)))
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
346 elif cmd in ('split',):
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
347 pre, succs = arg.split('->')
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
348 succs = succs.split(',')
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
349 rels.append((getctx(pre), (getctx(s) for s in succs)))
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
350 elif cmd in ('prune',):
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
351 for n in arg.split(','):
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
352 rels.append((getctx(n), ()))
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
353 if rels:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
354 obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd)