Mercurial > hg
annotate hgext/graphlog.py @ 7012:78341ea65d16
restructure helptable
When looking up a help topic, the key is now only matched against the
short names for each topic, and not the header. So
hg help 'Environment Variables'
must be replaced with
hg help env
author | Martin Geisler <mg@daimi.au.dk> |
---|---|
date | Tue, 09 Sep 2008 21:32:39 +0200 |
parents | f7f0388f7bce |
children | 810ca383da9c |
rev | line source |
---|---|
4344 | 1 # ASCII graph log extension for Mercurial |
2 # | |
3 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net> | |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4509
diff
changeset
|
4 # |
4344 | 5 # This software may be used and distributed according to the terms of |
6 # the GNU General Public License, incorporated herein by reference. | |
6666
53465a7464e2
convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6212
diff
changeset
|
7 '''show revision graphs in terminal windows''' |
4344 | 8 |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
9 import os |
4344 | 10 import sys |
11 from mercurial.cmdutil import revrange, show_changeset | |
6192
cd65a67aff31
Introduce templateopts and logopts to reduce duplicate option definitions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5968
diff
changeset
|
12 from mercurial.commands import templateopts |
4344 | 13 from mercurial.i18n import _ |
6212 | 14 from mercurial.node import nullrev |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
15 from mercurial.util import Abort, canonpath |
6762 | 16 from mercurial import util |
4344 | 17 |
18 def revision_grapher(repo, start_rev, stop_rev): | |
19 """incremental revision grapher | |
20 | |
21 This generator function walks through the revision history from | |
22 revision start_rev to revision stop_rev (which must be less than | |
23 or equal to start_rev) and for each revision emits tuples with the | |
24 following elements: | |
25 | |
26 - Current revision. | |
27 - Current node. | |
28 - Column of the current node in the set of ongoing edges. | |
29 - Edges; a list of (col, next_col) indicating the edges between | |
30 the current node and its parents. | |
31 - Number of columns (ongoing edges) in the current revision. | |
32 - The difference between the number of columns (ongoing edges) | |
33 in the next revision and the number of columns (ongoing edges) | |
34 in the current revision. That is: -1 means one column removed; | |
35 0 means no columns added or removed; 1 means one column added. | |
36 """ | |
37 | |
38 assert start_rev >= stop_rev | |
39 curr_rev = start_rev | |
40 revs = [] | |
41 while curr_rev >= stop_rev: | |
42 node = repo.changelog.node(curr_rev) | |
43 | |
44 # Compute revs and next_revs. | |
45 if curr_rev not in revs: | |
46 # New head. | |
47 revs.append(curr_rev) | |
48 rev_index = revs.index(curr_rev) | |
49 next_revs = revs[:] | |
50 | |
51 # Add parents to next_revs. | |
52 parents = get_rev_parents(repo, curr_rev) | |
53 parents_to_add = [] | |
54 for parent in parents: | |
55 if parent not in next_revs: | |
56 parents_to_add.append(parent) | |
6762 | 57 next_revs[rev_index:rev_index + 1] = util.sort(parents_to_add) |
4344 | 58 |
59 edges = [] | |
60 for parent in parents: | |
61 edges.append((rev_index, next_revs.index(parent))) | |
62 | |
63 n_columns_diff = len(next_revs) - len(revs) | |
64 yield (curr_rev, node, rev_index, edges, len(revs), n_columns_diff) | |
65 | |
66 revs = next_revs | |
67 curr_rev -= 1 | |
68 | |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
69 def filelog_grapher(repo, path, start_rev, stop_rev): |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
70 """incremental file log grapher |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
71 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
72 This generator function walks through the revision history of a |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
73 single file from revision start_rev to revision stop_rev (which must |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
74 be less than or equal to start_rev) and for each revision emits |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
75 tuples with the following elements: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
76 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
77 - Current revision. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
78 - Current node. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
79 - Column of the current node in the set of ongoing edges. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
80 - Edges; a list of (col, next_col) indicating the edges between |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
81 the current node and its parents. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
82 - Number of columns (ongoing edges) in the current revision. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
83 - The difference between the number of columns (ongoing edges) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
84 in the next revision and the number of columns (ongoing edges) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
85 in the current revision. That is: -1 means one column removed; |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
86 0 means no columns added or removed; 1 means one column added. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
87 """ |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
88 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
89 assert start_rev >= stop_rev |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
90 curr_rev = start_rev |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
91 revs = [] |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6666
diff
changeset
|
92 filerev = len(repo.file(path)) - 1 |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
93 while filerev >= 0: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
94 fctx = repo.filectx(path, fileid=filerev) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
95 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
96 # Compute revs and next_revs. |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
97 if filerev not in revs: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
98 revs.append(filerev) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
99 rev_index = revs.index(filerev) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
100 next_revs = revs[:] |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
101 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
102 # Add parents to next_revs. |
5968
6dcc190ffc36
graphlog: skip filectx parents in other filelogs
Steve Borho <steve@borho.org>
parents:
5942
diff
changeset
|
103 parents = [f.filerev() for f in fctx.parents() if f.path() == path] |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
104 parents_to_add = [] |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
105 for parent in parents: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
106 if parent not in next_revs: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
107 parents_to_add.append(parent) |
6762 | 108 next_revs[rev_index:rev_index + 1] = util.sort(parents_to_add) |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
109 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
110 edges = [] |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
111 for parent in parents: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
112 edges.append((rev_index, next_revs.index(parent))) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
113 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
114 changerev = fctx.linkrev() |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
115 if changerev <= start_rev: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
116 node = repo.changelog.node(changerev) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
117 n_columns_diff = len(next_revs) - len(revs) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
118 yield (changerev, node, rev_index, edges, len(revs), n_columns_diff) |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
119 if changerev <= stop_rev: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
120 break |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
121 revs = next_revs |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
122 filerev -= 1 |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
123 |
4344 | 124 def get_rev_parents(repo, rev): |
125 return [x for x in repo.changelog.parentrevs(rev) if x != nullrev] | |
126 | |
127 def fix_long_right_edges(edges): | |
128 for (i, (start, end)) in enumerate(edges): | |
129 if end > start: | |
130 edges[i] = (start, end + 1) | |
131 | |
132 def draw_edges(edges, nodeline, interline): | |
133 for (start, end) in edges: | |
134 if start == end + 1: | |
135 interline[2 * end + 1] = "/" | |
136 elif start == end - 1: | |
137 interline[2 * start + 1] = "\\" | |
138 elif start == end: | |
139 interline[2 * start] = "|" | |
140 else: | |
141 nodeline[2 * end] = "+" | |
142 if start > end: | |
143 (start, end) = (end,start) | |
144 for i in range(2 * start + 1, 2 * end): | |
145 if nodeline[i] != "+": | |
146 nodeline[i] = "-" | |
147 | |
148 def format_line(line, level, logstr): | |
149 text = "%-*s %s" % (2 * level, "".join(line), logstr) | |
150 return "%s\n" % text.rstrip() | |
151 | |
152 def get_nodeline_edges_tail( | |
153 node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail): | |
154 if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0: | |
155 # Still going in the same non-vertical direction. | |
156 if n_columns_diff == -1: | |
157 start = max(node_index + 1, p_node_index) | |
158 tail = ["|", " "] * (start - node_index - 1) | |
159 tail.extend(["/", " "] * (n_columns - start)) | |
160 return tail | |
161 else: | |
162 return ["\\", " "] * (n_columns - node_index - 1) | |
163 else: | |
164 return ["|", " "] * (n_columns - node_index - 1) | |
165 | |
166 def get_padding_line(ni, n_columns, edges): | |
167 line = [] | |
168 line.extend(["|", " "] * ni) | |
169 if (ni, ni - 1) in edges or (ni, ni) in edges: | |
170 # (ni, ni - 1) (ni, ni) | |
171 # | | | | | | | | | |
172 # +---o | | o---+ | |
173 # | | c | | c | | | |
174 # | |/ / | |/ / | |
175 # | | | | | | | |
176 c = "|" | |
177 else: | |
178 c = " " | |
179 line.extend([c, " "]) | |
180 line.extend(["|", " "] * (n_columns - ni - 1)) | |
181 return line | |
182 | |
183 def get_limit(limit_opt): | |
184 if limit_opt: | |
185 try: | |
186 limit = int(limit_opt) | |
187 except ValueError: | |
188 raise Abort(_("limit must be a positive integer")) | |
189 if limit <= 0: | |
190 raise Abort(_("limit must be positive")) | |
191 else: | |
192 limit = sys.maxint | |
193 return limit | |
194 | |
195 def get_revs(repo, rev_opt): | |
196 if rev_opt: | |
197 revs = revrange(repo, rev_opt) | |
198 return (max(revs), min(revs)) | |
199 else: | |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6666
diff
changeset
|
200 return (len(repo) - 1, 0) |
4344 | 201 |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
202 def graphlog(ui, repo, path=None, **opts): |
4344 | 203 """show revision history alongside an ASCII revision graph |
204 | |
205 Print a revision history alongside a revision graph drawn with | |
206 ASCII characters. | |
207 | |
4583
11cf78983961
Reverted changesets 9d1380e5c8c5 and 1d46169ec197: show @ as glog parent again.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4516
diff
changeset
|
208 Nodes printed as an @ character are parents of the working |
4344 | 209 directory. |
210 """ | |
211 | |
212 limit = get_limit(opts["limit"]) | |
213 (start_rev, stop_rev) = get_revs(repo, opts["rev"]) | |
214 stop_rev = max(stop_rev, start_rev - limit + 1) | |
215 if start_rev == nullrev: | |
216 return | |
217 cs_printer = show_changeset(ui, repo, opts) | |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
218 if path: |
6969
d76f64cd4cb2
graphlog: fix calls from outside the repository (issue1285)
Patrick Mezard <pmezard@gmail.com>
parents:
6212
diff
changeset
|
219 path = canonpath(repo.root, os.getcwd(), path) |
d76f64cd4cb2
graphlog: fix calls from outside the repository (issue1285)
Patrick Mezard <pmezard@gmail.com>
parents:
6212
diff
changeset
|
220 if path: |
d76f64cd4cb2
graphlog: fix calls from outside the repository (issue1285)
Patrick Mezard <pmezard@gmail.com>
parents:
6212
diff
changeset
|
221 grapher = filelog_grapher(repo, path, start_rev, stop_rev) |
5938
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
222 else: |
9ed100559851
graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents:
4735
diff
changeset
|
223 grapher = revision_grapher(repo, start_rev, stop_rev) |
4344 | 224 repo_parents = repo.dirstate.parents() |
225 prev_n_columns_diff = 0 | |
226 prev_node_index = 0 | |
227 | |
228 for (rev, node, node_index, edges, n_columns, n_columns_diff) in grapher: | |
229 # log_strings is the list of all log strings to draw alongside | |
230 # the graph. | |
231 ui.pushbuffer() | |
232 cs_printer.show(rev, node) | |
233 log_strings = ui.popbuffer().split("\n")[:-1] | |
234 | |
235 if n_columns_diff == -1: | |
236 # Transform | |
237 # | |
238 # | | | | | | | |
239 # o | | into o---+ | |
240 # |X / |/ / | |
241 # | | | | | |
242 fix_long_right_edges(edges) | |
243 | |
244 # add_padding_line says whether to rewrite | |
245 # | |
246 # | | | | | | | | | |
247 # | o---+ into | o---+ | |
248 # | / / | | | # <--- padding line | |
249 # o | | | / / | |
250 # o | | | |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4583
diff
changeset
|
251 add_padding_line = (len(log_strings) > 2 and |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4583
diff
changeset
|
252 n_columns_diff == -1 and |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4583
diff
changeset
|
253 [x for (x, y) in edges if x + 1 < y]) |
4344 | 254 |
255 # fix_nodeline_tail says whether to rewrite | |
256 # | |
257 # | | o | | | | o | | | |
258 # | | |/ / | | |/ / | |
259 # | o | | into | o / / # <--- fixed nodeline tail | |
260 # | |/ / | |/ / | |
261 # o | | o | | | |
262 fix_nodeline_tail = len(log_strings) <= 2 and not add_padding_line | |
263 | |
4583
11cf78983961
Reverted changesets 9d1380e5c8c5 and 1d46169ec197: show @ as glog parent again.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4516
diff
changeset
|
264 # nodeline is the line containing the node character (@ or o). |
4344 | 265 nodeline = ["|", " "] * node_index |
266 if node in repo_parents: | |
4583
11cf78983961
Reverted changesets 9d1380e5c8c5 and 1d46169ec197: show @ as glog parent again.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4516
diff
changeset
|
267 node_ch = "@" |
4344 | 268 else: |
269 node_ch = "o" | |
270 nodeline.extend([node_ch, " "]) | |
271 | |
272 nodeline.extend( | |
273 get_nodeline_edges_tail( | |
274 node_index, prev_node_index, n_columns, n_columns_diff, | |
275 prev_n_columns_diff, fix_nodeline_tail)) | |
276 | |
277 # shift_interline is the line containing the non-vertical | |
278 # edges between this entry and the next. | |
279 shift_interline = ["|", " "] * node_index | |
280 if n_columns_diff == -1: | |
281 n_spaces = 1 | |
282 edge_ch = "/" | |
283 elif n_columns_diff == 0: | |
284 n_spaces = 2 | |
285 edge_ch = "|" | |
286 else: | |
287 n_spaces = 3 | |
288 edge_ch = "\\" | |
289 shift_interline.extend(n_spaces * [" "]) | |
290 shift_interline.extend([edge_ch, " "] * (n_columns - node_index - 1)) | |
291 | |
292 # Draw edges from the current node to its parents. | |
293 draw_edges(edges, nodeline, shift_interline) | |
294 | |
295 # lines is the list of all graph lines to print. | |
296 lines = [nodeline] | |
297 if add_padding_line: | |
298 lines.append(get_padding_line(node_index, n_columns, edges)) | |
299 lines.append(shift_interline) | |
300 | |
301 # Make sure that there are as many graph lines as there are | |
302 # log strings. | |
303 while len(log_strings) < len(lines): | |
304 log_strings.append("") | |
305 if len(lines) < len(log_strings): | |
306 extra_interline = ["|", " "] * (n_columns + n_columns_diff) | |
307 while len(lines) < len(log_strings): | |
308 lines.append(extra_interline) | |
309 | |
310 # Print lines. | |
311 indentation_level = max(n_columns, n_columns + n_columns_diff) | |
312 for (line, logstr) in zip(lines, log_strings): | |
313 ui.write(format_line(line, indentation_level, logstr)) | |
314 | |
315 # ...and start over. | |
316 prev_node_index = node_index | |
317 prev_n_columns_diff = n_columns_diff | |
318 | |
319 cmdtable = { | |
320 "glog": | |
4730
eadfaa9ec487
Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
321 (graphlog, |
eadfaa9ec487
Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
322 [('l', 'limit', '', _('limit number of changes displayed')), |
eadfaa9ec487
Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
323 ('p', 'patch', False, _('show patch')), |
eadfaa9ec487
Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
324 ('r', 'rev', [], _('show the specified revision or range')), |
6192
cd65a67aff31
Introduce templateopts and logopts to reduce duplicate option definitions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5968
diff
changeset
|
325 ] + templateopts, |
5942
b75105de8573
glog shows at most one file: correct synopsis
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5940
diff
changeset
|
326 _('hg glog [OPTION]... [FILE]')), |
4344 | 327 } |