##// END OF EJS Templates
hgk: word-wrap help texts at 70 characters
Martin Geisler -
r7992:0e7f02ea default
parent child Browse files
Show More
@@ -1,358 +1,358
1 # Minimal support for git commands on an hg repository
1 # Minimal support for git commands on an hg repository
2 #
2 #
3 # Copyright 2005, 2006 Chris Mason <mason@suse.com>
3 # Copyright 2005, 2006 Chris Mason <mason@suse.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7 '''browsing the repository in a graphical way
7 '''browsing the repository in a graphical way
8
8
9 The hgk extension allows browsing the history of a repository in a
9 The hgk extension allows browsing the history of a repository in a
10 graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is
10 graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not
11 not distributed with Mercurial.)
11 distributed with Mercurial.)
12
12
13 hgk consists of two parts: a Tcl script that does the displaying and
13 hgk consists of two parts: a Tcl script that does the displaying and
14 querying of information, and an extension to mercurial named hgk.py,
14 querying of information, and an extension to mercurial named hgk.py,
15 which provides hooks for hgk to get information. hgk can be found in
15 which provides hooks for hgk to get information. hgk can be found in
16 the contrib directory, and hgk.py can be found in the hgext directory.
16 the contrib directory, and hgk.py can be found in the hgext directory.
17
17
18 To load the hgext.py extension, add it to your .hgrc file (you have
18 To load the hgext.py extension, add it to your .hgrc file (you have to
19 to use your global $HOME/.hgrc file, not one in a repository). You
19 use your global $HOME/.hgrc file, not one in a repository). You can
20 can specify an absolute path:
20 specify an absolute path:
21
21
22 [extensions]
22 [extensions]
23 hgk=/usr/local/lib/hgk.py
23 hgk=/usr/local/lib/hgk.py
24
24
25 Mercurial can also scan the default python library path for a file
25 Mercurial can also scan the default python library path for a file
26 named 'hgk.py' if you set hgk empty:
26 named 'hgk.py' if you set hgk empty:
27
27
28 [extensions]
28 [extensions]
29 hgk=
29 hgk=
30
30
31 The hg view command will launch the hgk Tcl script. For this command
31 The hg view command will launch the hgk Tcl script. For this command
32 to work, hgk must be in your search path. Alternately, you can
32 to work, hgk must be in your search path. Alternately, you can specify
33 specify the path to hgk in your .hgrc file:
33 the path to hgk in your .hgrc file:
34
34
35 [hgk]
35 [hgk]
36 path=/location/of/hgk
36 path=/location/of/hgk
37
37
38 hgk can make use of the extdiff extension to visualize revisions.
38 hgk can make use of the extdiff extension to visualize revisions.
39 Assuming you had already configured extdiff vdiff command, just add:
39 Assuming you had already configured extdiff vdiff command, just add:
40
40
41 [hgk]
41 [hgk]
42 vdiff=vdiff
42 vdiff=vdiff
43
43
44 Revisions context menu will now display additional entries to fire
44 Revisions context menu will now display additional entries to fire
45 vdiff on hovered and selected revisions.'''
45 vdiff on hovered and selected revisions.'''
46
46
47 import os
47 import os
48 from mercurial import commands, util, patch, revlog, cmdutil
48 from mercurial import commands, util, patch, revlog, cmdutil
49 from mercurial.node import nullid, nullrev, short
49 from mercurial.node import nullid, nullrev, short
50 from mercurial.i18n import _
50 from mercurial.i18n import _
51
51
52 def difftree(ui, repo, node1=None, node2=None, *files, **opts):
52 def difftree(ui, repo, node1=None, node2=None, *files, **opts):
53 """diff trees from two commits"""
53 """diff trees from two commits"""
54 def __difftree(repo, node1, node2, files=[]):
54 def __difftree(repo, node1, node2, files=[]):
55 assert node2 is not None
55 assert node2 is not None
56 mmap = repo[node1].manifest()
56 mmap = repo[node1].manifest()
57 mmap2 = repo[node2].manifest()
57 mmap2 = repo[node2].manifest()
58 m = cmdutil.match(repo, files)
58 m = cmdutil.match(repo, files)
59 modified, added, removed = repo.status(node1, node2, m)[:3]
59 modified, added, removed = repo.status(node1, node2, m)[:3]
60 empty = short(nullid)
60 empty = short(nullid)
61
61
62 for f in modified:
62 for f in modified:
63 # TODO get file permissions
63 # TODO get file permissions
64 ui.write(":100664 100664 %s %s M\t%s\t%s\n" %
64 ui.write(":100664 100664 %s %s M\t%s\t%s\n" %
65 (short(mmap[f]), short(mmap2[f]), f, f))
65 (short(mmap[f]), short(mmap2[f]), f, f))
66 for f in added:
66 for f in added:
67 ui.write(":000000 100664 %s %s N\t%s\t%s\n" %
67 ui.write(":000000 100664 %s %s N\t%s\t%s\n" %
68 (empty, short(mmap2[f]), f, f))
68 (empty, short(mmap2[f]), f, f))
69 for f in removed:
69 for f in removed:
70 ui.write(":100664 000000 %s %s D\t%s\t%s\n" %
70 ui.write(":100664 000000 %s %s D\t%s\t%s\n" %
71 (short(mmap[f]), empty, f, f))
71 (short(mmap[f]), empty, f, f))
72 ##
72 ##
73
73
74 while True:
74 while True:
75 if opts['stdin']:
75 if opts['stdin']:
76 try:
76 try:
77 line = raw_input().split(' ')
77 line = raw_input().split(' ')
78 node1 = line[0]
78 node1 = line[0]
79 if len(line) > 1:
79 if len(line) > 1:
80 node2 = line[1]
80 node2 = line[1]
81 else:
81 else:
82 node2 = None
82 node2 = None
83 except EOFError:
83 except EOFError:
84 break
84 break
85 node1 = repo.lookup(node1)
85 node1 = repo.lookup(node1)
86 if node2:
86 if node2:
87 node2 = repo.lookup(node2)
87 node2 = repo.lookup(node2)
88 else:
88 else:
89 node2 = node1
89 node2 = node1
90 node1 = repo.changelog.parents(node1)[0]
90 node1 = repo.changelog.parents(node1)[0]
91 if opts['patch']:
91 if opts['patch']:
92 if opts['pretty']:
92 if opts['pretty']:
93 catcommit(ui, repo, node2, "")
93 catcommit(ui, repo, node2, "")
94 m = cmdutil.match(repo, files)
94 m = cmdutil.match(repo, files)
95 chunks = patch.diff(repo, node1, node2, match=m,
95 chunks = patch.diff(repo, node1, node2, match=m,
96 opts=patch.diffopts(ui, {'git': True}))
96 opts=patch.diffopts(ui, {'git': True}))
97 for chunk in chunks:
97 for chunk in chunks:
98 repo.ui.write(chunk)
98 repo.ui.write(chunk)
99 else:
99 else:
100 __difftree(repo, node1, node2, files=files)
100 __difftree(repo, node1, node2, files=files)
101 if not opts['stdin']:
101 if not opts['stdin']:
102 break
102 break
103
103
104 def catcommit(ui, repo, n, prefix, ctx=None):
104 def catcommit(ui, repo, n, prefix, ctx=None):
105 nlprefix = '\n' + prefix;
105 nlprefix = '\n' + prefix;
106 if ctx is None:
106 if ctx is None:
107 ctx = repo[n]
107 ctx = repo[n]
108 ui.write("tree %s\n" % short(ctx.changeset()[0])) # use ctx.node() instead ??
108 ui.write("tree %s\n" % short(ctx.changeset()[0])) # use ctx.node() instead ??
109 for p in ctx.parents():
109 for p in ctx.parents():
110 ui.write("parent %s\n" % p)
110 ui.write("parent %s\n" % p)
111
111
112 date = ctx.date()
112 date = ctx.date()
113 description = ctx.description().replace("\0", "")
113 description = ctx.description().replace("\0", "")
114 lines = description.splitlines()
114 lines = description.splitlines()
115 if lines and lines[-1].startswith('committer:'):
115 if lines and lines[-1].startswith('committer:'):
116 committer = lines[-1].split(': ')[1].rstrip()
116 committer = lines[-1].split(': ')[1].rstrip()
117 else:
117 else:
118 committer = ctx.user()
118 committer = ctx.user()
119
119
120 ui.write("author %s %s %s\n" % (ctx.user(), int(date[0]), date[1]))
120 ui.write("author %s %s %s\n" % (ctx.user(), int(date[0]), date[1]))
121 ui.write("committer %s %s %s\n" % (committer, int(date[0]), date[1]))
121 ui.write("committer %s %s %s\n" % (committer, int(date[0]), date[1]))
122 ui.write("revision %d\n" % ctx.rev())
122 ui.write("revision %d\n" % ctx.rev())
123 ui.write("branch %s\n\n" % ctx.branch())
123 ui.write("branch %s\n\n" % ctx.branch())
124
124
125 if prefix != "":
125 if prefix != "":
126 ui.write("%s%s\n" % (prefix, description.replace('\n', nlprefix).strip()))
126 ui.write("%s%s\n" % (prefix, description.replace('\n', nlprefix).strip()))
127 else:
127 else:
128 ui.write(description + "\n")
128 ui.write(description + "\n")
129 if prefix:
129 if prefix:
130 ui.write('\0')
130 ui.write('\0')
131
131
132 def base(ui, repo, node1, node2):
132 def base(ui, repo, node1, node2):
133 """output common ancestor information"""
133 """output common ancestor information"""
134 node1 = repo.lookup(node1)
134 node1 = repo.lookup(node1)
135 node2 = repo.lookup(node2)
135 node2 = repo.lookup(node2)
136 n = repo.changelog.ancestor(node1, node2)
136 n = repo.changelog.ancestor(node1, node2)
137 ui.write(short(n) + "\n")
137 ui.write(short(n) + "\n")
138
138
139 def catfile(ui, repo, type=None, r=None, **opts):
139 def catfile(ui, repo, type=None, r=None, **opts):
140 """cat a specific revision"""
140 """cat a specific revision"""
141 # in stdin mode, every line except the commit is prefixed with two
141 # in stdin mode, every line except the commit is prefixed with two
142 # spaces. This way the our caller can find the commit without magic
142 # spaces. This way the our caller can find the commit without magic
143 # strings
143 # strings
144 #
144 #
145 prefix = ""
145 prefix = ""
146 if opts['stdin']:
146 if opts['stdin']:
147 try:
147 try:
148 (type, r) = raw_input().split(' ');
148 (type, r) = raw_input().split(' ');
149 prefix = " "
149 prefix = " "
150 except EOFError:
150 except EOFError:
151 return
151 return
152
152
153 else:
153 else:
154 if not type or not r:
154 if not type or not r:
155 ui.warn(_("cat-file: type or revision not supplied\n"))
155 ui.warn(_("cat-file: type or revision not supplied\n"))
156 commands.help_(ui, 'cat-file')
156 commands.help_(ui, 'cat-file')
157
157
158 while r:
158 while r:
159 if type != "commit":
159 if type != "commit":
160 ui.warn(_("aborting hg cat-file only understands commits\n"))
160 ui.warn(_("aborting hg cat-file only understands commits\n"))
161 return 1;
161 return 1;
162 n = repo.lookup(r)
162 n = repo.lookup(r)
163 catcommit(ui, repo, n, prefix)
163 catcommit(ui, repo, n, prefix)
164 if opts['stdin']:
164 if opts['stdin']:
165 try:
165 try:
166 (type, r) = raw_input().split(' ');
166 (type, r) = raw_input().split(' ');
167 except EOFError:
167 except EOFError:
168 break
168 break
169 else:
169 else:
170 break
170 break
171
171
172 # git rev-tree is a confusing thing. You can supply a number of
172 # git rev-tree is a confusing thing. You can supply a number of
173 # commit sha1s on the command line, and it walks the commit history
173 # commit sha1s on the command line, and it walks the commit history
174 # telling you which commits are reachable from the supplied ones via
174 # telling you which commits are reachable from the supplied ones via
175 # a bitmask based on arg position.
175 # a bitmask based on arg position.
176 # you can specify a commit to stop at by starting the sha1 with ^
176 # you can specify a commit to stop at by starting the sha1 with ^
177 def revtree(ui, args, repo, full="tree", maxnr=0, parents=False):
177 def revtree(ui, args, repo, full="tree", maxnr=0, parents=False):
178 def chlogwalk():
178 def chlogwalk():
179 count = len(repo)
179 count = len(repo)
180 i = count
180 i = count
181 l = [0] * 100
181 l = [0] * 100
182 chunk = 100
182 chunk = 100
183 while True:
183 while True:
184 if chunk > i:
184 if chunk > i:
185 chunk = i
185 chunk = i
186 i = 0
186 i = 0
187 else:
187 else:
188 i -= chunk
188 i -= chunk
189
189
190 for x in xrange(0, chunk):
190 for x in xrange(0, chunk):
191 if i + x >= count:
191 if i + x >= count:
192 l[chunk - x:] = [0] * (chunk - x)
192 l[chunk - x:] = [0] * (chunk - x)
193 break
193 break
194 if full != None:
194 if full != None:
195 l[x] = repo[i + x]
195 l[x] = repo[i + x]
196 l[x].changeset() # force reading
196 l[x].changeset() # force reading
197 else:
197 else:
198 l[x] = 1
198 l[x] = 1
199 for x in xrange(chunk-1, -1, -1):
199 for x in xrange(chunk-1, -1, -1):
200 if l[x] != 0:
200 if l[x] != 0:
201 yield (i + x, full != None and l[x] or None)
201 yield (i + x, full != None and l[x] or None)
202 if i == 0:
202 if i == 0:
203 break
203 break
204
204
205 # calculate and return the reachability bitmask for sha
205 # calculate and return the reachability bitmask for sha
206 def is_reachable(ar, reachable, sha):
206 def is_reachable(ar, reachable, sha):
207 if len(ar) == 0:
207 if len(ar) == 0:
208 return 1
208 return 1
209 mask = 0
209 mask = 0
210 for i in xrange(len(ar)):
210 for i in xrange(len(ar)):
211 if sha in reachable[i]:
211 if sha in reachable[i]:
212 mask |= 1 << i
212 mask |= 1 << i
213
213
214 return mask
214 return mask
215
215
216 reachable = []
216 reachable = []
217 stop_sha1 = []
217 stop_sha1 = []
218 want_sha1 = []
218 want_sha1 = []
219 count = 0
219 count = 0
220
220
221 # figure out which commits they are asking for and which ones they
221 # figure out which commits they are asking for and which ones they
222 # want us to stop on
222 # want us to stop on
223 for i in xrange(len(args)):
223 for i in xrange(len(args)):
224 if args[i].startswith('^'):
224 if args[i].startswith('^'):
225 s = repo.lookup(args[i][1:])
225 s = repo.lookup(args[i][1:])
226 stop_sha1.append(s)
226 stop_sha1.append(s)
227 want_sha1.append(s)
227 want_sha1.append(s)
228 elif args[i] != 'HEAD':
228 elif args[i] != 'HEAD':
229 want_sha1.append(repo.lookup(args[i]))
229 want_sha1.append(repo.lookup(args[i]))
230
230
231 # calculate the graph for the supplied commits
231 # calculate the graph for the supplied commits
232 for i in xrange(len(want_sha1)):
232 for i in xrange(len(want_sha1)):
233 reachable.append({});
233 reachable.append({});
234 n = want_sha1[i];
234 n = want_sha1[i];
235 visit = [n];
235 visit = [n];
236 reachable[i][n] = 1
236 reachable[i][n] = 1
237 while visit:
237 while visit:
238 n = visit.pop(0)
238 n = visit.pop(0)
239 if n in stop_sha1:
239 if n in stop_sha1:
240 continue
240 continue
241 for p in repo.changelog.parents(n):
241 for p in repo.changelog.parents(n):
242 if p not in reachable[i]:
242 if p not in reachable[i]:
243 reachable[i][p] = 1
243 reachable[i][p] = 1
244 visit.append(p)
244 visit.append(p)
245 if p in stop_sha1:
245 if p in stop_sha1:
246 continue
246 continue
247
247
248 # walk the repository looking for commits that are in our
248 # walk the repository looking for commits that are in our
249 # reachability graph
249 # reachability graph
250 for i, ctx in chlogwalk():
250 for i, ctx in chlogwalk():
251 n = repo.changelog.node(i)
251 n = repo.changelog.node(i)
252 mask = is_reachable(want_sha1, reachable, n)
252 mask = is_reachable(want_sha1, reachable, n)
253 if mask:
253 if mask:
254 parentstr = ""
254 parentstr = ""
255 if parents:
255 if parents:
256 pp = repo.changelog.parents(n)
256 pp = repo.changelog.parents(n)
257 if pp[0] != nullid:
257 if pp[0] != nullid:
258 parentstr += " " + short(pp[0])
258 parentstr += " " + short(pp[0])
259 if pp[1] != nullid:
259 if pp[1] != nullid:
260 parentstr += " " + short(pp[1])
260 parentstr += " " + short(pp[1])
261 if not full:
261 if not full:
262 ui.write("%s%s\n" % (short(n), parentstr))
262 ui.write("%s%s\n" % (short(n), parentstr))
263 elif full == "commit":
263 elif full == "commit":
264 ui.write("%s%s\n" % (short(n), parentstr))
264 ui.write("%s%s\n" % (short(n), parentstr))
265 catcommit(ui, repo, n, ' ', ctx)
265 catcommit(ui, repo, n, ' ', ctx)
266 else:
266 else:
267 (p1, p2) = repo.changelog.parents(n)
267 (p1, p2) = repo.changelog.parents(n)
268 (h, h1, h2) = map(short, (n, p1, p2))
268 (h, h1, h2) = map(short, (n, p1, p2))
269 (i1, i2) = map(repo.changelog.rev, (p1, p2))
269 (i1, i2) = map(repo.changelog.rev, (p1, p2))
270
270
271 date = ctx.date()[0]
271 date = ctx.date()[0]
272 ui.write("%s %s:%s" % (date, h, mask))
272 ui.write("%s %s:%s" % (date, h, mask))
273 mask = is_reachable(want_sha1, reachable, p1)
273 mask = is_reachable(want_sha1, reachable, p1)
274 if i1 != nullrev and mask > 0:
274 if i1 != nullrev and mask > 0:
275 ui.write("%s:%s " % (h1, mask)),
275 ui.write("%s:%s " % (h1, mask)),
276 mask = is_reachable(want_sha1, reachable, p2)
276 mask = is_reachable(want_sha1, reachable, p2)
277 if i2 != nullrev and mask > 0:
277 if i2 != nullrev and mask > 0:
278 ui.write("%s:%s " % (h2, mask))
278 ui.write("%s:%s " % (h2, mask))
279 ui.write("\n")
279 ui.write("\n")
280 if maxnr and count >= maxnr:
280 if maxnr and count >= maxnr:
281 break
281 break
282 count += 1
282 count += 1
283
283
284 def revparse(ui, repo, *revs, **opts):
284 def revparse(ui, repo, *revs, **opts):
285 """parse given revisions"""
285 """parse given revisions"""
286 def revstr(rev):
286 def revstr(rev):
287 if rev == 'HEAD':
287 if rev == 'HEAD':
288 rev = 'tip'
288 rev = 'tip'
289 return revlog.hex(repo.lookup(rev))
289 return revlog.hex(repo.lookup(rev))
290
290
291 for r in revs:
291 for r in revs:
292 revrange = r.split(':', 1)
292 revrange = r.split(':', 1)
293 ui.write('%s\n' % revstr(revrange[0]))
293 ui.write('%s\n' % revstr(revrange[0]))
294 if len(revrange) == 2:
294 if len(revrange) == 2:
295 ui.write('^%s\n' % revstr(revrange[1]))
295 ui.write('^%s\n' % revstr(revrange[1]))
296
296
297 # git rev-list tries to order things by date, and has the ability to stop
297 # git rev-list tries to order things by date, and has the ability to stop
298 # at a given commit without walking the whole repo. TODO add the stop
298 # at a given commit without walking the whole repo. TODO add the stop
299 # parameter
299 # parameter
300 def revlist(ui, repo, *revs, **opts):
300 def revlist(ui, repo, *revs, **opts):
301 """print revisions"""
301 """print revisions"""
302 if opts['header']:
302 if opts['header']:
303 full = "commit"
303 full = "commit"
304 else:
304 else:
305 full = None
305 full = None
306 copy = [x for x in revs]
306 copy = [x for x in revs]
307 revtree(ui, copy, repo, full, opts['max_count'], opts['parents'])
307 revtree(ui, copy, repo, full, opts['max_count'], opts['parents'])
308
308
309 def config(ui, repo, **opts):
309 def config(ui, repo, **opts):
310 """print extension options"""
310 """print extension options"""
311 def writeopt(name, value):
311 def writeopt(name, value):
312 ui.write('k=%s\nv=%s\n' % (name, value))
312 ui.write('k=%s\nv=%s\n' % (name, value))
313
313
314 writeopt('vdiff', ui.config('hgk', 'vdiff', ''))
314 writeopt('vdiff', ui.config('hgk', 'vdiff', ''))
315
315
316
316
317 def view(ui, repo, *etc, **opts):
317 def view(ui, repo, *etc, **opts):
318 "start interactive history viewer"
318 "start interactive history viewer"
319 os.chdir(repo.root)
319 os.chdir(repo.root)
320 optstr = ' '.join(['--%s %s' % (k, v) for k, v in opts.iteritems() if v])
320 optstr = ' '.join(['--%s %s' % (k, v) for k, v in opts.iteritems() if v])
321 cmd = ui.config("hgk", "path", "hgk") + " %s %s" % (optstr, " ".join(etc))
321 cmd = ui.config("hgk", "path", "hgk") + " %s %s" % (optstr, " ".join(etc))
322 ui.debug(_("running %s\n") % cmd)
322 ui.debug(_("running %s\n") % cmd)
323 util.system(cmd)
323 util.system(cmd)
324
324
325 cmdtable = {
325 cmdtable = {
326 "^view":
326 "^view":
327 (view,
327 (view,
328 [('l', 'limit', '', _('limit number of changes displayed'))],
328 [('l', 'limit', '', _('limit number of changes displayed'))],
329 _('hg view [-l LIMIT] [REVRANGE]')),
329 _('hg view [-l LIMIT] [REVRANGE]')),
330 "debug-diff-tree":
330 "debug-diff-tree":
331 (difftree,
331 (difftree,
332 [('p', 'patch', None, _('generate patch')),
332 [('p', 'patch', None, _('generate patch')),
333 ('r', 'recursive', None, _('recursive')),
333 ('r', 'recursive', None, _('recursive')),
334 ('P', 'pretty', None, _('pretty')),
334 ('P', 'pretty', None, _('pretty')),
335 ('s', 'stdin', None, _('stdin')),
335 ('s', 'stdin', None, _('stdin')),
336 ('C', 'copy', None, _('detect copies')),
336 ('C', 'copy', None, _('detect copies')),
337 ('S', 'search', "", _('search'))],
337 ('S', 'search', "", _('search'))],
338 _('hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]...')),
338 _('hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]...')),
339 "debug-cat-file":
339 "debug-cat-file":
340 (catfile,
340 (catfile,
341 [('s', 'stdin', None, _('stdin'))],
341 [('s', 'stdin', None, _('stdin'))],
342 _('hg debug-cat-file [OPTION]... TYPE FILE')),
342 _('hg debug-cat-file [OPTION]... TYPE FILE')),
343 "debug-config":
343 "debug-config":
344 (config, [], _('hg debug-config')),
344 (config, [], _('hg debug-config')),
345 "debug-merge-base":
345 "debug-merge-base":
346 (base, [], _('hg debug-merge-base node node')),
346 (base, [], _('hg debug-merge-base node node')),
347 "debug-rev-parse":
347 "debug-rev-parse":
348 (revparse,
348 (revparse,
349 [('', 'default', '', _('ignored'))],
349 [('', 'default', '', _('ignored'))],
350 _('hg debug-rev-parse REV')),
350 _('hg debug-rev-parse REV')),
351 "debug-rev-list":
351 "debug-rev-list":
352 (revlist,
352 (revlist,
353 [('H', 'header', None, _('header')),
353 [('H', 'header', None, _('header')),
354 ('t', 'topo-order', None, _('topo-order')),
354 ('t', 'topo-order', None, _('topo-order')),
355 ('p', 'parents', None, _('parents')),
355 ('p', 'parents', None, _('parents')),
356 ('n', 'max-count', 0, _('max-count'))],
356 ('n', 'max-count', 0, _('max-count'))],
357 _('hg debug-rev-list [options] revs')),
357 _('hg debug-rev-list [options] revs')),
358 }
358 }
General Comments 0
You need to be logged in to leave comments. Login now