116 - The difference between the number of columns (ongoing edges) |
116 - The difference between the number of columns (ongoing edges) |
117 in the next revision and the number of columns (ongoing edges) |
117 in the next revision and the number of columns (ongoing edges) |
118 in the current revision. That is: -1 means one column removed; |
118 in the current revision. That is: -1 means one column removed; |
119 0 means no columns added or removed; 1 means one column added. |
119 0 means no columns added or removed; 1 means one column added. |
120 """ |
120 """ |
121 prev_n_columns_diff = 0 |
121 |
122 prev_node_index = 0 |
122 base = [0, 0] |
123 for (node_index, type, (node_ch, node_lines), edges, n_columns, n_columns_diff) in dag: |
123 for idx, type, (char, text), edges, ncols, coldiff in dag: |
124 |
124 |
125 assert -2 < n_columns_diff < 2 |
125 assert -2 < coldiff < 2 |
126 if n_columns_diff == -1: |
126 if coldiff == -1: |
127 # Transform |
127 # Transform |
128 # |
128 # |
129 # | | | | | | |
129 # | | | | | | |
130 # o | | into o---+ |
130 # o | | into o---+ |
131 # |X / |/ / |
131 # |X / |/ / |
137 # | | | | | | | | |
137 # | | | | | | | | |
138 # | o---+ into | o---+ |
138 # | o---+ into | o---+ |
139 # | / / | | | # <--- padding line |
139 # | / / | | | # <--- padding line |
140 # o | | | / / |
140 # o | | | / / |
141 # o | | |
141 # o | | |
142 add_padding_line = (len(node_lines) > 2 and |
142 add_padding_line = (len(text) > 2 and |
143 n_columns_diff == -1 and |
143 coldiff == -1 and |
144 [x for (x, y) in edges if x + 1 < y]) |
144 [x for (x, y) in edges if x + 1 < y]) |
145 |
145 |
146 # fix_nodeline_tail says whether to rewrite |
146 # fix_nodeline_tail says whether to rewrite |
147 # |
147 # |
148 # | | o | | | | o | | |
148 # | | o | | | | o | | |
149 # | | |/ / | | |/ / |
149 # | | |/ / | | |/ / |
150 # | o | | into | o / / # <--- fixed nodeline tail |
150 # | o | | into | o / / # <--- fixed nodeline tail |
151 # | |/ / | |/ / |
151 # | |/ / | |/ / |
152 # o | | o | | |
152 # o | | o | | |
153 fix_nodeline_tail = len(node_lines) <= 2 and not add_padding_line |
153 fix_nodeline_tail = len(text) <= 2 and not add_padding_line |
154 |
154 |
155 # nodeline is the line containing the node character (typically o) |
155 # nodeline is the line containing the node character (typically o) |
156 nodeline = ["|", " "] * node_index |
156 nodeline = ["|", " "] * idx |
157 nodeline.extend([node_ch, " "]) |
157 nodeline.extend([char, " "]) |
158 |
158 |
159 nodeline.extend( |
159 nodeline.extend( |
160 get_nodeline_edges_tail( |
160 get_nodeline_edges_tail(idx, base[1], ncols, coldiff, |
161 node_index, prev_node_index, n_columns, n_columns_diff, |
161 base[0], fix_nodeline_tail)) |
162 prev_n_columns_diff, fix_nodeline_tail)) |
|
163 |
162 |
164 # shift_interline is the line containing the non-vertical |
163 # shift_interline is the line containing the non-vertical |
165 # edges between this entry and the next |
164 # edges between this entry and the next |
166 shift_interline = ["|", " "] * node_index |
165 shift_interline = ["|", " "] * idx |
167 if n_columns_diff == -1: |
166 if coldiff == -1: |
168 n_spaces = 1 |
167 n_spaces = 1 |
169 edge_ch = "/" |
168 edge_ch = "/" |
170 elif n_columns_diff == 0: |
169 elif coldiff == 0: |
171 n_spaces = 2 |
170 n_spaces = 2 |
172 edge_ch = "|" |
171 edge_ch = "|" |
173 else: |
172 else: |
174 n_spaces = 3 |
173 n_spaces = 3 |
175 edge_ch = "\\" |
174 edge_ch = "\\" |
176 shift_interline.extend(n_spaces * [" "]) |
175 shift_interline.extend(n_spaces * [" "]) |
177 shift_interline.extend([edge_ch, " "] * (n_columns - node_index - 1)) |
176 shift_interline.extend([edge_ch, " "] * (ncols - idx - 1)) |
178 |
177 |
179 # draw edges from the current node to its parents |
178 # draw edges from the current node to its parents |
180 draw_edges(edges, nodeline, shift_interline) |
179 draw_edges(edges, nodeline, shift_interline) |
181 |
180 |
182 # lines is the list of all graph lines to print |
181 # lines is the list of all graph lines to print |
183 lines = [nodeline] |
182 lines = [nodeline] |
184 if add_padding_line: |
183 if add_padding_line: |
185 lines.append(get_padding_line(node_index, n_columns, edges)) |
184 lines.append(get_padding_line(idx, ncols, edges)) |
186 lines.append(shift_interline) |
185 lines.append(shift_interline) |
187 |
186 |
188 # make sure that there are as many graph lines as there are |
187 # make sure that there are as many graph lines as there are |
189 # log strings |
188 # log strings |
190 while len(node_lines) < len(lines): |
189 while len(text) < len(lines): |
191 node_lines.append("") |
190 text.append("") |
192 if len(lines) < len(node_lines): |
191 if len(lines) < len(text): |
193 extra_interline = ["|", " "] * (n_columns + n_columns_diff) |
192 extra_interline = ["|", " "] * (ncols + coldiff) |
194 while len(lines) < len(node_lines): |
193 while len(lines) < len(text): |
195 lines.append(extra_interline) |
194 lines.append(extra_interline) |
196 |
195 |
197 # print lines |
196 # print lines |
198 indentation_level = max(n_columns, n_columns + n_columns_diff) |
197 indentation_level = max(ncols, ncols + coldiff) |
199 for (line, logstr) in zip(lines, node_lines): |
198 for (line, logstr) in zip(lines, text): |
200 ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr) |
199 ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr) |
201 ui.write(ln.rstrip() + '\n') |
200 ui.write(ln.rstrip() + '\n') |
202 |
201 |
203 # ... and start over |
202 # ... and start over |
204 prev_node_index = node_index |
203 base[0] = coldiff |
205 prev_n_columns_diff = n_columns_diff |
204 base[1] = idx |
206 |
205 |
207 def get_revs(repo, rev_opt): |
206 def get_revs(repo, rev_opt): |
208 if rev_opt: |
207 if rev_opt: |
209 revs = revrange(repo, rev_opt) |
208 revs = revrange(repo, rev_opt) |
210 return (max(revs), min(revs)) |
209 return (max(revs), min(revs)) |