##// END OF EJS Templates
merge: add --tool argument to merge and resolve...
Steve Borho -
r12750:05bd2658 default
parent child Browse files
Show More
@@ -1,4460 +1,4482 b''
1 # commands.py - command processing for mercurial
1 # commands.py - command processing for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from node import hex, nullid, nullrev, short
8 from node import hex, nullid, nullrev, short
9 from lock import release
9 from lock import release
10 from i18n import _, gettext
10 from i18n import _, gettext
11 import os, re, sys, difflib, time, tempfile
11 import os, re, sys, difflib, time, tempfile
12 import hg, util, revlog, extensions, copies, error
12 import hg, util, revlog, extensions, copies, error
13 import patch, help, mdiff, url, encoding, templatekw, discovery
13 import patch, help, mdiff, url, encoding, templatekw, discovery
14 import archival, changegroup, cmdutil, sshserver, hbisect, hgweb, hgweb.server
14 import archival, changegroup, cmdutil, sshserver, hbisect, hgweb, hgweb.server
15 import merge as mergemod
15 import merge as mergemod
16 import minirst, revset
16 import minirst, revset
17 import dagparser
17 import dagparser
18
18
19 # Commands start here, listed alphabetically
19 # Commands start here, listed alphabetically
20
20
21 def add(ui, repo, *pats, **opts):
21 def add(ui, repo, *pats, **opts):
22 """add the specified files on the next commit
22 """add the specified files on the next commit
23
23
24 Schedule files to be version controlled and added to the
24 Schedule files to be version controlled and added to the
25 repository.
25 repository.
26
26
27 The files will be added to the repository at the next commit. To
27 The files will be added to the repository at the next commit. To
28 undo an add before that, see :hg:`forget`.
28 undo an add before that, see :hg:`forget`.
29
29
30 If no names are given, add all files to the repository.
30 If no names are given, add all files to the repository.
31
31
32 .. container:: verbose
32 .. container:: verbose
33
33
34 An example showing how new (unknown) files are added
34 An example showing how new (unknown) files are added
35 automatically by :hg:`add`::
35 automatically by :hg:`add`::
36
36
37 $ ls
37 $ ls
38 foo.c
38 foo.c
39 $ hg status
39 $ hg status
40 ? foo.c
40 ? foo.c
41 $ hg add
41 $ hg add
42 adding foo.c
42 adding foo.c
43 $ hg status
43 $ hg status
44 A foo.c
44 A foo.c
45
45
46 Returns 0 if all files are successfully added.
46 Returns 0 if all files are successfully added.
47 """
47 """
48
48
49 m = cmdutil.match(repo, pats, opts)
49 m = cmdutil.match(repo, pats, opts)
50 rejected = cmdutil.add(ui, repo, m, opts.get('dry_run'),
50 rejected = cmdutil.add(ui, repo, m, opts.get('dry_run'),
51 opts.get('subrepos'), prefix="")
51 opts.get('subrepos'), prefix="")
52 return rejected and 1 or 0
52 return rejected and 1 or 0
53
53
54 def addremove(ui, repo, *pats, **opts):
54 def addremove(ui, repo, *pats, **opts):
55 """add all new files, delete all missing files
55 """add all new files, delete all missing files
56
56
57 Add all new files and remove all missing files from the
57 Add all new files and remove all missing files from the
58 repository.
58 repository.
59
59
60 New files are ignored if they match any of the patterns in
60 New files are ignored if they match any of the patterns in
61 .hgignore. As with add, these changes take effect at the next
61 .hgignore. As with add, these changes take effect at the next
62 commit.
62 commit.
63
63
64 Use the -s/--similarity option to detect renamed files. With a
64 Use the -s/--similarity option to detect renamed files. With a
65 parameter greater than 0, this compares every removed file with
65 parameter greater than 0, this compares every removed file with
66 every added file and records those similar enough as renames. This
66 every added file and records those similar enough as renames. This
67 option takes a percentage between 0 (disabled) and 100 (files must
67 option takes a percentage between 0 (disabled) and 100 (files must
68 be identical) as its parameter. Detecting renamed files this way
68 be identical) as its parameter. Detecting renamed files this way
69 can be expensive. After using this option, :hg:`status -C` can be
69 can be expensive. After using this option, :hg:`status -C` can be
70 used to check which files were identified as moved or renamed.
70 used to check which files were identified as moved or renamed.
71
71
72 Returns 0 if all files are successfully added.
72 Returns 0 if all files are successfully added.
73 """
73 """
74 try:
74 try:
75 sim = float(opts.get('similarity') or 100)
75 sim = float(opts.get('similarity') or 100)
76 except ValueError:
76 except ValueError:
77 raise util.Abort(_('similarity must be a number'))
77 raise util.Abort(_('similarity must be a number'))
78 if sim < 0 or sim > 100:
78 if sim < 0 or sim > 100:
79 raise util.Abort(_('similarity must be between 0 and 100'))
79 raise util.Abort(_('similarity must be between 0 and 100'))
80 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
80 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
81
81
82 def annotate(ui, repo, *pats, **opts):
82 def annotate(ui, repo, *pats, **opts):
83 """show changeset information by line for each file
83 """show changeset information by line for each file
84
84
85 List changes in files, showing the revision id responsible for
85 List changes in files, showing the revision id responsible for
86 each line
86 each line
87
87
88 This command is useful for discovering when a change was made and
88 This command is useful for discovering when a change was made and
89 by whom.
89 by whom.
90
90
91 Without the -a/--text option, annotate will avoid processing files
91 Without the -a/--text option, annotate will avoid processing files
92 it detects as binary. With -a, annotate will annotate the file
92 it detects as binary. With -a, annotate will annotate the file
93 anyway, although the results will probably be neither useful
93 anyway, although the results will probably be neither useful
94 nor desirable.
94 nor desirable.
95
95
96 Returns 0 on success.
96 Returns 0 on success.
97 """
97 """
98 if opts.get('follow'):
98 if opts.get('follow'):
99 # --follow is deprecated and now just an alias for -f/--file
99 # --follow is deprecated and now just an alias for -f/--file
100 # to mimic the behavior of Mercurial before version 1.5
100 # to mimic the behavior of Mercurial before version 1.5
101 opts['file'] = 1
101 opts['file'] = 1
102
102
103 datefunc = ui.quiet and util.shortdate or util.datestr
103 datefunc = ui.quiet and util.shortdate or util.datestr
104 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
104 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
105
105
106 if not pats:
106 if not pats:
107 raise util.Abort(_('at least one filename or pattern is required'))
107 raise util.Abort(_('at least one filename or pattern is required'))
108
108
109 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
109 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
110 ('number', lambda x: str(x[0].rev())),
110 ('number', lambda x: str(x[0].rev())),
111 ('changeset', lambda x: short(x[0].node())),
111 ('changeset', lambda x: short(x[0].node())),
112 ('date', getdate),
112 ('date', getdate),
113 ('file', lambda x: x[0].path()),
113 ('file', lambda x: x[0].path()),
114 ]
114 ]
115
115
116 if (not opts.get('user') and not opts.get('changeset')
116 if (not opts.get('user') and not opts.get('changeset')
117 and not opts.get('date') and not opts.get('file')):
117 and not opts.get('date') and not opts.get('file')):
118 opts['number'] = 1
118 opts['number'] = 1
119
119
120 linenumber = opts.get('line_number') is not None
120 linenumber = opts.get('line_number') is not None
121 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
121 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
122 raise util.Abort(_('at least one of -n/-c is required for -l'))
122 raise util.Abort(_('at least one of -n/-c is required for -l'))
123
123
124 funcmap = [func for op, func in opmap if opts.get(op)]
124 funcmap = [func for op, func in opmap if opts.get(op)]
125 if linenumber:
125 if linenumber:
126 lastfunc = funcmap[-1]
126 lastfunc = funcmap[-1]
127 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
127 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
128
128
129 ctx = repo[opts.get('rev')]
129 ctx = repo[opts.get('rev')]
130 m = cmdutil.match(repo, pats, opts)
130 m = cmdutil.match(repo, pats, opts)
131 follow = not opts.get('no_follow')
131 follow = not opts.get('no_follow')
132 for abs in ctx.walk(m):
132 for abs in ctx.walk(m):
133 fctx = ctx[abs]
133 fctx = ctx[abs]
134 if not opts.get('text') and util.binary(fctx.data()):
134 if not opts.get('text') and util.binary(fctx.data()):
135 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
135 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
136 continue
136 continue
137
137
138 lines = fctx.annotate(follow=follow, linenumber=linenumber)
138 lines = fctx.annotate(follow=follow, linenumber=linenumber)
139 pieces = []
139 pieces = []
140
140
141 for f in funcmap:
141 for f in funcmap:
142 l = [f(n) for n, dummy in lines]
142 l = [f(n) for n, dummy in lines]
143 if l:
143 if l:
144 sized = [(x, encoding.colwidth(x)) for x in l]
144 sized = [(x, encoding.colwidth(x)) for x in l]
145 ml = max([w for x, w in sized])
145 ml = max([w for x, w in sized])
146 pieces.append(["%s%s" % (' ' * (ml - w), x) for x, w in sized])
146 pieces.append(["%s%s" % (' ' * (ml - w), x) for x, w in sized])
147
147
148 if pieces:
148 if pieces:
149 for p, l in zip(zip(*pieces), lines):
149 for p, l in zip(zip(*pieces), lines):
150 ui.write("%s: %s" % (" ".join(p), l[1]))
150 ui.write("%s: %s" % (" ".join(p), l[1]))
151
151
152 def archive(ui, repo, dest, **opts):
152 def archive(ui, repo, dest, **opts):
153 '''create an unversioned archive of a repository revision
153 '''create an unversioned archive of a repository revision
154
154
155 By default, the revision used is the parent of the working
155 By default, the revision used is the parent of the working
156 directory; use -r/--rev to specify a different revision.
156 directory; use -r/--rev to specify a different revision.
157
157
158 The archive type is automatically detected based on file
158 The archive type is automatically detected based on file
159 extension (or override using -t/--type).
159 extension (or override using -t/--type).
160
160
161 Valid types are:
161 Valid types are:
162
162
163 :``files``: a directory full of files (default)
163 :``files``: a directory full of files (default)
164 :``tar``: tar archive, uncompressed
164 :``tar``: tar archive, uncompressed
165 :``tbz2``: tar archive, compressed using bzip2
165 :``tbz2``: tar archive, compressed using bzip2
166 :``tgz``: tar archive, compressed using gzip
166 :``tgz``: tar archive, compressed using gzip
167 :``uzip``: zip archive, uncompressed
167 :``uzip``: zip archive, uncompressed
168 :``zip``: zip archive, compressed using deflate
168 :``zip``: zip archive, compressed using deflate
169
169
170 The exact name of the destination archive or directory is given
170 The exact name of the destination archive or directory is given
171 using a format string; see :hg:`help export` for details.
171 using a format string; see :hg:`help export` for details.
172
172
173 Each member added to an archive file has a directory prefix
173 Each member added to an archive file has a directory prefix
174 prepended. Use -p/--prefix to specify a format string for the
174 prepended. Use -p/--prefix to specify a format string for the
175 prefix. The default is the basename of the archive, with suffixes
175 prefix. The default is the basename of the archive, with suffixes
176 removed.
176 removed.
177
177
178 Returns 0 on success.
178 Returns 0 on success.
179 '''
179 '''
180
180
181 ctx = repo[opts.get('rev')]
181 ctx = repo[opts.get('rev')]
182 if not ctx:
182 if not ctx:
183 raise util.Abort(_('no working directory: please specify a revision'))
183 raise util.Abort(_('no working directory: please specify a revision'))
184 node = ctx.node()
184 node = ctx.node()
185 dest = cmdutil.make_filename(repo, dest, node)
185 dest = cmdutil.make_filename(repo, dest, node)
186 if os.path.realpath(dest) == repo.root:
186 if os.path.realpath(dest) == repo.root:
187 raise util.Abort(_('repository root cannot be destination'))
187 raise util.Abort(_('repository root cannot be destination'))
188
188
189 kind = opts.get('type') or archival.guesskind(dest) or 'files'
189 kind = opts.get('type') or archival.guesskind(dest) or 'files'
190 prefix = opts.get('prefix')
190 prefix = opts.get('prefix')
191
191
192 if dest == '-':
192 if dest == '-':
193 if kind == 'files':
193 if kind == 'files':
194 raise util.Abort(_('cannot archive plain files to stdout'))
194 raise util.Abort(_('cannot archive plain files to stdout'))
195 dest = sys.stdout
195 dest = sys.stdout
196 if not prefix:
196 if not prefix:
197 prefix = os.path.basename(repo.root) + '-%h'
197 prefix = os.path.basename(repo.root) + '-%h'
198
198
199 prefix = cmdutil.make_filename(repo, prefix, node)
199 prefix = cmdutil.make_filename(repo, prefix, node)
200 matchfn = cmdutil.match(repo, [], opts)
200 matchfn = cmdutil.match(repo, [], opts)
201 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
201 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
202 matchfn, prefix, subrepos=opts.get('subrepos'))
202 matchfn, prefix, subrepos=opts.get('subrepos'))
203
203
204 def backout(ui, repo, node=None, rev=None, **opts):
204 def backout(ui, repo, node=None, rev=None, **opts):
205 '''reverse effect of earlier changeset
205 '''reverse effect of earlier changeset
206
206
207 The backout command merges the reverse effect of the reverted
207 The backout command merges the reverse effect of the reverted
208 changeset into the working directory.
208 changeset into the working directory.
209
209
210 With the --merge option, it first commits the reverted changes
210 With the --merge option, it first commits the reverted changes
211 as a new changeset. This new changeset is a child of the reverted
211 as a new changeset. This new changeset is a child of the reverted
212 changeset.
212 changeset.
213 The --merge option remembers the parent of the working directory
213 The --merge option remembers the parent of the working directory
214 before starting the backout, then merges the new head with that
214 before starting the backout, then merges the new head with that
215 changeset afterwards.
215 changeset afterwards.
216 This will result in an explicit merge in the history.
216 This will result in an explicit merge in the history.
217
217
218 If you backout a changeset other than the original parent of the
218 If you backout a changeset other than the original parent of the
219 working directory, the result of this merge is not committed,
219 working directory, the result of this merge is not committed,
220 as with a normal merge. Otherwise, no merge is needed and the
220 as with a normal merge. Otherwise, no merge is needed and the
221 commit is automatic.
221 commit is automatic.
222
222
223 Note that the default behavior (without --merge) has changed in
223 Note that the default behavior (without --merge) has changed in
224 version 1.7. To restore the previous default behavior, use
224 version 1.7. To restore the previous default behavior, use
225 :hg:`backout --merge` and then :hg:`update --clean .` to get rid of
225 :hg:`backout --merge` and then :hg:`update --clean .` to get rid of
226 the ongoing merge.
226 the ongoing merge.
227
227
228 See :hg:`help dates` for a list of formats valid for -d/--date.
228 See :hg:`help dates` for a list of formats valid for -d/--date.
229
229
230 Returns 0 on success.
230 Returns 0 on success.
231 '''
231 '''
232 if rev and node:
232 if rev and node:
233 raise util.Abort(_("please specify just one revision"))
233 raise util.Abort(_("please specify just one revision"))
234
234
235 if not rev:
235 if not rev:
236 rev = node
236 rev = node
237
237
238 if not rev:
238 if not rev:
239 raise util.Abort(_("please specify a revision to backout"))
239 raise util.Abort(_("please specify a revision to backout"))
240
240
241 date = opts.get('date')
241 date = opts.get('date')
242 if date:
242 if date:
243 opts['date'] = util.parsedate(date)
243 opts['date'] = util.parsedate(date)
244
244
245 cmdutil.bail_if_changed(repo)
245 cmdutil.bail_if_changed(repo)
246 node = repo.lookup(rev)
246 node = repo.lookup(rev)
247
247
248 op1, op2 = repo.dirstate.parents()
248 op1, op2 = repo.dirstate.parents()
249 a = repo.changelog.ancestor(op1, node)
249 a = repo.changelog.ancestor(op1, node)
250 if a != node:
250 if a != node:
251 raise util.Abort(_('cannot backout change on a different branch'))
251 raise util.Abort(_('cannot backout change on a different branch'))
252
252
253 p1, p2 = repo.changelog.parents(node)
253 p1, p2 = repo.changelog.parents(node)
254 if p1 == nullid:
254 if p1 == nullid:
255 raise util.Abort(_('cannot backout a change with no parents'))
255 raise util.Abort(_('cannot backout a change with no parents'))
256 if p2 != nullid:
256 if p2 != nullid:
257 if not opts.get('parent'):
257 if not opts.get('parent'):
258 raise util.Abort(_('cannot backout a merge changeset without '
258 raise util.Abort(_('cannot backout a merge changeset without '
259 '--parent'))
259 '--parent'))
260 p = repo.lookup(opts['parent'])
260 p = repo.lookup(opts['parent'])
261 if p not in (p1, p2):
261 if p not in (p1, p2):
262 raise util.Abort(_('%s is not a parent of %s') %
262 raise util.Abort(_('%s is not a parent of %s') %
263 (short(p), short(node)))
263 (short(p), short(node)))
264 parent = p
264 parent = p
265 else:
265 else:
266 if opts.get('parent'):
266 if opts.get('parent'):
267 raise util.Abort(_('cannot use --parent on non-merge changeset'))
267 raise util.Abort(_('cannot use --parent on non-merge changeset'))
268 parent = p1
268 parent = p1
269
269
270 # the backout should appear on the same branch
270 # the backout should appear on the same branch
271 branch = repo.dirstate.branch()
271 branch = repo.dirstate.branch()
272 hg.clean(repo, node, show_stats=False)
272 hg.clean(repo, node, show_stats=False)
273 repo.dirstate.setbranch(branch)
273 repo.dirstate.setbranch(branch)
274 revert_opts = opts.copy()
274 revert_opts = opts.copy()
275 revert_opts['date'] = None
275 revert_opts['date'] = None
276 revert_opts['all'] = True
276 revert_opts['all'] = True
277 revert_opts['rev'] = hex(parent)
277 revert_opts['rev'] = hex(parent)
278 revert_opts['no_backup'] = None
278 revert_opts['no_backup'] = None
279 revert(ui, repo, **revert_opts)
279 revert(ui, repo, **revert_opts)
280 if not opts.get('merge') and op1 != node:
280 if not opts.get('merge') and op1 != node:
281 return hg.update(repo, op1)
281 return hg.update(repo, op1)
282
282
283 commit_opts = opts.copy()
283 commit_opts = opts.copy()
284 commit_opts['addremove'] = False
284 commit_opts['addremove'] = False
285 if not commit_opts['message'] and not commit_opts['logfile']:
285 if not commit_opts['message'] and not commit_opts['logfile']:
286 # we don't translate commit messages
286 # we don't translate commit messages
287 commit_opts['message'] = "Backed out changeset %s" % short(node)
287 commit_opts['message'] = "Backed out changeset %s" % short(node)
288 commit_opts['force_editor'] = True
288 commit_opts['force_editor'] = True
289 commit(ui, repo, **commit_opts)
289 commit(ui, repo, **commit_opts)
290 def nice(node):
290 def nice(node):
291 return '%d:%s' % (repo.changelog.rev(node), short(node))
291 return '%d:%s' % (repo.changelog.rev(node), short(node))
292 ui.status(_('changeset %s backs out changeset %s\n') %
292 ui.status(_('changeset %s backs out changeset %s\n') %
293 (nice(repo.changelog.tip()), nice(node)))
293 (nice(repo.changelog.tip()), nice(node)))
294 if opts.get('merge') and op1 != node:
294 if opts.get('merge') and op1 != node:
295 hg.clean(repo, op1, show_stats=False)
295 hg.clean(repo, op1, show_stats=False)
296 ui.status(_('merging with changeset %s\n')
296 ui.status(_('merging with changeset %s\n')
297 % nice(repo.changelog.tip()))
297 % nice(repo.changelog.tip()))
298 return hg.merge(repo, hex(repo.changelog.tip()))
298 return hg.merge(repo, hex(repo.changelog.tip()))
299 return 0
299 return 0
300
300
301 def bisect(ui, repo, rev=None, extra=None, command=None,
301 def bisect(ui, repo, rev=None, extra=None, command=None,
302 reset=None, good=None, bad=None, skip=None, noupdate=None):
302 reset=None, good=None, bad=None, skip=None, noupdate=None):
303 """subdivision search of changesets
303 """subdivision search of changesets
304
304
305 This command helps to find changesets which introduce problems. To
305 This command helps to find changesets which introduce problems. To
306 use, mark the earliest changeset you know exhibits the problem as
306 use, mark the earliest changeset you know exhibits the problem as
307 bad, then mark the latest changeset which is free from the problem
307 bad, then mark the latest changeset which is free from the problem
308 as good. Bisect will update your working directory to a revision
308 as good. Bisect will update your working directory to a revision
309 for testing (unless the -U/--noupdate option is specified). Once
309 for testing (unless the -U/--noupdate option is specified). Once
310 you have performed tests, mark the working directory as good or
310 you have performed tests, mark the working directory as good or
311 bad, and bisect will either update to another candidate changeset
311 bad, and bisect will either update to another candidate changeset
312 or announce that it has found the bad revision.
312 or announce that it has found the bad revision.
313
313
314 As a shortcut, you can also use the revision argument to mark a
314 As a shortcut, you can also use the revision argument to mark a
315 revision as good or bad without checking it out first.
315 revision as good or bad without checking it out first.
316
316
317 If you supply a command, it will be used for automatic bisection.
317 If you supply a command, it will be used for automatic bisection.
318 Its exit status will be used to mark revisions as good or bad:
318 Its exit status will be used to mark revisions as good or bad:
319 status 0 means good, 125 means to skip the revision, 127
319 status 0 means good, 125 means to skip the revision, 127
320 (command not found) will abort the bisection, and any other
320 (command not found) will abort the bisection, and any other
321 non-zero exit status means the revision is bad.
321 non-zero exit status means the revision is bad.
322
322
323 Returns 0 on success.
323 Returns 0 on success.
324 """
324 """
325 def print_result(nodes, good):
325 def print_result(nodes, good):
326 displayer = cmdutil.show_changeset(ui, repo, {})
326 displayer = cmdutil.show_changeset(ui, repo, {})
327 if len(nodes) == 1:
327 if len(nodes) == 1:
328 # narrowed it down to a single revision
328 # narrowed it down to a single revision
329 if good:
329 if good:
330 ui.write(_("The first good revision is:\n"))
330 ui.write(_("The first good revision is:\n"))
331 else:
331 else:
332 ui.write(_("The first bad revision is:\n"))
332 ui.write(_("The first bad revision is:\n"))
333 displayer.show(repo[nodes[0]])
333 displayer.show(repo[nodes[0]])
334 parents = repo[nodes[0]].parents()
334 parents = repo[nodes[0]].parents()
335 if len(parents) > 1:
335 if len(parents) > 1:
336 side = good and state['bad'] or state['good']
336 side = good and state['bad'] or state['good']
337 num = len(set(i.node() for i in parents) & set(side))
337 num = len(set(i.node() for i in parents) & set(side))
338 if num == 1:
338 if num == 1:
339 common = parents[0].ancestor(parents[1])
339 common = parents[0].ancestor(parents[1])
340 ui.write(_('Not all ancestors of this changeset have been'
340 ui.write(_('Not all ancestors of this changeset have been'
341 ' checked.\nTo check the other ancestors, start'
341 ' checked.\nTo check the other ancestors, start'
342 ' from the common ancestor, %s.\n' % common))
342 ' from the common ancestor, %s.\n' % common))
343 else:
343 else:
344 # multiple possible revisions
344 # multiple possible revisions
345 if good:
345 if good:
346 ui.write(_("Due to skipped revisions, the first "
346 ui.write(_("Due to skipped revisions, the first "
347 "good revision could be any of:\n"))
347 "good revision could be any of:\n"))
348 else:
348 else:
349 ui.write(_("Due to skipped revisions, the first "
349 ui.write(_("Due to skipped revisions, the first "
350 "bad revision could be any of:\n"))
350 "bad revision could be any of:\n"))
351 for n in nodes:
351 for n in nodes:
352 displayer.show(repo[n])
352 displayer.show(repo[n])
353 displayer.close()
353 displayer.close()
354
354
355 def check_state(state, interactive=True):
355 def check_state(state, interactive=True):
356 if not state['good'] or not state['bad']:
356 if not state['good'] or not state['bad']:
357 if (good or bad or skip or reset) and interactive:
357 if (good or bad or skip or reset) and interactive:
358 return
358 return
359 if not state['good']:
359 if not state['good']:
360 raise util.Abort(_('cannot bisect (no known good revisions)'))
360 raise util.Abort(_('cannot bisect (no known good revisions)'))
361 else:
361 else:
362 raise util.Abort(_('cannot bisect (no known bad revisions)'))
362 raise util.Abort(_('cannot bisect (no known bad revisions)'))
363 return True
363 return True
364
364
365 # backward compatibility
365 # backward compatibility
366 if rev in "good bad reset init".split():
366 if rev in "good bad reset init".split():
367 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
367 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
368 cmd, rev, extra = rev, extra, None
368 cmd, rev, extra = rev, extra, None
369 if cmd == "good":
369 if cmd == "good":
370 good = True
370 good = True
371 elif cmd == "bad":
371 elif cmd == "bad":
372 bad = True
372 bad = True
373 else:
373 else:
374 reset = True
374 reset = True
375 elif extra or good + bad + skip + reset + bool(command) > 1:
375 elif extra or good + bad + skip + reset + bool(command) > 1:
376 raise util.Abort(_('incompatible arguments'))
376 raise util.Abort(_('incompatible arguments'))
377
377
378 if reset:
378 if reset:
379 p = repo.join("bisect.state")
379 p = repo.join("bisect.state")
380 if os.path.exists(p):
380 if os.path.exists(p):
381 os.unlink(p)
381 os.unlink(p)
382 return
382 return
383
383
384 state = hbisect.load_state(repo)
384 state = hbisect.load_state(repo)
385
385
386 if command:
386 if command:
387 changesets = 1
387 changesets = 1
388 try:
388 try:
389 while changesets:
389 while changesets:
390 # update state
390 # update state
391 status = util.system(command)
391 status = util.system(command)
392 if status == 125:
392 if status == 125:
393 transition = "skip"
393 transition = "skip"
394 elif status == 0:
394 elif status == 0:
395 transition = "good"
395 transition = "good"
396 # status < 0 means process was killed
396 # status < 0 means process was killed
397 elif status == 127:
397 elif status == 127:
398 raise util.Abort(_("failed to execute %s") % command)
398 raise util.Abort(_("failed to execute %s") % command)
399 elif status < 0:
399 elif status < 0:
400 raise util.Abort(_("%s killed") % command)
400 raise util.Abort(_("%s killed") % command)
401 else:
401 else:
402 transition = "bad"
402 transition = "bad"
403 ctx = repo[rev or '.']
403 ctx = repo[rev or '.']
404 state[transition].append(ctx.node())
404 state[transition].append(ctx.node())
405 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
405 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
406 check_state(state, interactive=False)
406 check_state(state, interactive=False)
407 # bisect
407 # bisect
408 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
408 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
409 # update to next check
409 # update to next check
410 cmdutil.bail_if_changed(repo)
410 cmdutil.bail_if_changed(repo)
411 hg.clean(repo, nodes[0], show_stats=False)
411 hg.clean(repo, nodes[0], show_stats=False)
412 finally:
412 finally:
413 hbisect.save_state(repo, state)
413 hbisect.save_state(repo, state)
414 print_result(nodes, good)
414 print_result(nodes, good)
415 return
415 return
416
416
417 # update state
417 # update state
418
418
419 if rev:
419 if rev:
420 nodes = [repo.lookup(i) for i in cmdutil.revrange(repo, [rev])]
420 nodes = [repo.lookup(i) for i in cmdutil.revrange(repo, [rev])]
421 else:
421 else:
422 nodes = [repo.lookup('.')]
422 nodes = [repo.lookup('.')]
423
423
424 if good or bad or skip:
424 if good or bad or skip:
425 if good:
425 if good:
426 state['good'] += nodes
426 state['good'] += nodes
427 elif bad:
427 elif bad:
428 state['bad'] += nodes
428 state['bad'] += nodes
429 elif skip:
429 elif skip:
430 state['skip'] += nodes
430 state['skip'] += nodes
431 hbisect.save_state(repo, state)
431 hbisect.save_state(repo, state)
432
432
433 if not check_state(state):
433 if not check_state(state):
434 return
434 return
435
435
436 # actually bisect
436 # actually bisect
437 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
437 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
438 if changesets == 0:
438 if changesets == 0:
439 print_result(nodes, good)
439 print_result(nodes, good)
440 else:
440 else:
441 assert len(nodes) == 1 # only a single node can be tested next
441 assert len(nodes) == 1 # only a single node can be tested next
442 node = nodes[0]
442 node = nodes[0]
443 # compute the approximate number of remaining tests
443 # compute the approximate number of remaining tests
444 tests, size = 0, 2
444 tests, size = 0, 2
445 while size <= changesets:
445 while size <= changesets:
446 tests, size = tests + 1, size * 2
446 tests, size = tests + 1, size * 2
447 rev = repo.changelog.rev(node)
447 rev = repo.changelog.rev(node)
448 ui.write(_("Testing changeset %d:%s "
448 ui.write(_("Testing changeset %d:%s "
449 "(%d changesets remaining, ~%d tests)\n")
449 "(%d changesets remaining, ~%d tests)\n")
450 % (rev, short(node), changesets, tests))
450 % (rev, short(node), changesets, tests))
451 if not noupdate:
451 if not noupdate:
452 cmdutil.bail_if_changed(repo)
452 cmdutil.bail_if_changed(repo)
453 return hg.clean(repo, node)
453 return hg.clean(repo, node)
454
454
455 def branch(ui, repo, label=None, **opts):
455 def branch(ui, repo, label=None, **opts):
456 """set or show the current branch name
456 """set or show the current branch name
457
457
458 With no argument, show the current branch name. With one argument,
458 With no argument, show the current branch name. With one argument,
459 set the working directory branch name (the branch will not exist
459 set the working directory branch name (the branch will not exist
460 in the repository until the next commit). Standard practice
460 in the repository until the next commit). Standard practice
461 recommends that primary development take place on the 'default'
461 recommends that primary development take place on the 'default'
462 branch.
462 branch.
463
463
464 Unless -f/--force is specified, branch will not let you set a
464 Unless -f/--force is specified, branch will not let you set a
465 branch name that already exists, even if it's inactive.
465 branch name that already exists, even if it's inactive.
466
466
467 Use -C/--clean to reset the working directory branch to that of
467 Use -C/--clean to reset the working directory branch to that of
468 the parent of the working directory, negating a previous branch
468 the parent of the working directory, negating a previous branch
469 change.
469 change.
470
470
471 Use the command :hg:`update` to switch to an existing branch. Use
471 Use the command :hg:`update` to switch to an existing branch. Use
472 :hg:`commit --close-branch` to mark this branch as closed.
472 :hg:`commit --close-branch` to mark this branch as closed.
473
473
474 Returns 0 on success.
474 Returns 0 on success.
475 """
475 """
476
476
477 if opts.get('clean'):
477 if opts.get('clean'):
478 label = repo[None].parents()[0].branch()
478 label = repo[None].parents()[0].branch()
479 repo.dirstate.setbranch(label)
479 repo.dirstate.setbranch(label)
480 ui.status(_('reset working directory to branch %s\n') % label)
480 ui.status(_('reset working directory to branch %s\n') % label)
481 elif label:
481 elif label:
482 utflabel = encoding.fromlocal(label)
482 utflabel = encoding.fromlocal(label)
483 if not opts.get('force') and utflabel in repo.branchtags():
483 if not opts.get('force') and utflabel in repo.branchtags():
484 if label not in [p.branch() for p in repo.parents()]:
484 if label not in [p.branch() for p in repo.parents()]:
485 raise util.Abort(_('a branch of the same name already exists'
485 raise util.Abort(_('a branch of the same name already exists'
486 " (use 'hg update' to switch to it)"))
486 " (use 'hg update' to switch to it)"))
487 repo.dirstate.setbranch(utflabel)
487 repo.dirstate.setbranch(utflabel)
488 ui.status(_('marked working directory as branch %s\n') % label)
488 ui.status(_('marked working directory as branch %s\n') % label)
489 else:
489 else:
490 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
490 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
491
491
492 def branches(ui, repo, active=False, closed=False):
492 def branches(ui, repo, active=False, closed=False):
493 """list repository named branches
493 """list repository named branches
494
494
495 List the repository's named branches, indicating which ones are
495 List the repository's named branches, indicating which ones are
496 inactive. If -c/--closed is specified, also list branches which have
496 inactive. If -c/--closed is specified, also list branches which have
497 been marked closed (see :hg:`commit --close-branch`).
497 been marked closed (see :hg:`commit --close-branch`).
498
498
499 If -a/--active is specified, only show active branches. A branch
499 If -a/--active is specified, only show active branches. A branch
500 is considered active if it contains repository heads.
500 is considered active if it contains repository heads.
501
501
502 Use the command :hg:`update` to switch to an existing branch.
502 Use the command :hg:`update` to switch to an existing branch.
503
503
504 Returns 0.
504 Returns 0.
505 """
505 """
506
506
507 hexfunc = ui.debugflag and hex or short
507 hexfunc = ui.debugflag and hex or short
508 activebranches = [repo[n].branch() for n in repo.heads()]
508 activebranches = [repo[n].branch() for n in repo.heads()]
509 def testactive(tag, node):
509 def testactive(tag, node):
510 realhead = tag in activebranches
510 realhead = tag in activebranches
511 open = node in repo.branchheads(tag, closed=False)
511 open = node in repo.branchheads(tag, closed=False)
512 return realhead and open
512 return realhead and open
513 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
513 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
514 for tag, node in repo.branchtags().items()],
514 for tag, node in repo.branchtags().items()],
515 reverse=True)
515 reverse=True)
516
516
517 for isactive, node, tag in branches:
517 for isactive, node, tag in branches:
518 if (not active) or isactive:
518 if (not active) or isactive:
519 encodedtag = encoding.tolocal(tag)
519 encodedtag = encoding.tolocal(tag)
520 if ui.quiet:
520 if ui.quiet:
521 ui.write("%s\n" % encodedtag)
521 ui.write("%s\n" % encodedtag)
522 else:
522 else:
523 hn = repo.lookup(node)
523 hn = repo.lookup(node)
524 if isactive:
524 if isactive:
525 label = 'branches.active'
525 label = 'branches.active'
526 notice = ''
526 notice = ''
527 elif hn not in repo.branchheads(tag, closed=False):
527 elif hn not in repo.branchheads(tag, closed=False):
528 if not closed:
528 if not closed:
529 continue
529 continue
530 label = 'branches.closed'
530 label = 'branches.closed'
531 notice = _(' (closed)')
531 notice = _(' (closed)')
532 else:
532 else:
533 label = 'branches.inactive'
533 label = 'branches.inactive'
534 notice = _(' (inactive)')
534 notice = _(' (inactive)')
535 if tag == repo.dirstate.branch():
535 if tag == repo.dirstate.branch():
536 label = 'branches.current'
536 label = 'branches.current'
537 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
537 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
538 rev = ui.label('%s:%s' % (rev, hexfunc(hn)), 'log.changeset')
538 rev = ui.label('%s:%s' % (rev, hexfunc(hn)), 'log.changeset')
539 encodedtag = ui.label(encodedtag, label)
539 encodedtag = ui.label(encodedtag, label)
540 ui.write("%s %s%s\n" % (encodedtag, rev, notice))
540 ui.write("%s %s%s\n" % (encodedtag, rev, notice))
541
541
542 def bundle(ui, repo, fname, dest=None, **opts):
542 def bundle(ui, repo, fname, dest=None, **opts):
543 """create a changegroup file
543 """create a changegroup file
544
544
545 Generate a compressed changegroup file collecting changesets not
545 Generate a compressed changegroup file collecting changesets not
546 known to be in another repository.
546 known to be in another repository.
547
547
548 If you omit the destination repository, then hg assumes the
548 If you omit the destination repository, then hg assumes the
549 destination will have all the nodes you specify with --base
549 destination will have all the nodes you specify with --base
550 parameters. To create a bundle containing all changesets, use
550 parameters. To create a bundle containing all changesets, use
551 -a/--all (or --base null).
551 -a/--all (or --base null).
552
552
553 You can change compression method with the -t/--type option.
553 You can change compression method with the -t/--type option.
554 The available compression methods are: none, bzip2, and
554 The available compression methods are: none, bzip2, and
555 gzip (by default, bundles are compressed using bzip2).
555 gzip (by default, bundles are compressed using bzip2).
556
556
557 The bundle file can then be transferred using conventional means
557 The bundle file can then be transferred using conventional means
558 and applied to another repository with the unbundle or pull
558 and applied to another repository with the unbundle or pull
559 command. This is useful when direct push and pull are not
559 command. This is useful when direct push and pull are not
560 available or when exporting an entire repository is undesirable.
560 available or when exporting an entire repository is undesirable.
561
561
562 Applying bundles preserves all changeset contents including
562 Applying bundles preserves all changeset contents including
563 permissions, copy/rename information, and revision history.
563 permissions, copy/rename information, and revision history.
564
564
565 Returns 0 on success, 1 if no changes found.
565 Returns 0 on success, 1 if no changes found.
566 """
566 """
567 revs = opts.get('rev') or None
567 revs = opts.get('rev') or None
568 if opts.get('all'):
568 if opts.get('all'):
569 base = ['null']
569 base = ['null']
570 else:
570 else:
571 base = opts.get('base')
571 base = opts.get('base')
572 if base:
572 if base:
573 if dest:
573 if dest:
574 raise util.Abort(_("--base is incompatible with specifying "
574 raise util.Abort(_("--base is incompatible with specifying "
575 "a destination"))
575 "a destination"))
576 base = [repo.lookup(rev) for rev in base]
576 base = [repo.lookup(rev) for rev in base]
577 # create the right base
577 # create the right base
578 # XXX: nodesbetween / changegroup* should be "fixed" instead
578 # XXX: nodesbetween / changegroup* should be "fixed" instead
579 o = []
579 o = []
580 has = set((nullid,))
580 has = set((nullid,))
581 for n in base:
581 for n in base:
582 has.update(repo.changelog.reachable(n))
582 has.update(repo.changelog.reachable(n))
583 if revs:
583 if revs:
584 revs = [repo.lookup(rev) for rev in revs]
584 revs = [repo.lookup(rev) for rev in revs]
585 visit = revs[:]
585 visit = revs[:]
586 has.difference_update(visit)
586 has.difference_update(visit)
587 else:
587 else:
588 visit = repo.changelog.heads()
588 visit = repo.changelog.heads()
589 seen = {}
589 seen = {}
590 while visit:
590 while visit:
591 n = visit.pop(0)
591 n = visit.pop(0)
592 parents = [p for p in repo.changelog.parents(n) if p not in has]
592 parents = [p for p in repo.changelog.parents(n) if p not in has]
593 if len(parents) == 0:
593 if len(parents) == 0:
594 if n not in has:
594 if n not in has:
595 o.append(n)
595 o.append(n)
596 else:
596 else:
597 for p in parents:
597 for p in parents:
598 if p not in seen:
598 if p not in seen:
599 seen[p] = 1
599 seen[p] = 1
600 visit.append(p)
600 visit.append(p)
601 else:
601 else:
602 dest = ui.expandpath(dest or 'default-push', dest or 'default')
602 dest = ui.expandpath(dest or 'default-push', dest or 'default')
603 dest, branches = hg.parseurl(dest, opts.get('branch'))
603 dest, branches = hg.parseurl(dest, opts.get('branch'))
604 other = hg.repository(hg.remoteui(repo, opts), dest)
604 other = hg.repository(hg.remoteui(repo, opts), dest)
605 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
605 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
606 if revs:
606 if revs:
607 revs = [repo.lookup(rev) for rev in revs]
607 revs = [repo.lookup(rev) for rev in revs]
608 o = discovery.findoutgoing(repo, other, force=opts.get('force'))
608 o = discovery.findoutgoing(repo, other, force=opts.get('force'))
609
609
610 if not o:
610 if not o:
611 ui.status(_("no changes found\n"))
611 ui.status(_("no changes found\n"))
612 return 1
612 return 1
613
613
614 if revs:
614 if revs:
615 cg = repo.changegroupsubset(o, revs, 'bundle')
615 cg = repo.changegroupsubset(o, revs, 'bundle')
616 else:
616 else:
617 cg = repo.changegroup(o, 'bundle')
617 cg = repo.changegroup(o, 'bundle')
618
618
619 bundletype = opts.get('type', 'bzip2').lower()
619 bundletype = opts.get('type', 'bzip2').lower()
620 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
620 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
621 bundletype = btypes.get(bundletype)
621 bundletype = btypes.get(bundletype)
622 if bundletype not in changegroup.bundletypes:
622 if bundletype not in changegroup.bundletypes:
623 raise util.Abort(_('unknown bundle type specified with --type'))
623 raise util.Abort(_('unknown bundle type specified with --type'))
624
624
625 changegroup.writebundle(cg, fname, bundletype)
625 changegroup.writebundle(cg, fname, bundletype)
626
626
627 def cat(ui, repo, file1, *pats, **opts):
627 def cat(ui, repo, file1, *pats, **opts):
628 """output the current or given revision of files
628 """output the current or given revision of files
629
629
630 Print the specified files as they were at the given revision. If
630 Print the specified files as they were at the given revision. If
631 no revision is given, the parent of the working directory is used,
631 no revision is given, the parent of the working directory is used,
632 or tip if no revision is checked out.
632 or tip if no revision is checked out.
633
633
634 Output may be to a file, in which case the name of the file is
634 Output may be to a file, in which case the name of the file is
635 given using a format string. The formatting rules are the same as
635 given using a format string. The formatting rules are the same as
636 for the export command, with the following additions:
636 for the export command, with the following additions:
637
637
638 :``%s``: basename of file being printed
638 :``%s``: basename of file being printed
639 :``%d``: dirname of file being printed, or '.' if in repository root
639 :``%d``: dirname of file being printed, or '.' if in repository root
640 :``%p``: root-relative path name of file being printed
640 :``%p``: root-relative path name of file being printed
641
641
642 Returns 0 on success.
642 Returns 0 on success.
643 """
643 """
644 ctx = cmdutil.revsingle(repo, opts.get('rev'))
644 ctx = cmdutil.revsingle(repo, opts.get('rev'))
645 err = 1
645 err = 1
646 m = cmdutil.match(repo, (file1,) + pats, opts)
646 m = cmdutil.match(repo, (file1,) + pats, opts)
647 for abs in ctx.walk(m):
647 for abs in ctx.walk(m):
648 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
648 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
649 data = ctx[abs].data()
649 data = ctx[abs].data()
650 if opts.get('decode'):
650 if opts.get('decode'):
651 data = repo.wwritedata(abs, data)
651 data = repo.wwritedata(abs, data)
652 fp.write(data)
652 fp.write(data)
653 err = 0
653 err = 0
654 return err
654 return err
655
655
656 def clone(ui, source, dest=None, **opts):
656 def clone(ui, source, dest=None, **opts):
657 """make a copy of an existing repository
657 """make a copy of an existing repository
658
658
659 Create a copy of an existing repository in a new directory.
659 Create a copy of an existing repository in a new directory.
660
660
661 If no destination directory name is specified, it defaults to the
661 If no destination directory name is specified, it defaults to the
662 basename of the source.
662 basename of the source.
663
663
664 The location of the source is added to the new repository's
664 The location of the source is added to the new repository's
665 .hg/hgrc file, as the default to be used for future pulls.
665 .hg/hgrc file, as the default to be used for future pulls.
666
666
667 See :hg:`help urls` for valid source format details.
667 See :hg:`help urls` for valid source format details.
668
668
669 It is possible to specify an ``ssh://`` URL as the destination, but no
669 It is possible to specify an ``ssh://`` URL as the destination, but no
670 .hg/hgrc and working directory will be created on the remote side.
670 .hg/hgrc and working directory will be created on the remote side.
671 Please see :hg:`help urls` for important details about ``ssh://`` URLs.
671 Please see :hg:`help urls` for important details about ``ssh://`` URLs.
672
672
673 A set of changesets (tags, or branch names) to pull may be specified
673 A set of changesets (tags, or branch names) to pull may be specified
674 by listing each changeset (tag, or branch name) with -r/--rev.
674 by listing each changeset (tag, or branch name) with -r/--rev.
675 If -r/--rev is used, the cloned repository will contain only a subset
675 If -r/--rev is used, the cloned repository will contain only a subset
676 of the changesets of the source repository. Only the set of changesets
676 of the changesets of the source repository. Only the set of changesets
677 defined by all -r/--rev options (including all their ancestors)
677 defined by all -r/--rev options (including all their ancestors)
678 will be pulled into the destination repository.
678 will be pulled into the destination repository.
679 No subsequent changesets (including subsequent tags) will be present
679 No subsequent changesets (including subsequent tags) will be present
680 in the destination.
680 in the destination.
681
681
682 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
682 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
683 local source repositories.
683 local source repositories.
684
684
685 For efficiency, hardlinks are used for cloning whenever the source
685 For efficiency, hardlinks are used for cloning whenever the source
686 and destination are on the same filesystem (note this applies only
686 and destination are on the same filesystem (note this applies only
687 to the repository data, not to the working directory). Some
687 to the repository data, not to the working directory). Some
688 filesystems, such as AFS, implement hardlinking incorrectly, but
688 filesystems, such as AFS, implement hardlinking incorrectly, but
689 do not report errors. In these cases, use the --pull option to
689 do not report errors. In these cases, use the --pull option to
690 avoid hardlinking.
690 avoid hardlinking.
691
691
692 In some cases, you can clone repositories and the working directory
692 In some cases, you can clone repositories and the working directory
693 using full hardlinks with ::
693 using full hardlinks with ::
694
694
695 $ cp -al REPO REPOCLONE
695 $ cp -al REPO REPOCLONE
696
696
697 This is the fastest way to clone, but it is not always safe. The
697 This is the fastest way to clone, but it is not always safe. The
698 operation is not atomic (making sure REPO is not modified during
698 operation is not atomic (making sure REPO is not modified during
699 the operation is up to you) and you have to make sure your editor
699 the operation is up to you) and you have to make sure your editor
700 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
700 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
701 this is not compatible with certain extensions that place their
701 this is not compatible with certain extensions that place their
702 metadata under the .hg directory, such as mq.
702 metadata under the .hg directory, such as mq.
703
703
704 Mercurial will update the working directory to the first applicable
704 Mercurial will update the working directory to the first applicable
705 revision from this list:
705 revision from this list:
706
706
707 a) null if -U or the source repository has no changesets
707 a) null if -U or the source repository has no changesets
708 b) if -u . and the source repository is local, the first parent of
708 b) if -u . and the source repository is local, the first parent of
709 the source repository's working directory
709 the source repository's working directory
710 c) the changeset specified with -u (if a branch name, this means the
710 c) the changeset specified with -u (if a branch name, this means the
711 latest head of that branch)
711 latest head of that branch)
712 d) the changeset specified with -r
712 d) the changeset specified with -r
713 e) the tipmost head specified with -b
713 e) the tipmost head specified with -b
714 f) the tipmost head specified with the url#branch source syntax
714 f) the tipmost head specified with the url#branch source syntax
715 g) the tipmost head of the default branch
715 g) the tipmost head of the default branch
716 h) tip
716 h) tip
717
717
718 Returns 0 on success.
718 Returns 0 on success.
719 """
719 """
720 if opts.get('noupdate') and opts.get('updaterev'):
720 if opts.get('noupdate') and opts.get('updaterev'):
721 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
721 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
722
722
723 r = hg.clone(hg.remoteui(ui, opts), source, dest,
723 r = hg.clone(hg.remoteui(ui, opts), source, dest,
724 pull=opts.get('pull'),
724 pull=opts.get('pull'),
725 stream=opts.get('uncompressed'),
725 stream=opts.get('uncompressed'),
726 rev=opts.get('rev'),
726 rev=opts.get('rev'),
727 update=opts.get('updaterev') or not opts.get('noupdate'),
727 update=opts.get('updaterev') or not opts.get('noupdate'),
728 branch=opts.get('branch'))
728 branch=opts.get('branch'))
729
729
730 return r is None
730 return r is None
731
731
732 def commit(ui, repo, *pats, **opts):
732 def commit(ui, repo, *pats, **opts):
733 """commit the specified files or all outstanding changes
733 """commit the specified files or all outstanding changes
734
734
735 Commit changes to the given files into the repository. Unlike a
735 Commit changes to the given files into the repository. Unlike a
736 centralized RCS, this operation is a local operation. See
736 centralized RCS, this operation is a local operation. See
737 :hg:`push` for a way to actively distribute your changes.
737 :hg:`push` for a way to actively distribute your changes.
738
738
739 If a list of files is omitted, all changes reported by :hg:`status`
739 If a list of files is omitted, all changes reported by :hg:`status`
740 will be committed.
740 will be committed.
741
741
742 If you are committing the result of a merge, do not provide any
742 If you are committing the result of a merge, do not provide any
743 filenames or -I/-X filters.
743 filenames or -I/-X filters.
744
744
745 If no commit message is specified, Mercurial starts your
745 If no commit message is specified, Mercurial starts your
746 configured editor where you can enter a message. In case your
746 configured editor where you can enter a message. In case your
747 commit fails, you will find a backup of your message in
747 commit fails, you will find a backup of your message in
748 ``.hg/last-message.txt``.
748 ``.hg/last-message.txt``.
749
749
750 See :hg:`help dates` for a list of formats valid for -d/--date.
750 See :hg:`help dates` for a list of formats valid for -d/--date.
751
751
752 Returns 0 on success, 1 if nothing changed.
752 Returns 0 on success, 1 if nothing changed.
753 """
753 """
754 extra = {}
754 extra = {}
755 if opts.get('close_branch'):
755 if opts.get('close_branch'):
756 if repo['.'].node() not in repo.branchheads():
756 if repo['.'].node() not in repo.branchheads():
757 # The topo heads set is included in the branch heads set of the
757 # The topo heads set is included in the branch heads set of the
758 # current branch, so it's sufficient to test branchheads
758 # current branch, so it's sufficient to test branchheads
759 raise util.Abort(_('can only close branch heads'))
759 raise util.Abort(_('can only close branch heads'))
760 extra['close'] = 1
760 extra['close'] = 1
761 e = cmdutil.commiteditor
761 e = cmdutil.commiteditor
762 if opts.get('force_editor'):
762 if opts.get('force_editor'):
763 e = cmdutil.commitforceeditor
763 e = cmdutil.commitforceeditor
764
764
765 def commitfunc(ui, repo, message, match, opts):
765 def commitfunc(ui, repo, message, match, opts):
766 return repo.commit(message, opts.get('user'), opts.get('date'), match,
766 return repo.commit(message, opts.get('user'), opts.get('date'), match,
767 editor=e, extra=extra)
767 editor=e, extra=extra)
768
768
769 branch = repo[None].branch()
769 branch = repo[None].branch()
770 bheads = repo.branchheads(branch)
770 bheads = repo.branchheads(branch)
771
771
772 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
772 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
773 if not node:
773 if not node:
774 ui.status(_("nothing changed\n"))
774 ui.status(_("nothing changed\n"))
775 return 1
775 return 1
776
776
777 ctx = repo[node]
777 ctx = repo[node]
778 parents = ctx.parents()
778 parents = ctx.parents()
779
779
780 if bheads and not [x for x in parents
780 if bheads and not [x for x in parents
781 if x.node() in bheads and x.branch() == branch]:
781 if x.node() in bheads and x.branch() == branch]:
782 ui.status(_('created new head\n'))
782 ui.status(_('created new head\n'))
783 # The message is not printed for initial roots. For the other
783 # The message is not printed for initial roots. For the other
784 # changesets, it is printed in the following situations:
784 # changesets, it is printed in the following situations:
785 #
785 #
786 # Par column: for the 2 parents with ...
786 # Par column: for the 2 parents with ...
787 # N: null or no parent
787 # N: null or no parent
788 # B: parent is on another named branch
788 # B: parent is on another named branch
789 # C: parent is a regular non head changeset
789 # C: parent is a regular non head changeset
790 # H: parent was a branch head of the current branch
790 # H: parent was a branch head of the current branch
791 # Msg column: whether we print "created new head" message
791 # Msg column: whether we print "created new head" message
792 # In the following, it is assumed that there already exists some
792 # In the following, it is assumed that there already exists some
793 # initial branch heads of the current branch, otherwise nothing is
793 # initial branch heads of the current branch, otherwise nothing is
794 # printed anyway.
794 # printed anyway.
795 #
795 #
796 # Par Msg Comment
796 # Par Msg Comment
797 # NN y additional topo root
797 # NN y additional topo root
798 #
798 #
799 # BN y additional branch root
799 # BN y additional branch root
800 # CN y additional topo head
800 # CN y additional topo head
801 # HN n usual case
801 # HN n usual case
802 #
802 #
803 # BB y weird additional branch root
803 # BB y weird additional branch root
804 # CB y branch merge
804 # CB y branch merge
805 # HB n merge with named branch
805 # HB n merge with named branch
806 #
806 #
807 # CC y additional head from merge
807 # CC y additional head from merge
808 # CH n merge with a head
808 # CH n merge with a head
809 #
809 #
810 # HH n head merge: head count decreases
810 # HH n head merge: head count decreases
811
811
812 if not opts.get('close_branch'):
812 if not opts.get('close_branch'):
813 for r in parents:
813 for r in parents:
814 if r.extra().get('close') and r.branch() == branch:
814 if r.extra().get('close') and r.branch() == branch:
815 ui.status(_('reopening closed branch head %d\n') % r)
815 ui.status(_('reopening closed branch head %d\n') % r)
816
816
817 if ui.debugflag:
817 if ui.debugflag:
818 ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx.hex()))
818 ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx.hex()))
819 elif ui.verbose:
819 elif ui.verbose:
820 ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx))
820 ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx))
821
821
822 def copy(ui, repo, *pats, **opts):
822 def copy(ui, repo, *pats, **opts):
823 """mark files as copied for the next commit
823 """mark files as copied for the next commit
824
824
825 Mark dest as having copies of source files. If dest is a
825 Mark dest as having copies of source files. If dest is a
826 directory, copies are put in that directory. If dest is a file,
826 directory, copies are put in that directory. If dest is a file,
827 the source must be a single file.
827 the source must be a single file.
828
828
829 By default, this command copies the contents of files as they
829 By default, this command copies the contents of files as they
830 exist in the working directory. If invoked with -A/--after, the
830 exist in the working directory. If invoked with -A/--after, the
831 operation is recorded, but no copying is performed.
831 operation is recorded, but no copying is performed.
832
832
833 This command takes effect with the next commit. To undo a copy
833 This command takes effect with the next commit. To undo a copy
834 before that, see :hg:`revert`.
834 before that, see :hg:`revert`.
835
835
836 Returns 0 on success, 1 if errors are encountered.
836 Returns 0 on success, 1 if errors are encountered.
837 """
837 """
838 wlock = repo.wlock(False)
838 wlock = repo.wlock(False)
839 try:
839 try:
840 return cmdutil.copy(ui, repo, pats, opts)
840 return cmdutil.copy(ui, repo, pats, opts)
841 finally:
841 finally:
842 wlock.release()
842 wlock.release()
843
843
844 def debugancestor(ui, repo, *args):
844 def debugancestor(ui, repo, *args):
845 """find the ancestor revision of two revisions in a given index"""
845 """find the ancestor revision of two revisions in a given index"""
846 if len(args) == 3:
846 if len(args) == 3:
847 index, rev1, rev2 = args
847 index, rev1, rev2 = args
848 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
848 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
849 lookup = r.lookup
849 lookup = r.lookup
850 elif len(args) == 2:
850 elif len(args) == 2:
851 if not repo:
851 if not repo:
852 raise util.Abort(_("there is no Mercurial repository here "
852 raise util.Abort(_("there is no Mercurial repository here "
853 "(.hg not found)"))
853 "(.hg not found)"))
854 rev1, rev2 = args
854 rev1, rev2 = args
855 r = repo.changelog
855 r = repo.changelog
856 lookup = repo.lookup
856 lookup = repo.lookup
857 else:
857 else:
858 raise util.Abort(_('either two or three arguments required'))
858 raise util.Abort(_('either two or three arguments required'))
859 a = r.ancestor(lookup(rev1), lookup(rev2))
859 a = r.ancestor(lookup(rev1), lookup(rev2))
860 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
860 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
861
861
862 def debugbuilddag(ui, repo, text,
862 def debugbuilddag(ui, repo, text,
863 mergeable_file=False,
863 mergeable_file=False,
864 appended_file=False,
864 appended_file=False,
865 overwritten_file=False,
865 overwritten_file=False,
866 new_file=False):
866 new_file=False):
867 """builds a repo with a given dag from scratch in the current empty repo
867 """builds a repo with a given dag from scratch in the current empty repo
868
868
869 Elements:
869 Elements:
870
870
871 - "+n" is a linear run of n nodes based on the current default parent
871 - "+n" is a linear run of n nodes based on the current default parent
872 - "." is a single node based on the current default parent
872 - "." is a single node based on the current default parent
873 - "$" resets the default parent to null (implied at the start);
873 - "$" resets the default parent to null (implied at the start);
874 otherwise the default parent is always the last node created
874 otherwise the default parent is always the last node created
875 - "<p" sets the default parent to the backref p
875 - "<p" sets the default parent to the backref p
876 - "*p" is a fork at parent p, which is a backref
876 - "*p" is a fork at parent p, which is a backref
877 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
877 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
878 - "/p2" is a merge of the preceding node and p2
878 - "/p2" is a merge of the preceding node and p2
879 - ":tag" defines a local tag for the preceding node
879 - ":tag" defines a local tag for the preceding node
880 - "@branch" sets the named branch for subsequent nodes
880 - "@branch" sets the named branch for subsequent nodes
881 - "!command" runs the command using your shell
881 - "!command" runs the command using your shell
882 - "!!my command\\n" is like "!", but to the end of the line
882 - "!!my command\\n" is like "!", but to the end of the line
883 - "#...\\n" is a comment up to the end of the line
883 - "#...\\n" is a comment up to the end of the line
884
884
885 Whitespace between the above elements is ignored.
885 Whitespace between the above elements is ignored.
886
886
887 A backref is either
887 A backref is either
888
888
889 - a number n, which references the node curr-n, where curr is the current
889 - a number n, which references the node curr-n, where curr is the current
890 node, or
890 node, or
891 - the name of a local tag you placed earlier using ":tag", or
891 - the name of a local tag you placed earlier using ":tag", or
892 - empty to denote the default parent.
892 - empty to denote the default parent.
893
893
894 All string valued-elements are either strictly alphanumeric, or must
894 All string valued-elements are either strictly alphanumeric, or must
895 be enclosed in double quotes ("..."), with "\\" as escape character.
895 be enclosed in double quotes ("..."), with "\\" as escape character.
896
896
897 Note that the --overwritten-file and --appended-file options imply the
897 Note that the --overwritten-file and --appended-file options imply the
898 use of "HGMERGE=internal:local" during DAG buildup.
898 use of "HGMERGE=internal:local" during DAG buildup.
899 """
899 """
900
900
901 if not (mergeable_file or appended_file or overwritten_file or new_file):
901 if not (mergeable_file or appended_file or overwritten_file or new_file):
902 raise util.Abort(_('need at least one of -m, -a, -o, -n'))
902 raise util.Abort(_('need at least one of -m, -a, -o, -n'))
903
903
904 if len(repo.changelog) > 0:
904 if len(repo.changelog) > 0:
905 raise util.Abort(_('repository is not empty'))
905 raise util.Abort(_('repository is not empty'))
906
906
907 if overwritten_file or appended_file:
907 if overwritten_file or appended_file:
908 # we don't want to fail in merges during buildup
908 # we don't want to fail in merges during buildup
909 os.environ['HGMERGE'] = 'internal:local'
909 os.environ['HGMERGE'] = 'internal:local'
910
910
911 def writefile(fname, text, fmode="wb"):
911 def writefile(fname, text, fmode="wb"):
912 f = open(fname, fmode)
912 f = open(fname, fmode)
913 try:
913 try:
914 f.write(text)
914 f.write(text)
915 finally:
915 finally:
916 f.close()
916 f.close()
917
917
918 if mergeable_file:
918 if mergeable_file:
919 linesperrev = 2
919 linesperrev = 2
920 # determine number of revs in DAG
920 # determine number of revs in DAG
921 n = 0
921 n = 0
922 for type, data in dagparser.parsedag(text):
922 for type, data in dagparser.parsedag(text):
923 if type == 'n':
923 if type == 'n':
924 n += 1
924 n += 1
925 # make a file with k lines per rev
925 # make a file with k lines per rev
926 writefile("mf", "\n".join(str(i) for i in xrange(0, n * linesperrev))
926 writefile("mf", "\n".join(str(i) for i in xrange(0, n * linesperrev))
927 + "\n")
927 + "\n")
928
928
929 at = -1
929 at = -1
930 atbranch = 'default'
930 atbranch = 'default'
931 for type, data in dagparser.parsedag(text):
931 for type, data in dagparser.parsedag(text):
932 if type == 'n':
932 if type == 'n':
933 ui.status('node %s\n' % str(data))
933 ui.status('node %s\n' % str(data))
934 id, ps = data
934 id, ps = data
935 p1 = ps[0]
935 p1 = ps[0]
936 if p1 != at:
936 if p1 != at:
937 update(ui, repo, node=str(p1), clean=True)
937 update(ui, repo, node=str(p1), clean=True)
938 at = p1
938 at = p1
939 if repo.dirstate.branch() != atbranch:
939 if repo.dirstate.branch() != atbranch:
940 branch(ui, repo, atbranch, force=True)
940 branch(ui, repo, atbranch, force=True)
941 if len(ps) > 1:
941 if len(ps) > 1:
942 p2 = ps[1]
942 p2 = ps[1]
943 merge(ui, repo, node=p2)
943 merge(ui, repo, node=p2)
944
944
945 if mergeable_file:
945 if mergeable_file:
946 f = open("mf", "rb+")
946 f = open("mf", "rb+")
947 try:
947 try:
948 lines = f.read().split("\n")
948 lines = f.read().split("\n")
949 lines[id * linesperrev] += " r%i" % id
949 lines[id * linesperrev] += " r%i" % id
950 f.seek(0)
950 f.seek(0)
951 f.write("\n".join(lines))
951 f.write("\n".join(lines))
952 finally:
952 finally:
953 f.close()
953 f.close()
954
954
955 if appended_file:
955 if appended_file:
956 writefile("af", "r%i\n" % id, "ab")
956 writefile("af", "r%i\n" % id, "ab")
957
957
958 if overwritten_file:
958 if overwritten_file:
959 writefile("of", "r%i\n" % id)
959 writefile("of", "r%i\n" % id)
960
960
961 if new_file:
961 if new_file:
962 writefile("nf%i" % id, "r%i\n" % id)
962 writefile("nf%i" % id, "r%i\n" % id)
963
963
964 commit(ui, repo, addremove=True, message="r%i" % id, date=(id, 0))
964 commit(ui, repo, addremove=True, message="r%i" % id, date=(id, 0))
965 at = id
965 at = id
966 elif type == 'l':
966 elif type == 'l':
967 id, name = data
967 id, name = data
968 ui.status('tag %s\n' % name)
968 ui.status('tag %s\n' % name)
969 tag(ui, repo, name, local=True)
969 tag(ui, repo, name, local=True)
970 elif type == 'a':
970 elif type == 'a':
971 ui.status('branch %s\n' % data)
971 ui.status('branch %s\n' % data)
972 atbranch = data
972 atbranch = data
973 elif type in 'cC':
973 elif type in 'cC':
974 r = util.system(data, cwd=repo.root)
974 r = util.system(data, cwd=repo.root)
975 if r:
975 if r:
976 desc, r = util.explain_exit(r)
976 desc, r = util.explain_exit(r)
977 raise util.Abort(_('%s command %s') % (data, desc))
977 raise util.Abort(_('%s command %s') % (data, desc))
978
978
979 def debugcommands(ui, cmd='', *args):
979 def debugcommands(ui, cmd='', *args):
980 """list all available commands and options"""
980 """list all available commands and options"""
981 for cmd, vals in sorted(table.iteritems()):
981 for cmd, vals in sorted(table.iteritems()):
982 cmd = cmd.split('|')[0].strip('^')
982 cmd = cmd.split('|')[0].strip('^')
983 opts = ', '.join([i[1] for i in vals[1]])
983 opts = ', '.join([i[1] for i in vals[1]])
984 ui.write('%s: %s\n' % (cmd, opts))
984 ui.write('%s: %s\n' % (cmd, opts))
985
985
986 def debugcomplete(ui, cmd='', **opts):
986 def debugcomplete(ui, cmd='', **opts):
987 """returns the completion list associated with the given command"""
987 """returns the completion list associated with the given command"""
988
988
989 if opts.get('options'):
989 if opts.get('options'):
990 options = []
990 options = []
991 otables = [globalopts]
991 otables = [globalopts]
992 if cmd:
992 if cmd:
993 aliases, entry = cmdutil.findcmd(cmd, table, False)
993 aliases, entry = cmdutil.findcmd(cmd, table, False)
994 otables.append(entry[1])
994 otables.append(entry[1])
995 for t in otables:
995 for t in otables:
996 for o in t:
996 for o in t:
997 if "(DEPRECATED)" in o[3]:
997 if "(DEPRECATED)" in o[3]:
998 continue
998 continue
999 if o[0]:
999 if o[0]:
1000 options.append('-%s' % o[0])
1000 options.append('-%s' % o[0])
1001 options.append('--%s' % o[1])
1001 options.append('--%s' % o[1])
1002 ui.write("%s\n" % "\n".join(options))
1002 ui.write("%s\n" % "\n".join(options))
1003 return
1003 return
1004
1004
1005 cmdlist = cmdutil.findpossible(cmd, table)
1005 cmdlist = cmdutil.findpossible(cmd, table)
1006 if ui.verbose:
1006 if ui.verbose:
1007 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
1007 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
1008 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
1008 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
1009
1009
1010 def debugfsinfo(ui, path = "."):
1010 def debugfsinfo(ui, path = "."):
1011 """show information detected about current filesystem"""
1011 """show information detected about current filesystem"""
1012 open('.debugfsinfo', 'w').write('')
1012 open('.debugfsinfo', 'w').write('')
1013 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
1013 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
1014 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
1014 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
1015 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
1015 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
1016 and 'yes' or 'no'))
1016 and 'yes' or 'no'))
1017 os.unlink('.debugfsinfo')
1017 os.unlink('.debugfsinfo')
1018
1018
1019 def debugrebuildstate(ui, repo, rev="tip"):
1019 def debugrebuildstate(ui, repo, rev="tip"):
1020 """rebuild the dirstate as it would look like for the given revision"""
1020 """rebuild the dirstate as it would look like for the given revision"""
1021 ctx = repo[rev]
1021 ctx = repo[rev]
1022 wlock = repo.wlock()
1022 wlock = repo.wlock()
1023 try:
1023 try:
1024 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
1024 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
1025 finally:
1025 finally:
1026 wlock.release()
1026 wlock.release()
1027
1027
1028 def debugcheckstate(ui, repo):
1028 def debugcheckstate(ui, repo):
1029 """validate the correctness of the current dirstate"""
1029 """validate the correctness of the current dirstate"""
1030 parent1, parent2 = repo.dirstate.parents()
1030 parent1, parent2 = repo.dirstate.parents()
1031 m1 = repo[parent1].manifest()
1031 m1 = repo[parent1].manifest()
1032 m2 = repo[parent2].manifest()
1032 m2 = repo[parent2].manifest()
1033 errors = 0
1033 errors = 0
1034 for f in repo.dirstate:
1034 for f in repo.dirstate:
1035 state = repo.dirstate[f]
1035 state = repo.dirstate[f]
1036 if state in "nr" and f not in m1:
1036 if state in "nr" and f not in m1:
1037 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1037 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1038 errors += 1
1038 errors += 1
1039 if state in "a" and f in m1:
1039 if state in "a" and f in m1:
1040 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1040 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1041 errors += 1
1041 errors += 1
1042 if state in "m" and f not in m1 and f not in m2:
1042 if state in "m" and f not in m1 and f not in m2:
1043 ui.warn(_("%s in state %s, but not in either manifest\n") %
1043 ui.warn(_("%s in state %s, but not in either manifest\n") %
1044 (f, state))
1044 (f, state))
1045 errors += 1
1045 errors += 1
1046 for f in m1:
1046 for f in m1:
1047 state = repo.dirstate[f]
1047 state = repo.dirstate[f]
1048 if state not in "nrm":
1048 if state not in "nrm":
1049 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1049 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1050 errors += 1
1050 errors += 1
1051 if errors:
1051 if errors:
1052 error = _(".hg/dirstate inconsistent with current parent's manifest")
1052 error = _(".hg/dirstate inconsistent with current parent's manifest")
1053 raise util.Abort(error)
1053 raise util.Abort(error)
1054
1054
1055 def showconfig(ui, repo, *values, **opts):
1055 def showconfig(ui, repo, *values, **opts):
1056 """show combined config settings from all hgrc files
1056 """show combined config settings from all hgrc files
1057
1057
1058 With no arguments, print names and values of all config items.
1058 With no arguments, print names and values of all config items.
1059
1059
1060 With one argument of the form section.name, print just the value
1060 With one argument of the form section.name, print just the value
1061 of that config item.
1061 of that config item.
1062
1062
1063 With multiple arguments, print names and values of all config
1063 With multiple arguments, print names and values of all config
1064 items with matching section names.
1064 items with matching section names.
1065
1065
1066 With --debug, the source (filename and line number) is printed
1066 With --debug, the source (filename and line number) is printed
1067 for each config item.
1067 for each config item.
1068
1068
1069 Returns 0 on success.
1069 Returns 0 on success.
1070 """
1070 """
1071
1071
1072 for f in util.rcpath():
1072 for f in util.rcpath():
1073 ui.debug(_('read config from: %s\n') % f)
1073 ui.debug(_('read config from: %s\n') % f)
1074 untrusted = bool(opts.get('untrusted'))
1074 untrusted = bool(opts.get('untrusted'))
1075 if values:
1075 if values:
1076 sections = [v for v in values if '.' not in v]
1076 sections = [v for v in values if '.' not in v]
1077 items = [v for v in values if '.' in v]
1077 items = [v for v in values if '.' in v]
1078 if len(items) > 1 or items and sections:
1078 if len(items) > 1 or items and sections:
1079 raise util.Abort(_('only one config item permitted'))
1079 raise util.Abort(_('only one config item permitted'))
1080 for section, name, value in ui.walkconfig(untrusted=untrusted):
1080 for section, name, value in ui.walkconfig(untrusted=untrusted):
1081 sectname = section + '.' + name
1081 sectname = section + '.' + name
1082 if values:
1082 if values:
1083 for v in values:
1083 for v in values:
1084 if v == section:
1084 if v == section:
1085 ui.debug('%s: ' %
1085 ui.debug('%s: ' %
1086 ui.configsource(section, name, untrusted))
1086 ui.configsource(section, name, untrusted))
1087 ui.write('%s=%s\n' % (sectname, value))
1087 ui.write('%s=%s\n' % (sectname, value))
1088 elif v == sectname:
1088 elif v == sectname:
1089 ui.debug('%s: ' %
1089 ui.debug('%s: ' %
1090 ui.configsource(section, name, untrusted))
1090 ui.configsource(section, name, untrusted))
1091 ui.write(value, '\n')
1091 ui.write(value, '\n')
1092 else:
1092 else:
1093 ui.debug('%s: ' %
1093 ui.debug('%s: ' %
1094 ui.configsource(section, name, untrusted))
1094 ui.configsource(section, name, untrusted))
1095 ui.write('%s=%s\n' % (sectname, value))
1095 ui.write('%s=%s\n' % (sectname, value))
1096
1096
1097 def debugpushkey(ui, repopath, namespace, *keyinfo):
1097 def debugpushkey(ui, repopath, namespace, *keyinfo):
1098 '''access the pushkey key/value protocol
1098 '''access the pushkey key/value protocol
1099
1099
1100 With two args, list the keys in the given namespace.
1100 With two args, list the keys in the given namespace.
1101
1101
1102 With five args, set a key to new if it currently is set to old.
1102 With five args, set a key to new if it currently is set to old.
1103 Reports success or failure.
1103 Reports success or failure.
1104 '''
1104 '''
1105
1105
1106 target = hg.repository(ui, repopath)
1106 target = hg.repository(ui, repopath)
1107 if keyinfo:
1107 if keyinfo:
1108 key, old, new = keyinfo
1108 key, old, new = keyinfo
1109 r = target.pushkey(namespace, key, old, new)
1109 r = target.pushkey(namespace, key, old, new)
1110 ui.status(str(r) + '\n')
1110 ui.status(str(r) + '\n')
1111 return not(r)
1111 return not(r)
1112 else:
1112 else:
1113 for k, v in target.listkeys(namespace).iteritems():
1113 for k, v in target.listkeys(namespace).iteritems():
1114 ui.write("%s\t%s\n" % (k.encode('string-escape'),
1114 ui.write("%s\t%s\n" % (k.encode('string-escape'),
1115 v.encode('string-escape')))
1115 v.encode('string-escape')))
1116
1116
1117 def debugrevspec(ui, repo, expr):
1117 def debugrevspec(ui, repo, expr):
1118 '''parse and apply a revision specification'''
1118 '''parse and apply a revision specification'''
1119 if ui.verbose:
1119 if ui.verbose:
1120 tree = revset.parse(expr)
1120 tree = revset.parse(expr)
1121 ui.note(tree, "\n")
1121 ui.note(tree, "\n")
1122 func = revset.match(expr)
1122 func = revset.match(expr)
1123 for c in func(repo, range(len(repo))):
1123 for c in func(repo, range(len(repo))):
1124 ui.write("%s\n" % c)
1124 ui.write("%s\n" % c)
1125
1125
1126 def debugsetparents(ui, repo, rev1, rev2=None):
1126 def debugsetparents(ui, repo, rev1, rev2=None):
1127 """manually set the parents of the current working directory
1127 """manually set the parents of the current working directory
1128
1128
1129 This is useful for writing repository conversion tools, but should
1129 This is useful for writing repository conversion tools, but should
1130 be used with care.
1130 be used with care.
1131
1131
1132 Returns 0 on success.
1132 Returns 0 on success.
1133 """
1133 """
1134
1134
1135 if not rev2:
1135 if not rev2:
1136 rev2 = hex(nullid)
1136 rev2 = hex(nullid)
1137
1137
1138 wlock = repo.wlock()
1138 wlock = repo.wlock()
1139 try:
1139 try:
1140 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
1140 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
1141 finally:
1141 finally:
1142 wlock.release()
1142 wlock.release()
1143
1143
1144 def debugstate(ui, repo, nodates=None):
1144 def debugstate(ui, repo, nodates=None):
1145 """show the contents of the current dirstate"""
1145 """show the contents of the current dirstate"""
1146 timestr = ""
1146 timestr = ""
1147 showdate = not nodates
1147 showdate = not nodates
1148 for file_, ent in sorted(repo.dirstate._map.iteritems()):
1148 for file_, ent in sorted(repo.dirstate._map.iteritems()):
1149 if showdate:
1149 if showdate:
1150 if ent[3] == -1:
1150 if ent[3] == -1:
1151 # Pad or slice to locale representation
1151 # Pad or slice to locale representation
1152 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
1152 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
1153 time.localtime(0)))
1153 time.localtime(0)))
1154 timestr = 'unset'
1154 timestr = 'unset'
1155 timestr = (timestr[:locale_len] +
1155 timestr = (timestr[:locale_len] +
1156 ' ' * (locale_len - len(timestr)))
1156 ' ' * (locale_len - len(timestr)))
1157 else:
1157 else:
1158 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
1158 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
1159 time.localtime(ent[3]))
1159 time.localtime(ent[3]))
1160 if ent[1] & 020000:
1160 if ent[1] & 020000:
1161 mode = 'lnk'
1161 mode = 'lnk'
1162 else:
1162 else:
1163 mode = '%3o' % (ent[1] & 0777)
1163 mode = '%3o' % (ent[1] & 0777)
1164 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
1164 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
1165 for f in repo.dirstate.copies():
1165 for f in repo.dirstate.copies():
1166 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
1166 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
1167
1167
1168 def debugsub(ui, repo, rev=None):
1168 def debugsub(ui, repo, rev=None):
1169 if rev == '':
1169 if rev == '':
1170 rev = None
1170 rev = None
1171 for k, v in sorted(repo[rev].substate.items()):
1171 for k, v in sorted(repo[rev].substate.items()):
1172 ui.write('path %s\n' % k)
1172 ui.write('path %s\n' % k)
1173 ui.write(' source %s\n' % v[0])
1173 ui.write(' source %s\n' % v[0])
1174 ui.write(' revision %s\n' % v[1])
1174 ui.write(' revision %s\n' % v[1])
1175
1175
1176 def debugdag(ui, repo, file_=None, *revs, **opts):
1176 def debugdag(ui, repo, file_=None, *revs, **opts):
1177 """format the changelog or an index DAG as a concise textual description
1177 """format the changelog or an index DAG as a concise textual description
1178
1178
1179 If you pass a revlog index, the revlog's DAG is emitted. If you list
1179 If you pass a revlog index, the revlog's DAG is emitted. If you list
1180 revision numbers, they get labelled in the output as rN.
1180 revision numbers, they get labelled in the output as rN.
1181
1181
1182 Otherwise, the changelog DAG of the current repo is emitted.
1182 Otherwise, the changelog DAG of the current repo is emitted.
1183 """
1183 """
1184 spaces = opts.get('spaces')
1184 spaces = opts.get('spaces')
1185 dots = opts.get('dots')
1185 dots = opts.get('dots')
1186 if file_:
1186 if file_:
1187 rlog = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
1187 rlog = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
1188 revs = set((int(r) for r in revs))
1188 revs = set((int(r) for r in revs))
1189 def events():
1189 def events():
1190 for r in rlog:
1190 for r in rlog:
1191 yield 'n', (r, list(set(p for p in rlog.parentrevs(r) if p != -1)))
1191 yield 'n', (r, list(set(p for p in rlog.parentrevs(r) if p != -1)))
1192 if r in revs:
1192 if r in revs:
1193 yield 'l', (r, "r%i" % r)
1193 yield 'l', (r, "r%i" % r)
1194 elif repo:
1194 elif repo:
1195 cl = repo.changelog
1195 cl = repo.changelog
1196 tags = opts.get('tags')
1196 tags = opts.get('tags')
1197 branches = opts.get('branches')
1197 branches = opts.get('branches')
1198 if tags:
1198 if tags:
1199 labels = {}
1199 labels = {}
1200 for l, n in repo.tags().items():
1200 for l, n in repo.tags().items():
1201 labels.setdefault(cl.rev(n), []).append(l)
1201 labels.setdefault(cl.rev(n), []).append(l)
1202 def events():
1202 def events():
1203 b = "default"
1203 b = "default"
1204 for r in cl:
1204 for r in cl:
1205 if branches:
1205 if branches:
1206 newb = cl.read(cl.node(r))[5]['branch']
1206 newb = cl.read(cl.node(r))[5]['branch']
1207 if newb != b:
1207 if newb != b:
1208 yield 'a', newb
1208 yield 'a', newb
1209 b = newb
1209 b = newb
1210 yield 'n', (r, list(set(p for p in cl.parentrevs(r) if p != -1)))
1210 yield 'n', (r, list(set(p for p in cl.parentrevs(r) if p != -1)))
1211 if tags:
1211 if tags:
1212 ls = labels.get(r)
1212 ls = labels.get(r)
1213 if ls:
1213 if ls:
1214 for l in ls:
1214 for l in ls:
1215 yield 'l', (r, l)
1215 yield 'l', (r, l)
1216 else:
1216 else:
1217 raise util.Abort(_('need repo for changelog dag'))
1217 raise util.Abort(_('need repo for changelog dag'))
1218
1218
1219 for line in dagparser.dagtextlines(events(),
1219 for line in dagparser.dagtextlines(events(),
1220 addspaces=spaces,
1220 addspaces=spaces,
1221 wraplabels=True,
1221 wraplabels=True,
1222 wrapannotations=True,
1222 wrapannotations=True,
1223 wrapnonlinear=dots,
1223 wrapnonlinear=dots,
1224 usedots=dots,
1224 usedots=dots,
1225 maxlinewidth=70):
1225 maxlinewidth=70):
1226 ui.write(line)
1226 ui.write(line)
1227 ui.write("\n")
1227 ui.write("\n")
1228
1228
1229 def debugdata(ui, repo, file_, rev):
1229 def debugdata(ui, repo, file_, rev):
1230 """dump the contents of a data file revision"""
1230 """dump the contents of a data file revision"""
1231 r = None
1231 r = None
1232 if repo:
1232 if repo:
1233 filelog = repo.file(file_)
1233 filelog = repo.file(file_)
1234 if len(filelog):
1234 if len(filelog):
1235 r = filelog
1235 r = filelog
1236 if not r:
1236 if not r:
1237 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
1237 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
1238 try:
1238 try:
1239 ui.write(r.revision(r.lookup(rev)))
1239 ui.write(r.revision(r.lookup(rev)))
1240 except KeyError:
1240 except KeyError:
1241 raise util.Abort(_('invalid revision identifier %s') % rev)
1241 raise util.Abort(_('invalid revision identifier %s') % rev)
1242
1242
1243 def debugdate(ui, date, range=None, **opts):
1243 def debugdate(ui, date, range=None, **opts):
1244 """parse and display a date"""
1244 """parse and display a date"""
1245 if opts["extended"]:
1245 if opts["extended"]:
1246 d = util.parsedate(date, util.extendeddateformats)
1246 d = util.parsedate(date, util.extendeddateformats)
1247 else:
1247 else:
1248 d = util.parsedate(date)
1248 d = util.parsedate(date)
1249 ui.write("internal: %s %s\n" % d)
1249 ui.write("internal: %s %s\n" % d)
1250 ui.write("standard: %s\n" % util.datestr(d))
1250 ui.write("standard: %s\n" % util.datestr(d))
1251 if range:
1251 if range:
1252 m = util.matchdate(range)
1252 m = util.matchdate(range)
1253 ui.write("match: %s\n" % m(d[0]))
1253 ui.write("match: %s\n" % m(d[0]))
1254
1254
1255 def debugindex(ui, repo, file_):
1255 def debugindex(ui, repo, file_):
1256 """dump the contents of an index file"""
1256 """dump the contents of an index file"""
1257 r = None
1257 r = None
1258 if repo:
1258 if repo:
1259 filelog = repo.file(file_)
1259 filelog = repo.file(file_)
1260 if len(filelog):
1260 if len(filelog):
1261 r = filelog
1261 r = filelog
1262 if not r:
1262 if not r:
1263 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
1263 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
1264 ui.write(" rev offset length base linkrev"
1264 ui.write(" rev offset length base linkrev"
1265 " nodeid p1 p2\n")
1265 " nodeid p1 p2\n")
1266 for i in r:
1266 for i in r:
1267 node = r.node(i)
1267 node = r.node(i)
1268 try:
1268 try:
1269 pp = r.parents(node)
1269 pp = r.parents(node)
1270 except:
1270 except:
1271 pp = [nullid, nullid]
1271 pp = [nullid, nullid]
1272 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
1272 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
1273 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
1273 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
1274 short(node), short(pp[0]), short(pp[1])))
1274 short(node), short(pp[0]), short(pp[1])))
1275
1275
1276 def debugindexdot(ui, repo, file_):
1276 def debugindexdot(ui, repo, file_):
1277 """dump an index DAG as a graphviz dot file"""
1277 """dump an index DAG as a graphviz dot file"""
1278 r = None
1278 r = None
1279 if repo:
1279 if repo:
1280 filelog = repo.file(file_)
1280 filelog = repo.file(file_)
1281 if len(filelog):
1281 if len(filelog):
1282 r = filelog
1282 r = filelog
1283 if not r:
1283 if not r:
1284 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
1284 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
1285 ui.write("digraph G {\n")
1285 ui.write("digraph G {\n")
1286 for i in r:
1286 for i in r:
1287 node = r.node(i)
1287 node = r.node(i)
1288 pp = r.parents(node)
1288 pp = r.parents(node)
1289 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
1289 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
1290 if pp[1] != nullid:
1290 if pp[1] != nullid:
1291 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
1291 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
1292 ui.write("}\n")
1292 ui.write("}\n")
1293
1293
1294 def debuginstall(ui):
1294 def debuginstall(ui):
1295 '''test Mercurial installation
1295 '''test Mercurial installation
1296
1296
1297 Returns 0 on success.
1297 Returns 0 on success.
1298 '''
1298 '''
1299
1299
1300 def writetemp(contents):
1300 def writetemp(contents):
1301 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
1301 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
1302 f = os.fdopen(fd, "wb")
1302 f = os.fdopen(fd, "wb")
1303 f.write(contents)
1303 f.write(contents)
1304 f.close()
1304 f.close()
1305 return name
1305 return name
1306
1306
1307 problems = 0
1307 problems = 0
1308
1308
1309 # encoding
1309 # encoding
1310 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
1310 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
1311 try:
1311 try:
1312 encoding.fromlocal("test")
1312 encoding.fromlocal("test")
1313 except util.Abort, inst:
1313 except util.Abort, inst:
1314 ui.write(" %s\n" % inst)
1314 ui.write(" %s\n" % inst)
1315 ui.write(_(" (check that your locale is properly set)\n"))
1315 ui.write(_(" (check that your locale is properly set)\n"))
1316 problems += 1
1316 problems += 1
1317
1317
1318 # compiled modules
1318 # compiled modules
1319 ui.status(_("Checking installed modules (%s)...\n")
1319 ui.status(_("Checking installed modules (%s)...\n")
1320 % os.path.dirname(__file__))
1320 % os.path.dirname(__file__))
1321 try:
1321 try:
1322 import bdiff, mpatch, base85, osutil
1322 import bdiff, mpatch, base85, osutil
1323 except Exception, inst:
1323 except Exception, inst:
1324 ui.write(" %s\n" % inst)
1324 ui.write(" %s\n" % inst)
1325 ui.write(_(" One or more extensions could not be found"))
1325 ui.write(_(" One or more extensions could not be found"))
1326 ui.write(_(" (check that you compiled the extensions)\n"))
1326 ui.write(_(" (check that you compiled the extensions)\n"))
1327 problems += 1
1327 problems += 1
1328
1328
1329 # templates
1329 # templates
1330 ui.status(_("Checking templates...\n"))
1330 ui.status(_("Checking templates...\n"))
1331 try:
1331 try:
1332 import templater
1332 import templater
1333 templater.templater(templater.templatepath("map-cmdline.default"))
1333 templater.templater(templater.templatepath("map-cmdline.default"))
1334 except Exception, inst:
1334 except Exception, inst:
1335 ui.write(" %s\n" % inst)
1335 ui.write(" %s\n" % inst)
1336 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
1336 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
1337 problems += 1
1337 problems += 1
1338
1338
1339 # patch
1339 # patch
1340 ui.status(_("Checking patch...\n"))
1340 ui.status(_("Checking patch...\n"))
1341 patchproblems = 0
1341 patchproblems = 0
1342 a = "1\n2\n3\n4\n"
1342 a = "1\n2\n3\n4\n"
1343 b = "1\n2\n3\ninsert\n4\n"
1343 b = "1\n2\n3\ninsert\n4\n"
1344 fa = writetemp(a)
1344 fa = writetemp(a)
1345 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
1345 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
1346 os.path.basename(fa))
1346 os.path.basename(fa))
1347 fd = writetemp(d)
1347 fd = writetemp(d)
1348
1348
1349 files = {}
1349 files = {}
1350 try:
1350 try:
1351 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
1351 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
1352 except util.Abort, e:
1352 except util.Abort, e:
1353 ui.write(_(" patch call failed:\n"))
1353 ui.write(_(" patch call failed:\n"))
1354 ui.write(" " + str(e) + "\n")
1354 ui.write(" " + str(e) + "\n")
1355 patchproblems += 1
1355 patchproblems += 1
1356 else:
1356 else:
1357 if list(files) != [os.path.basename(fa)]:
1357 if list(files) != [os.path.basename(fa)]:
1358 ui.write(_(" unexpected patch output!\n"))
1358 ui.write(_(" unexpected patch output!\n"))
1359 patchproblems += 1
1359 patchproblems += 1
1360 a = open(fa).read()
1360 a = open(fa).read()
1361 if a != b:
1361 if a != b:
1362 ui.write(_(" patch test failed!\n"))
1362 ui.write(_(" patch test failed!\n"))
1363 patchproblems += 1
1363 patchproblems += 1
1364
1364
1365 if patchproblems:
1365 if patchproblems:
1366 if ui.config('ui', 'patch'):
1366 if ui.config('ui', 'patch'):
1367 ui.write(_(" (Current patch tool may be incompatible with patch,"
1367 ui.write(_(" (Current patch tool may be incompatible with patch,"
1368 " or misconfigured. Please check your configuration"
1368 " or misconfigured. Please check your configuration"
1369 " file)\n"))
1369 " file)\n"))
1370 else:
1370 else:
1371 ui.write(_(" Internal patcher failure, please report this error"
1371 ui.write(_(" Internal patcher failure, please report this error"
1372 " to http://mercurial.selenic.com/bts/\n"))
1372 " to http://mercurial.selenic.com/bts/\n"))
1373 problems += patchproblems
1373 problems += patchproblems
1374
1374
1375 os.unlink(fa)
1375 os.unlink(fa)
1376 os.unlink(fd)
1376 os.unlink(fd)
1377
1377
1378 # editor
1378 # editor
1379 ui.status(_("Checking commit editor...\n"))
1379 ui.status(_("Checking commit editor...\n"))
1380 editor = ui.geteditor()
1380 editor = ui.geteditor()
1381 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1381 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1382 if not cmdpath:
1382 if not cmdpath:
1383 if editor == 'vi':
1383 if editor == 'vi':
1384 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1384 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1385 ui.write(_(" (specify a commit editor in your configuration"
1385 ui.write(_(" (specify a commit editor in your configuration"
1386 " file)\n"))
1386 " file)\n"))
1387 else:
1387 else:
1388 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1388 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1389 ui.write(_(" (specify a commit editor in your configuration"
1389 ui.write(_(" (specify a commit editor in your configuration"
1390 " file)\n"))
1390 " file)\n"))
1391 problems += 1
1391 problems += 1
1392
1392
1393 # check username
1393 # check username
1394 ui.status(_("Checking username...\n"))
1394 ui.status(_("Checking username...\n"))
1395 try:
1395 try:
1396 ui.username()
1396 ui.username()
1397 except util.Abort, e:
1397 except util.Abort, e:
1398 ui.write(" %s\n" % e)
1398 ui.write(" %s\n" % e)
1399 ui.write(_(" (specify a username in your configuration file)\n"))
1399 ui.write(_(" (specify a username in your configuration file)\n"))
1400 problems += 1
1400 problems += 1
1401
1401
1402 if not problems:
1402 if not problems:
1403 ui.status(_("No problems detected\n"))
1403 ui.status(_("No problems detected\n"))
1404 else:
1404 else:
1405 ui.write(_("%s problems detected,"
1405 ui.write(_("%s problems detected,"
1406 " please check your install!\n") % problems)
1406 " please check your install!\n") % problems)
1407
1407
1408 return problems
1408 return problems
1409
1409
1410 def debugrename(ui, repo, file1, *pats, **opts):
1410 def debugrename(ui, repo, file1, *pats, **opts):
1411 """dump rename information"""
1411 """dump rename information"""
1412
1412
1413 ctx = repo[opts.get('rev')]
1413 ctx = repo[opts.get('rev')]
1414 m = cmdutil.match(repo, (file1,) + pats, opts)
1414 m = cmdutil.match(repo, (file1,) + pats, opts)
1415 for abs in ctx.walk(m):
1415 for abs in ctx.walk(m):
1416 fctx = ctx[abs]
1416 fctx = ctx[abs]
1417 o = fctx.filelog().renamed(fctx.filenode())
1417 o = fctx.filelog().renamed(fctx.filenode())
1418 rel = m.rel(abs)
1418 rel = m.rel(abs)
1419 if o:
1419 if o:
1420 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1420 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1421 else:
1421 else:
1422 ui.write(_("%s not renamed\n") % rel)
1422 ui.write(_("%s not renamed\n") % rel)
1423
1423
1424 def debugwalk(ui, repo, *pats, **opts):
1424 def debugwalk(ui, repo, *pats, **opts):
1425 """show how files match on given patterns"""
1425 """show how files match on given patterns"""
1426 m = cmdutil.match(repo, pats, opts)
1426 m = cmdutil.match(repo, pats, opts)
1427 items = list(repo.walk(m))
1427 items = list(repo.walk(m))
1428 if not items:
1428 if not items:
1429 return
1429 return
1430 fmt = 'f %%-%ds %%-%ds %%s' % (
1430 fmt = 'f %%-%ds %%-%ds %%s' % (
1431 max([len(abs) for abs in items]),
1431 max([len(abs) for abs in items]),
1432 max([len(m.rel(abs)) for abs in items]))
1432 max([len(m.rel(abs)) for abs in items]))
1433 for abs in items:
1433 for abs in items:
1434 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1434 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1435 ui.write("%s\n" % line.rstrip())
1435 ui.write("%s\n" % line.rstrip())
1436
1436
1437 def diff(ui, repo, *pats, **opts):
1437 def diff(ui, repo, *pats, **opts):
1438 """diff repository (or selected files)
1438 """diff repository (or selected files)
1439
1439
1440 Show differences between revisions for the specified files.
1440 Show differences between revisions for the specified files.
1441
1441
1442 Differences between files are shown using the unified diff format.
1442 Differences between files are shown using the unified diff format.
1443
1443
1444 .. note::
1444 .. note::
1445 diff may generate unexpected results for merges, as it will
1445 diff may generate unexpected results for merges, as it will
1446 default to comparing against the working directory's first
1446 default to comparing against the working directory's first
1447 parent changeset if no revisions are specified.
1447 parent changeset if no revisions are specified.
1448
1448
1449 When two revision arguments are given, then changes are shown
1449 When two revision arguments are given, then changes are shown
1450 between those revisions. If only one revision is specified then
1450 between those revisions. If only one revision is specified then
1451 that revision is compared to the working directory, and, when no
1451 that revision is compared to the working directory, and, when no
1452 revisions are specified, the working directory files are compared
1452 revisions are specified, the working directory files are compared
1453 to its parent.
1453 to its parent.
1454
1454
1455 Alternatively you can specify -c/--change with a revision to see
1455 Alternatively you can specify -c/--change with a revision to see
1456 the changes in that changeset relative to its first parent.
1456 the changes in that changeset relative to its first parent.
1457
1457
1458 Without the -a/--text option, diff will avoid generating diffs of
1458 Without the -a/--text option, diff will avoid generating diffs of
1459 files it detects as binary. With -a, diff will generate a diff
1459 files it detects as binary. With -a, diff will generate a diff
1460 anyway, probably with undesirable results.
1460 anyway, probably with undesirable results.
1461
1461
1462 Use the -g/--git option to generate diffs in the git extended diff
1462 Use the -g/--git option to generate diffs in the git extended diff
1463 format. For more information, read :hg:`help diffs`.
1463 format. For more information, read :hg:`help diffs`.
1464
1464
1465 Returns 0 on success.
1465 Returns 0 on success.
1466 """
1466 """
1467
1467
1468 revs = opts.get('rev')
1468 revs = opts.get('rev')
1469 change = opts.get('change')
1469 change = opts.get('change')
1470 stat = opts.get('stat')
1470 stat = opts.get('stat')
1471 reverse = opts.get('reverse')
1471 reverse = opts.get('reverse')
1472
1472
1473 if revs and change:
1473 if revs and change:
1474 msg = _('cannot specify --rev and --change at the same time')
1474 msg = _('cannot specify --rev and --change at the same time')
1475 raise util.Abort(msg)
1475 raise util.Abort(msg)
1476 elif change:
1476 elif change:
1477 node2 = repo.lookup(change)
1477 node2 = repo.lookup(change)
1478 node1 = repo[node2].parents()[0].node()
1478 node1 = repo[node2].parents()[0].node()
1479 else:
1479 else:
1480 node1, node2 = cmdutil.revpair(repo, revs)
1480 node1, node2 = cmdutil.revpair(repo, revs)
1481
1481
1482 if reverse:
1482 if reverse:
1483 node1, node2 = node2, node1
1483 node1, node2 = node2, node1
1484
1484
1485 diffopts = patch.diffopts(ui, opts)
1485 diffopts = patch.diffopts(ui, opts)
1486 m = cmdutil.match(repo, pats, opts)
1486 m = cmdutil.match(repo, pats, opts)
1487 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
1487 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
1488 listsubrepos=opts.get('subrepos'))
1488 listsubrepos=opts.get('subrepos'))
1489
1489
1490 def export(ui, repo, *changesets, **opts):
1490 def export(ui, repo, *changesets, **opts):
1491 """dump the header and diffs for one or more changesets
1491 """dump the header and diffs for one or more changesets
1492
1492
1493 Print the changeset header and diffs for one or more revisions.
1493 Print the changeset header and diffs for one or more revisions.
1494
1494
1495 The information shown in the changeset header is: author, date,
1495 The information shown in the changeset header is: author, date,
1496 branch name (if non-default), changeset hash, parent(s) and commit
1496 branch name (if non-default), changeset hash, parent(s) and commit
1497 comment.
1497 comment.
1498
1498
1499 .. note::
1499 .. note::
1500 export may generate unexpected diff output for merge
1500 export may generate unexpected diff output for merge
1501 changesets, as it will compare the merge changeset against its
1501 changesets, as it will compare the merge changeset against its
1502 first parent only.
1502 first parent only.
1503
1503
1504 Output may be to a file, in which case the name of the file is
1504 Output may be to a file, in which case the name of the file is
1505 given using a format string. The formatting rules are as follows:
1505 given using a format string. The formatting rules are as follows:
1506
1506
1507 :``%%``: literal "%" character
1507 :``%%``: literal "%" character
1508 :``%H``: changeset hash (40 hexadecimal digits)
1508 :``%H``: changeset hash (40 hexadecimal digits)
1509 :``%N``: number of patches being generated
1509 :``%N``: number of patches being generated
1510 :``%R``: changeset revision number
1510 :``%R``: changeset revision number
1511 :``%b``: basename of the exporting repository
1511 :``%b``: basename of the exporting repository
1512 :``%h``: short-form changeset hash (12 hexadecimal digits)
1512 :``%h``: short-form changeset hash (12 hexadecimal digits)
1513 :``%n``: zero-padded sequence number, starting at 1
1513 :``%n``: zero-padded sequence number, starting at 1
1514 :``%r``: zero-padded changeset revision number
1514 :``%r``: zero-padded changeset revision number
1515
1515
1516 Without the -a/--text option, export will avoid generating diffs
1516 Without the -a/--text option, export will avoid generating diffs
1517 of files it detects as binary. With -a, export will generate a
1517 of files it detects as binary. With -a, export will generate a
1518 diff anyway, probably with undesirable results.
1518 diff anyway, probably with undesirable results.
1519
1519
1520 Use the -g/--git option to generate diffs in the git extended diff
1520 Use the -g/--git option to generate diffs in the git extended diff
1521 format. See :hg:`help diffs` for more information.
1521 format. See :hg:`help diffs` for more information.
1522
1522
1523 With the --switch-parent option, the diff will be against the
1523 With the --switch-parent option, the diff will be against the
1524 second parent. It can be useful to review a merge.
1524 second parent. It can be useful to review a merge.
1525
1525
1526 Returns 0 on success.
1526 Returns 0 on success.
1527 """
1527 """
1528 changesets += tuple(opts.get('rev', []))
1528 changesets += tuple(opts.get('rev', []))
1529 if not changesets:
1529 if not changesets:
1530 raise util.Abort(_("export requires at least one changeset"))
1530 raise util.Abort(_("export requires at least one changeset"))
1531 revs = cmdutil.revrange(repo, changesets)
1531 revs = cmdutil.revrange(repo, changesets)
1532 if len(revs) > 1:
1532 if len(revs) > 1:
1533 ui.note(_('exporting patches:\n'))
1533 ui.note(_('exporting patches:\n'))
1534 else:
1534 else:
1535 ui.note(_('exporting patch:\n'))
1535 ui.note(_('exporting patch:\n'))
1536 cmdutil.export(repo, revs, template=opts.get('output'),
1536 cmdutil.export(repo, revs, template=opts.get('output'),
1537 switch_parent=opts.get('switch_parent'),
1537 switch_parent=opts.get('switch_parent'),
1538 opts=patch.diffopts(ui, opts))
1538 opts=patch.diffopts(ui, opts))
1539
1539
1540 def forget(ui, repo, *pats, **opts):
1540 def forget(ui, repo, *pats, **opts):
1541 """forget the specified files on the next commit
1541 """forget the specified files on the next commit
1542
1542
1543 Mark the specified files so they will no longer be tracked
1543 Mark the specified files so they will no longer be tracked
1544 after the next commit.
1544 after the next commit.
1545
1545
1546 This only removes files from the current branch, not from the
1546 This only removes files from the current branch, not from the
1547 entire project history, and it does not delete them from the
1547 entire project history, and it does not delete them from the
1548 working directory.
1548 working directory.
1549
1549
1550 To undo a forget before the next commit, see :hg:`add`.
1550 To undo a forget before the next commit, see :hg:`add`.
1551
1551
1552 Returns 0 on success.
1552 Returns 0 on success.
1553 """
1553 """
1554
1554
1555 if not pats:
1555 if not pats:
1556 raise util.Abort(_('no files specified'))
1556 raise util.Abort(_('no files specified'))
1557
1557
1558 m = cmdutil.match(repo, pats, opts)
1558 m = cmdutil.match(repo, pats, opts)
1559 s = repo.status(match=m, clean=True)
1559 s = repo.status(match=m, clean=True)
1560 forget = sorted(s[0] + s[1] + s[3] + s[6])
1560 forget = sorted(s[0] + s[1] + s[3] + s[6])
1561 errs = 0
1561 errs = 0
1562
1562
1563 for f in m.files():
1563 for f in m.files():
1564 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1564 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1565 ui.warn(_('not removing %s: file is already untracked\n')
1565 ui.warn(_('not removing %s: file is already untracked\n')
1566 % m.rel(f))
1566 % m.rel(f))
1567 errs = 1
1567 errs = 1
1568
1568
1569 for f in forget:
1569 for f in forget:
1570 if ui.verbose or not m.exact(f):
1570 if ui.verbose or not m.exact(f):
1571 ui.status(_('removing %s\n') % m.rel(f))
1571 ui.status(_('removing %s\n') % m.rel(f))
1572
1572
1573 repo[None].remove(forget, unlink=False)
1573 repo[None].remove(forget, unlink=False)
1574 return errs
1574 return errs
1575
1575
1576 def grep(ui, repo, pattern, *pats, **opts):
1576 def grep(ui, repo, pattern, *pats, **opts):
1577 """search for a pattern in specified files and revisions
1577 """search for a pattern in specified files and revisions
1578
1578
1579 Search revisions of files for a regular expression.
1579 Search revisions of files for a regular expression.
1580
1580
1581 This command behaves differently than Unix grep. It only accepts
1581 This command behaves differently than Unix grep. It only accepts
1582 Python/Perl regexps. It searches repository history, not the
1582 Python/Perl regexps. It searches repository history, not the
1583 working directory. It always prints the revision number in which a
1583 working directory. It always prints the revision number in which a
1584 match appears.
1584 match appears.
1585
1585
1586 By default, grep only prints output for the first revision of a
1586 By default, grep only prints output for the first revision of a
1587 file in which it finds a match. To get it to print every revision
1587 file in which it finds a match. To get it to print every revision
1588 that contains a change in match status ("-" for a match that
1588 that contains a change in match status ("-" for a match that
1589 becomes a non-match, or "+" for a non-match that becomes a match),
1589 becomes a non-match, or "+" for a non-match that becomes a match),
1590 use the --all flag.
1590 use the --all flag.
1591
1591
1592 Returns 0 if a match is found, 1 otherwise.
1592 Returns 0 if a match is found, 1 otherwise.
1593 """
1593 """
1594 reflags = 0
1594 reflags = 0
1595 if opts.get('ignore_case'):
1595 if opts.get('ignore_case'):
1596 reflags |= re.I
1596 reflags |= re.I
1597 try:
1597 try:
1598 regexp = re.compile(pattern, reflags)
1598 regexp = re.compile(pattern, reflags)
1599 except re.error, inst:
1599 except re.error, inst:
1600 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1600 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1601 return 1
1601 return 1
1602 sep, eol = ':', '\n'
1602 sep, eol = ':', '\n'
1603 if opts.get('print0'):
1603 if opts.get('print0'):
1604 sep = eol = '\0'
1604 sep = eol = '\0'
1605
1605
1606 getfile = util.lrucachefunc(repo.file)
1606 getfile = util.lrucachefunc(repo.file)
1607
1607
1608 def matchlines(body):
1608 def matchlines(body):
1609 begin = 0
1609 begin = 0
1610 linenum = 0
1610 linenum = 0
1611 while True:
1611 while True:
1612 match = regexp.search(body, begin)
1612 match = regexp.search(body, begin)
1613 if not match:
1613 if not match:
1614 break
1614 break
1615 mstart, mend = match.span()
1615 mstart, mend = match.span()
1616 linenum += body.count('\n', begin, mstart) + 1
1616 linenum += body.count('\n', begin, mstart) + 1
1617 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1617 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1618 begin = body.find('\n', mend) + 1 or len(body)
1618 begin = body.find('\n', mend) + 1 or len(body)
1619 lend = begin - 1
1619 lend = begin - 1
1620 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1620 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1621
1621
1622 class linestate(object):
1622 class linestate(object):
1623 def __init__(self, line, linenum, colstart, colend):
1623 def __init__(self, line, linenum, colstart, colend):
1624 self.line = line
1624 self.line = line
1625 self.linenum = linenum
1625 self.linenum = linenum
1626 self.colstart = colstart
1626 self.colstart = colstart
1627 self.colend = colend
1627 self.colend = colend
1628
1628
1629 def __hash__(self):
1629 def __hash__(self):
1630 return hash((self.linenum, self.line))
1630 return hash((self.linenum, self.line))
1631
1631
1632 def __eq__(self, other):
1632 def __eq__(self, other):
1633 return self.line == other.line
1633 return self.line == other.line
1634
1634
1635 matches = {}
1635 matches = {}
1636 copies = {}
1636 copies = {}
1637 def grepbody(fn, rev, body):
1637 def grepbody(fn, rev, body):
1638 matches[rev].setdefault(fn, [])
1638 matches[rev].setdefault(fn, [])
1639 m = matches[rev][fn]
1639 m = matches[rev][fn]
1640 for lnum, cstart, cend, line in matchlines(body):
1640 for lnum, cstart, cend, line in matchlines(body):
1641 s = linestate(line, lnum, cstart, cend)
1641 s = linestate(line, lnum, cstart, cend)
1642 m.append(s)
1642 m.append(s)
1643
1643
1644 def difflinestates(a, b):
1644 def difflinestates(a, b):
1645 sm = difflib.SequenceMatcher(None, a, b)
1645 sm = difflib.SequenceMatcher(None, a, b)
1646 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1646 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1647 if tag == 'insert':
1647 if tag == 'insert':
1648 for i in xrange(blo, bhi):
1648 for i in xrange(blo, bhi):
1649 yield ('+', b[i])
1649 yield ('+', b[i])
1650 elif tag == 'delete':
1650 elif tag == 'delete':
1651 for i in xrange(alo, ahi):
1651 for i in xrange(alo, ahi):
1652 yield ('-', a[i])
1652 yield ('-', a[i])
1653 elif tag == 'replace':
1653 elif tag == 'replace':
1654 for i in xrange(alo, ahi):
1654 for i in xrange(alo, ahi):
1655 yield ('-', a[i])
1655 yield ('-', a[i])
1656 for i in xrange(blo, bhi):
1656 for i in xrange(blo, bhi):
1657 yield ('+', b[i])
1657 yield ('+', b[i])
1658
1658
1659 def display(fn, ctx, pstates, states):
1659 def display(fn, ctx, pstates, states):
1660 rev = ctx.rev()
1660 rev = ctx.rev()
1661 datefunc = ui.quiet and util.shortdate or util.datestr
1661 datefunc = ui.quiet and util.shortdate or util.datestr
1662 found = False
1662 found = False
1663 filerevmatches = {}
1663 filerevmatches = {}
1664 if opts.get('all'):
1664 if opts.get('all'):
1665 iter = difflinestates(pstates, states)
1665 iter = difflinestates(pstates, states)
1666 else:
1666 else:
1667 iter = [('', l) for l in states]
1667 iter = [('', l) for l in states]
1668 for change, l in iter:
1668 for change, l in iter:
1669 cols = [fn, str(rev)]
1669 cols = [fn, str(rev)]
1670 before, match, after = None, None, None
1670 before, match, after = None, None, None
1671 if opts.get('line_number'):
1671 if opts.get('line_number'):
1672 cols.append(str(l.linenum))
1672 cols.append(str(l.linenum))
1673 if opts.get('all'):
1673 if opts.get('all'):
1674 cols.append(change)
1674 cols.append(change)
1675 if opts.get('user'):
1675 if opts.get('user'):
1676 cols.append(ui.shortuser(ctx.user()))
1676 cols.append(ui.shortuser(ctx.user()))
1677 if opts.get('date'):
1677 if opts.get('date'):
1678 cols.append(datefunc(ctx.date()))
1678 cols.append(datefunc(ctx.date()))
1679 if opts.get('files_with_matches'):
1679 if opts.get('files_with_matches'):
1680 c = (fn, rev)
1680 c = (fn, rev)
1681 if c in filerevmatches:
1681 if c in filerevmatches:
1682 continue
1682 continue
1683 filerevmatches[c] = 1
1683 filerevmatches[c] = 1
1684 else:
1684 else:
1685 before = l.line[:l.colstart]
1685 before = l.line[:l.colstart]
1686 match = l.line[l.colstart:l.colend]
1686 match = l.line[l.colstart:l.colend]
1687 after = l.line[l.colend:]
1687 after = l.line[l.colend:]
1688 ui.write(sep.join(cols))
1688 ui.write(sep.join(cols))
1689 if before is not None:
1689 if before is not None:
1690 ui.write(sep + before)
1690 ui.write(sep + before)
1691 ui.write(match, label='grep.match')
1691 ui.write(match, label='grep.match')
1692 ui.write(after)
1692 ui.write(after)
1693 ui.write(eol)
1693 ui.write(eol)
1694 found = True
1694 found = True
1695 return found
1695 return found
1696
1696
1697 skip = {}
1697 skip = {}
1698 revfiles = {}
1698 revfiles = {}
1699 matchfn = cmdutil.match(repo, pats, opts)
1699 matchfn = cmdutil.match(repo, pats, opts)
1700 found = False
1700 found = False
1701 follow = opts.get('follow')
1701 follow = opts.get('follow')
1702
1702
1703 def prep(ctx, fns):
1703 def prep(ctx, fns):
1704 rev = ctx.rev()
1704 rev = ctx.rev()
1705 pctx = ctx.parents()[0]
1705 pctx = ctx.parents()[0]
1706 parent = pctx.rev()
1706 parent = pctx.rev()
1707 matches.setdefault(rev, {})
1707 matches.setdefault(rev, {})
1708 matches.setdefault(parent, {})
1708 matches.setdefault(parent, {})
1709 files = revfiles.setdefault(rev, [])
1709 files = revfiles.setdefault(rev, [])
1710 for fn in fns:
1710 for fn in fns:
1711 flog = getfile(fn)
1711 flog = getfile(fn)
1712 try:
1712 try:
1713 fnode = ctx.filenode(fn)
1713 fnode = ctx.filenode(fn)
1714 except error.LookupError:
1714 except error.LookupError:
1715 continue
1715 continue
1716
1716
1717 copied = flog.renamed(fnode)
1717 copied = flog.renamed(fnode)
1718 copy = follow and copied and copied[0]
1718 copy = follow and copied and copied[0]
1719 if copy:
1719 if copy:
1720 copies.setdefault(rev, {})[fn] = copy
1720 copies.setdefault(rev, {})[fn] = copy
1721 if fn in skip:
1721 if fn in skip:
1722 if copy:
1722 if copy:
1723 skip[copy] = True
1723 skip[copy] = True
1724 continue
1724 continue
1725 files.append(fn)
1725 files.append(fn)
1726
1726
1727 if fn not in matches[rev]:
1727 if fn not in matches[rev]:
1728 grepbody(fn, rev, flog.read(fnode))
1728 grepbody(fn, rev, flog.read(fnode))
1729
1729
1730 pfn = copy or fn
1730 pfn = copy or fn
1731 if pfn not in matches[parent]:
1731 if pfn not in matches[parent]:
1732 try:
1732 try:
1733 fnode = pctx.filenode(pfn)
1733 fnode = pctx.filenode(pfn)
1734 grepbody(pfn, parent, flog.read(fnode))
1734 grepbody(pfn, parent, flog.read(fnode))
1735 except error.LookupError:
1735 except error.LookupError:
1736 pass
1736 pass
1737
1737
1738 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1738 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1739 rev = ctx.rev()
1739 rev = ctx.rev()
1740 parent = ctx.parents()[0].rev()
1740 parent = ctx.parents()[0].rev()
1741 for fn in sorted(revfiles.get(rev, [])):
1741 for fn in sorted(revfiles.get(rev, [])):
1742 states = matches[rev][fn]
1742 states = matches[rev][fn]
1743 copy = copies.get(rev, {}).get(fn)
1743 copy = copies.get(rev, {}).get(fn)
1744 if fn in skip:
1744 if fn in skip:
1745 if copy:
1745 if copy:
1746 skip[copy] = True
1746 skip[copy] = True
1747 continue
1747 continue
1748 pstates = matches.get(parent, {}).get(copy or fn, [])
1748 pstates = matches.get(parent, {}).get(copy or fn, [])
1749 if pstates or states:
1749 if pstates or states:
1750 r = display(fn, ctx, pstates, states)
1750 r = display(fn, ctx, pstates, states)
1751 found = found or r
1751 found = found or r
1752 if r and not opts.get('all'):
1752 if r and not opts.get('all'):
1753 skip[fn] = True
1753 skip[fn] = True
1754 if copy:
1754 if copy:
1755 skip[copy] = True
1755 skip[copy] = True
1756 del matches[rev]
1756 del matches[rev]
1757 del revfiles[rev]
1757 del revfiles[rev]
1758
1758
1759 return not found
1759 return not found
1760
1760
1761 def heads(ui, repo, *branchrevs, **opts):
1761 def heads(ui, repo, *branchrevs, **opts):
1762 """show current repository heads or show branch heads
1762 """show current repository heads or show branch heads
1763
1763
1764 With no arguments, show all repository branch heads.
1764 With no arguments, show all repository branch heads.
1765
1765
1766 Repository "heads" are changesets with no child changesets. They are
1766 Repository "heads" are changesets with no child changesets. They are
1767 where development generally takes place and are the usual targets
1767 where development generally takes place and are the usual targets
1768 for update and merge operations. Branch heads are changesets that have
1768 for update and merge operations. Branch heads are changesets that have
1769 no child changeset on the same branch.
1769 no child changeset on the same branch.
1770
1770
1771 If one or more REVs are given, only branch heads on the branches
1771 If one or more REVs are given, only branch heads on the branches
1772 associated with the specified changesets are shown.
1772 associated with the specified changesets are shown.
1773
1773
1774 If -c/--closed is specified, also show branch heads marked closed
1774 If -c/--closed is specified, also show branch heads marked closed
1775 (see :hg:`commit --close-branch`).
1775 (see :hg:`commit --close-branch`).
1776
1776
1777 If STARTREV is specified, only those heads that are descendants of
1777 If STARTREV is specified, only those heads that are descendants of
1778 STARTREV will be displayed.
1778 STARTREV will be displayed.
1779
1779
1780 If -t/--topo is specified, named branch mechanics will be ignored and only
1780 If -t/--topo is specified, named branch mechanics will be ignored and only
1781 changesets without children will be shown.
1781 changesets without children will be shown.
1782
1782
1783 Returns 0 if matching heads are found, 1 if not.
1783 Returns 0 if matching heads are found, 1 if not.
1784 """
1784 """
1785
1785
1786 if opts.get('rev'):
1786 if opts.get('rev'):
1787 start = repo.lookup(opts['rev'])
1787 start = repo.lookup(opts['rev'])
1788 else:
1788 else:
1789 start = None
1789 start = None
1790
1790
1791 if opts.get('topo'):
1791 if opts.get('topo'):
1792 heads = [repo[h] for h in repo.heads(start)]
1792 heads = [repo[h] for h in repo.heads(start)]
1793 else:
1793 else:
1794 heads = []
1794 heads = []
1795 for b, ls in repo.branchmap().iteritems():
1795 for b, ls in repo.branchmap().iteritems():
1796 if start is None:
1796 if start is None:
1797 heads += [repo[h] for h in ls]
1797 heads += [repo[h] for h in ls]
1798 continue
1798 continue
1799 startrev = repo.changelog.rev(start)
1799 startrev = repo.changelog.rev(start)
1800 descendants = set(repo.changelog.descendants(startrev))
1800 descendants = set(repo.changelog.descendants(startrev))
1801 descendants.add(startrev)
1801 descendants.add(startrev)
1802 rev = repo.changelog.rev
1802 rev = repo.changelog.rev
1803 heads += [repo[h] for h in ls if rev(h) in descendants]
1803 heads += [repo[h] for h in ls if rev(h) in descendants]
1804
1804
1805 if branchrevs:
1805 if branchrevs:
1806 decode, encode = encoding.fromlocal, encoding.tolocal
1806 decode, encode = encoding.fromlocal, encoding.tolocal
1807 branches = set(repo[decode(br)].branch() for br in branchrevs)
1807 branches = set(repo[decode(br)].branch() for br in branchrevs)
1808 heads = [h for h in heads if h.branch() in branches]
1808 heads = [h for h in heads if h.branch() in branches]
1809
1809
1810 if not opts.get('closed'):
1810 if not opts.get('closed'):
1811 heads = [h for h in heads if not h.extra().get('close')]
1811 heads = [h for h in heads if not h.extra().get('close')]
1812
1812
1813 if opts.get('active') and branchrevs:
1813 if opts.get('active') and branchrevs:
1814 dagheads = repo.heads(start)
1814 dagheads = repo.heads(start)
1815 heads = [h for h in heads if h.node() in dagheads]
1815 heads = [h for h in heads if h.node() in dagheads]
1816
1816
1817 if branchrevs:
1817 if branchrevs:
1818 haveheads = set(h.branch() for h in heads)
1818 haveheads = set(h.branch() for h in heads)
1819 if branches - haveheads:
1819 if branches - haveheads:
1820 headless = ', '.join(encode(b) for b in branches - haveheads)
1820 headless = ', '.join(encode(b) for b in branches - haveheads)
1821 msg = _('no open branch heads found on branches %s')
1821 msg = _('no open branch heads found on branches %s')
1822 if opts.get('rev'):
1822 if opts.get('rev'):
1823 msg += _(' (started at %s)' % opts['rev'])
1823 msg += _(' (started at %s)' % opts['rev'])
1824 ui.warn((msg + '\n') % headless)
1824 ui.warn((msg + '\n') % headless)
1825
1825
1826 if not heads:
1826 if not heads:
1827 return 1
1827 return 1
1828
1828
1829 heads = sorted(heads, key=lambda x: -x.rev())
1829 heads = sorted(heads, key=lambda x: -x.rev())
1830 displayer = cmdutil.show_changeset(ui, repo, opts)
1830 displayer = cmdutil.show_changeset(ui, repo, opts)
1831 for ctx in heads:
1831 for ctx in heads:
1832 displayer.show(ctx)
1832 displayer.show(ctx)
1833 displayer.close()
1833 displayer.close()
1834
1834
1835 def help_(ui, name=None, with_version=False, unknowncmd=False):
1835 def help_(ui, name=None, with_version=False, unknowncmd=False):
1836 """show help for a given topic or a help overview
1836 """show help for a given topic or a help overview
1837
1837
1838 With no arguments, print a list of commands with short help messages.
1838 With no arguments, print a list of commands with short help messages.
1839
1839
1840 Given a topic, extension, or command name, print help for that
1840 Given a topic, extension, or command name, print help for that
1841 topic.
1841 topic.
1842
1842
1843 Returns 0 if successful.
1843 Returns 0 if successful.
1844 """
1844 """
1845 option_lists = []
1845 option_lists = []
1846 textwidth = ui.termwidth() - 2
1846 textwidth = ui.termwidth() - 2
1847
1847
1848 def addglobalopts(aliases):
1848 def addglobalopts(aliases):
1849 if ui.verbose:
1849 if ui.verbose:
1850 option_lists.append((_("global options:"), globalopts))
1850 option_lists.append((_("global options:"), globalopts))
1851 if name == 'shortlist':
1851 if name == 'shortlist':
1852 option_lists.append((_('use "hg help" for the full list '
1852 option_lists.append((_('use "hg help" for the full list '
1853 'of commands'), ()))
1853 'of commands'), ()))
1854 else:
1854 else:
1855 if name == 'shortlist':
1855 if name == 'shortlist':
1856 msg = _('use "hg help" for the full list of commands '
1856 msg = _('use "hg help" for the full list of commands '
1857 'or "hg -v" for details')
1857 'or "hg -v" for details')
1858 elif aliases:
1858 elif aliases:
1859 msg = _('use "hg -v help%s" to show aliases and '
1859 msg = _('use "hg -v help%s" to show aliases and '
1860 'global options') % (name and " " + name or "")
1860 'global options') % (name and " " + name or "")
1861 else:
1861 else:
1862 msg = _('use "hg -v help %s" to show global options') % name
1862 msg = _('use "hg -v help %s" to show global options') % name
1863 option_lists.append((msg, ()))
1863 option_lists.append((msg, ()))
1864
1864
1865 def helpcmd(name):
1865 def helpcmd(name):
1866 if with_version:
1866 if with_version:
1867 version_(ui)
1867 version_(ui)
1868 ui.write('\n')
1868 ui.write('\n')
1869
1869
1870 try:
1870 try:
1871 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1871 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1872 except error.AmbiguousCommand, inst:
1872 except error.AmbiguousCommand, inst:
1873 # py3k fix: except vars can't be used outside the scope of the
1873 # py3k fix: except vars can't be used outside the scope of the
1874 # except block, nor can be used inside a lambda. python issue4617
1874 # except block, nor can be used inside a lambda. python issue4617
1875 prefix = inst.args[0]
1875 prefix = inst.args[0]
1876 select = lambda c: c.lstrip('^').startswith(prefix)
1876 select = lambda c: c.lstrip('^').startswith(prefix)
1877 helplist(_('list of commands:\n\n'), select)
1877 helplist(_('list of commands:\n\n'), select)
1878 return
1878 return
1879
1879
1880 # check if it's an invalid alias and display its error if it is
1880 # check if it's an invalid alias and display its error if it is
1881 if getattr(entry[0], 'badalias', False):
1881 if getattr(entry[0], 'badalias', False):
1882 if not unknowncmd:
1882 if not unknowncmd:
1883 entry[0](ui)
1883 entry[0](ui)
1884 return
1884 return
1885
1885
1886 # synopsis
1886 # synopsis
1887 if len(entry) > 2:
1887 if len(entry) > 2:
1888 if entry[2].startswith('hg'):
1888 if entry[2].startswith('hg'):
1889 ui.write("%s\n" % entry[2])
1889 ui.write("%s\n" % entry[2])
1890 else:
1890 else:
1891 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1891 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1892 else:
1892 else:
1893 ui.write('hg %s\n' % aliases[0])
1893 ui.write('hg %s\n' % aliases[0])
1894
1894
1895 # aliases
1895 # aliases
1896 if not ui.quiet and len(aliases) > 1:
1896 if not ui.quiet and len(aliases) > 1:
1897 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1897 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1898
1898
1899 # description
1899 # description
1900 doc = gettext(entry[0].__doc__)
1900 doc = gettext(entry[0].__doc__)
1901 if not doc:
1901 if not doc:
1902 doc = _("(no help text available)")
1902 doc = _("(no help text available)")
1903 if hasattr(entry[0], 'definition'): # aliased command
1903 if hasattr(entry[0], 'definition'): # aliased command
1904 if entry[0].definition.startswith('!'): # shell alias
1904 if entry[0].definition.startswith('!'): # shell alias
1905 doc = _('shell alias for::\n\n %s') % entry[0].definition[1:]
1905 doc = _('shell alias for::\n\n %s') % entry[0].definition[1:]
1906 else:
1906 else:
1907 doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
1907 doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
1908 if ui.quiet:
1908 if ui.quiet:
1909 doc = doc.splitlines()[0]
1909 doc = doc.splitlines()[0]
1910 keep = ui.verbose and ['verbose'] or []
1910 keep = ui.verbose and ['verbose'] or []
1911 formatted, pruned = minirst.format(doc, textwidth, keep=keep)
1911 formatted, pruned = minirst.format(doc, textwidth, keep=keep)
1912 ui.write("\n%s\n" % formatted)
1912 ui.write("\n%s\n" % formatted)
1913 if pruned:
1913 if pruned:
1914 ui.write(_('\nuse "hg -v help %s" to show verbose help\n') % name)
1914 ui.write(_('\nuse "hg -v help %s" to show verbose help\n') % name)
1915
1915
1916 if not ui.quiet:
1916 if not ui.quiet:
1917 # options
1917 # options
1918 if entry[1]:
1918 if entry[1]:
1919 option_lists.append((_("options:\n"), entry[1]))
1919 option_lists.append((_("options:\n"), entry[1]))
1920
1920
1921 addglobalopts(False)
1921 addglobalopts(False)
1922
1922
1923 def helplist(header, select=None):
1923 def helplist(header, select=None):
1924 h = {}
1924 h = {}
1925 cmds = {}
1925 cmds = {}
1926 for c, e in table.iteritems():
1926 for c, e in table.iteritems():
1927 f = c.split("|", 1)[0]
1927 f = c.split("|", 1)[0]
1928 if select and not select(f):
1928 if select and not select(f):
1929 continue
1929 continue
1930 if (not select and name != 'shortlist' and
1930 if (not select and name != 'shortlist' and
1931 e[0].__module__ != __name__):
1931 e[0].__module__ != __name__):
1932 continue
1932 continue
1933 if name == "shortlist" and not f.startswith("^"):
1933 if name == "shortlist" and not f.startswith("^"):
1934 continue
1934 continue
1935 f = f.lstrip("^")
1935 f = f.lstrip("^")
1936 if not ui.debugflag and f.startswith("debug"):
1936 if not ui.debugflag and f.startswith("debug"):
1937 continue
1937 continue
1938 doc = e[0].__doc__
1938 doc = e[0].__doc__
1939 if doc and 'DEPRECATED' in doc and not ui.verbose:
1939 if doc and 'DEPRECATED' in doc and not ui.verbose:
1940 continue
1940 continue
1941 doc = gettext(doc)
1941 doc = gettext(doc)
1942 if not doc:
1942 if not doc:
1943 doc = _("(no help text available)")
1943 doc = _("(no help text available)")
1944 h[f] = doc.splitlines()[0].rstrip()
1944 h[f] = doc.splitlines()[0].rstrip()
1945 cmds[f] = c.lstrip("^")
1945 cmds[f] = c.lstrip("^")
1946
1946
1947 if not h:
1947 if not h:
1948 ui.status(_('no commands defined\n'))
1948 ui.status(_('no commands defined\n'))
1949 return
1949 return
1950
1950
1951 ui.status(header)
1951 ui.status(header)
1952 fns = sorted(h)
1952 fns = sorted(h)
1953 m = max(map(len, fns))
1953 m = max(map(len, fns))
1954 for f in fns:
1954 for f in fns:
1955 if ui.verbose:
1955 if ui.verbose:
1956 commands = cmds[f].replace("|",", ")
1956 commands = cmds[f].replace("|",", ")
1957 ui.write(" %s:\n %s\n"%(commands, h[f]))
1957 ui.write(" %s:\n %s\n"%(commands, h[f]))
1958 else:
1958 else:
1959 ui.write('%s\n' % (util.wrap(h[f], textwidth,
1959 ui.write('%s\n' % (util.wrap(h[f], textwidth,
1960 initindent=' %-*s ' % (m, f),
1960 initindent=' %-*s ' % (m, f),
1961 hangindent=' ' * (m + 4))))
1961 hangindent=' ' * (m + 4))))
1962
1962
1963 if not ui.quiet:
1963 if not ui.quiet:
1964 addglobalopts(True)
1964 addglobalopts(True)
1965
1965
1966 def helptopic(name):
1966 def helptopic(name):
1967 for names, header, doc in help.helptable:
1967 for names, header, doc in help.helptable:
1968 if name in names:
1968 if name in names:
1969 break
1969 break
1970 else:
1970 else:
1971 raise error.UnknownCommand(name)
1971 raise error.UnknownCommand(name)
1972
1972
1973 # description
1973 # description
1974 if not doc:
1974 if not doc:
1975 doc = _("(no help text available)")
1975 doc = _("(no help text available)")
1976 if hasattr(doc, '__call__'):
1976 if hasattr(doc, '__call__'):
1977 doc = doc()
1977 doc = doc()
1978
1978
1979 ui.write("%s\n\n" % header)
1979 ui.write("%s\n\n" % header)
1980 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1980 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1981
1981
1982 def helpext(name):
1982 def helpext(name):
1983 try:
1983 try:
1984 mod = extensions.find(name)
1984 mod = extensions.find(name)
1985 doc = gettext(mod.__doc__) or _('no help text available')
1985 doc = gettext(mod.__doc__) or _('no help text available')
1986 except KeyError:
1986 except KeyError:
1987 mod = None
1987 mod = None
1988 doc = extensions.disabledext(name)
1988 doc = extensions.disabledext(name)
1989 if not doc:
1989 if not doc:
1990 raise error.UnknownCommand(name)
1990 raise error.UnknownCommand(name)
1991
1991
1992 if '\n' not in doc:
1992 if '\n' not in doc:
1993 head, tail = doc, ""
1993 head, tail = doc, ""
1994 else:
1994 else:
1995 head, tail = doc.split('\n', 1)
1995 head, tail = doc.split('\n', 1)
1996 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1996 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1997 if tail:
1997 if tail:
1998 ui.write(minirst.format(tail, textwidth))
1998 ui.write(minirst.format(tail, textwidth))
1999 ui.status('\n\n')
1999 ui.status('\n\n')
2000
2000
2001 if mod:
2001 if mod:
2002 try:
2002 try:
2003 ct = mod.cmdtable
2003 ct = mod.cmdtable
2004 except AttributeError:
2004 except AttributeError:
2005 ct = {}
2005 ct = {}
2006 modcmds = set([c.split('|', 1)[0] for c in ct])
2006 modcmds = set([c.split('|', 1)[0] for c in ct])
2007 helplist(_('list of commands:\n\n'), modcmds.__contains__)
2007 helplist(_('list of commands:\n\n'), modcmds.__contains__)
2008 else:
2008 else:
2009 ui.write(_('use "hg help extensions" for information on enabling '
2009 ui.write(_('use "hg help extensions" for information on enabling '
2010 'extensions\n'))
2010 'extensions\n'))
2011
2011
2012 def helpextcmd(name):
2012 def helpextcmd(name):
2013 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
2013 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
2014 doc = gettext(mod.__doc__).splitlines()[0]
2014 doc = gettext(mod.__doc__).splitlines()[0]
2015
2015
2016 msg = help.listexts(_("'%s' is provided by the following "
2016 msg = help.listexts(_("'%s' is provided by the following "
2017 "extension:") % cmd, {ext: doc}, len(ext),
2017 "extension:") % cmd, {ext: doc}, len(ext),
2018 indent=4)
2018 indent=4)
2019 ui.write(minirst.format(msg, textwidth))
2019 ui.write(minirst.format(msg, textwidth))
2020 ui.write('\n\n')
2020 ui.write('\n\n')
2021 ui.write(_('use "hg help extensions" for information on enabling '
2021 ui.write(_('use "hg help extensions" for information on enabling '
2022 'extensions\n'))
2022 'extensions\n'))
2023
2023
2024 if name and name != 'shortlist':
2024 if name and name != 'shortlist':
2025 i = None
2025 i = None
2026 if unknowncmd:
2026 if unknowncmd:
2027 queries = (helpextcmd,)
2027 queries = (helpextcmd,)
2028 else:
2028 else:
2029 queries = (helptopic, helpcmd, helpext, helpextcmd)
2029 queries = (helptopic, helpcmd, helpext, helpextcmd)
2030 for f in queries:
2030 for f in queries:
2031 try:
2031 try:
2032 f(name)
2032 f(name)
2033 i = None
2033 i = None
2034 break
2034 break
2035 except error.UnknownCommand, inst:
2035 except error.UnknownCommand, inst:
2036 i = inst
2036 i = inst
2037 if i:
2037 if i:
2038 raise i
2038 raise i
2039
2039
2040 else:
2040 else:
2041 # program name
2041 # program name
2042 if ui.verbose or with_version:
2042 if ui.verbose or with_version:
2043 version_(ui)
2043 version_(ui)
2044 else:
2044 else:
2045 ui.status(_("Mercurial Distributed SCM\n"))
2045 ui.status(_("Mercurial Distributed SCM\n"))
2046 ui.status('\n')
2046 ui.status('\n')
2047
2047
2048 # list of commands
2048 # list of commands
2049 if name == "shortlist":
2049 if name == "shortlist":
2050 header = _('basic commands:\n\n')
2050 header = _('basic commands:\n\n')
2051 else:
2051 else:
2052 header = _('list of commands:\n\n')
2052 header = _('list of commands:\n\n')
2053
2053
2054 helplist(header)
2054 helplist(header)
2055 if name != 'shortlist':
2055 if name != 'shortlist':
2056 exts, maxlength = extensions.enabled()
2056 exts, maxlength = extensions.enabled()
2057 text = help.listexts(_('enabled extensions:'), exts, maxlength)
2057 text = help.listexts(_('enabled extensions:'), exts, maxlength)
2058 if text:
2058 if text:
2059 ui.write("\n%s\n" % minirst.format(text, textwidth))
2059 ui.write("\n%s\n" % minirst.format(text, textwidth))
2060
2060
2061 # list all option lists
2061 # list all option lists
2062 opt_output = []
2062 opt_output = []
2063 multioccur = False
2063 multioccur = False
2064 for title, options in option_lists:
2064 for title, options in option_lists:
2065 opt_output.append(("\n%s" % title, None))
2065 opt_output.append(("\n%s" % title, None))
2066 for option in options:
2066 for option in options:
2067 if len(option) == 5:
2067 if len(option) == 5:
2068 shortopt, longopt, default, desc, optlabel = option
2068 shortopt, longopt, default, desc, optlabel = option
2069 else:
2069 else:
2070 shortopt, longopt, default, desc = option
2070 shortopt, longopt, default, desc = option
2071 optlabel = _("VALUE") # default label
2071 optlabel = _("VALUE") # default label
2072
2072
2073 if _("DEPRECATED") in desc and not ui.verbose:
2073 if _("DEPRECATED") in desc and not ui.verbose:
2074 continue
2074 continue
2075 if isinstance(default, list):
2075 if isinstance(default, list):
2076 numqualifier = " %s [+]" % optlabel
2076 numqualifier = " %s [+]" % optlabel
2077 multioccur = True
2077 multioccur = True
2078 elif (default is not None) and not isinstance(default, bool):
2078 elif (default is not None) and not isinstance(default, bool):
2079 numqualifier = " %s" % optlabel
2079 numqualifier = " %s" % optlabel
2080 else:
2080 else:
2081 numqualifier = ""
2081 numqualifier = ""
2082 opt_output.append(("%2s%s" %
2082 opt_output.append(("%2s%s" %
2083 (shortopt and "-%s" % shortopt,
2083 (shortopt and "-%s" % shortopt,
2084 longopt and " --%s%s" %
2084 longopt and " --%s%s" %
2085 (longopt, numqualifier)),
2085 (longopt, numqualifier)),
2086 "%s%s" % (desc,
2086 "%s%s" % (desc,
2087 default
2087 default
2088 and _(" (default: %s)") % default
2088 and _(" (default: %s)") % default
2089 or "")))
2089 or "")))
2090 if multioccur:
2090 if multioccur:
2091 msg = _("\n[+] marked option can be specified multiple times")
2091 msg = _("\n[+] marked option can be specified multiple times")
2092 if ui.verbose and name != 'shortlist':
2092 if ui.verbose and name != 'shortlist':
2093 opt_output.append((msg, None))
2093 opt_output.append((msg, None))
2094 else:
2094 else:
2095 opt_output.insert(-1, (msg, None))
2095 opt_output.insert(-1, (msg, None))
2096
2096
2097 if not name:
2097 if not name:
2098 ui.write(_("\nadditional help topics:\n\n"))
2098 ui.write(_("\nadditional help topics:\n\n"))
2099 topics = []
2099 topics = []
2100 for names, header, doc in help.helptable:
2100 for names, header, doc in help.helptable:
2101 topics.append((sorted(names, key=len, reverse=True)[0], header))
2101 topics.append((sorted(names, key=len, reverse=True)[0], header))
2102 topics_len = max([len(s[0]) for s in topics])
2102 topics_len = max([len(s[0]) for s in topics])
2103 for t, desc in topics:
2103 for t, desc in topics:
2104 ui.write(" %-*s %s\n" % (topics_len, t, desc))
2104 ui.write(" %-*s %s\n" % (topics_len, t, desc))
2105
2105
2106 if opt_output:
2106 if opt_output:
2107 colwidth = encoding.colwidth
2107 colwidth = encoding.colwidth
2108 # normalize: (opt or message, desc or None, width of opt)
2108 # normalize: (opt or message, desc or None, width of opt)
2109 entries = [desc and (opt, desc, colwidth(opt)) or (opt, None, 0)
2109 entries = [desc and (opt, desc, colwidth(opt)) or (opt, None, 0)
2110 for opt, desc in opt_output]
2110 for opt, desc in opt_output]
2111 hanging = max([e[2] for e in entries])
2111 hanging = max([e[2] for e in entries])
2112 for opt, desc, width in entries:
2112 for opt, desc, width in entries:
2113 if desc:
2113 if desc:
2114 initindent = ' %s%s ' % (opt, ' ' * (hanging - width))
2114 initindent = ' %s%s ' % (opt, ' ' * (hanging - width))
2115 hangindent = ' ' * (hanging + 3)
2115 hangindent = ' ' * (hanging + 3)
2116 ui.write('%s\n' % (util.wrap(desc, textwidth,
2116 ui.write('%s\n' % (util.wrap(desc, textwidth,
2117 initindent=initindent,
2117 initindent=initindent,
2118 hangindent=hangindent)))
2118 hangindent=hangindent)))
2119 else:
2119 else:
2120 ui.write("%s\n" % opt)
2120 ui.write("%s\n" % opt)
2121
2121
2122 def identify(ui, repo, source=None,
2122 def identify(ui, repo, source=None,
2123 rev=None, num=None, id=None, branch=None, tags=None):
2123 rev=None, num=None, id=None, branch=None, tags=None):
2124 """identify the working copy or specified revision
2124 """identify the working copy or specified revision
2125
2125
2126 With no revision, print a summary of the current state of the
2126 With no revision, print a summary of the current state of the
2127 repository.
2127 repository.
2128
2128
2129 Specifying a path to a repository root or Mercurial bundle will
2129 Specifying a path to a repository root or Mercurial bundle will
2130 cause lookup to operate on that repository/bundle.
2130 cause lookup to operate on that repository/bundle.
2131
2131
2132 This summary identifies the repository state using one or two
2132 This summary identifies the repository state using one or two
2133 parent hash identifiers, followed by a "+" if there are
2133 parent hash identifiers, followed by a "+" if there are
2134 uncommitted changes in the working directory, a list of tags for
2134 uncommitted changes in the working directory, a list of tags for
2135 this revision and a branch name for non-default branches.
2135 this revision and a branch name for non-default branches.
2136
2136
2137 Returns 0 if successful.
2137 Returns 0 if successful.
2138 """
2138 """
2139
2139
2140 if not repo and not source:
2140 if not repo and not source:
2141 raise util.Abort(_("there is no Mercurial repository here "
2141 raise util.Abort(_("there is no Mercurial repository here "
2142 "(.hg not found)"))
2142 "(.hg not found)"))
2143
2143
2144 hexfunc = ui.debugflag and hex or short
2144 hexfunc = ui.debugflag and hex or short
2145 default = not (num or id or branch or tags)
2145 default = not (num or id or branch or tags)
2146 output = []
2146 output = []
2147
2147
2148 revs = []
2148 revs = []
2149 if source:
2149 if source:
2150 source, branches = hg.parseurl(ui.expandpath(source))
2150 source, branches = hg.parseurl(ui.expandpath(source))
2151 repo = hg.repository(ui, source)
2151 repo = hg.repository(ui, source)
2152 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
2152 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
2153
2153
2154 if not repo.local():
2154 if not repo.local():
2155 if not rev and revs:
2155 if not rev and revs:
2156 rev = revs[0]
2156 rev = revs[0]
2157 if not rev:
2157 if not rev:
2158 rev = "tip"
2158 rev = "tip"
2159 if num or branch or tags:
2159 if num or branch or tags:
2160 raise util.Abort(
2160 raise util.Abort(
2161 "can't query remote revision number, branch, or tags")
2161 "can't query remote revision number, branch, or tags")
2162 output = [hexfunc(repo.lookup(rev))]
2162 output = [hexfunc(repo.lookup(rev))]
2163 elif not rev:
2163 elif not rev:
2164 ctx = repo[None]
2164 ctx = repo[None]
2165 parents = ctx.parents()
2165 parents = ctx.parents()
2166 changed = False
2166 changed = False
2167 if default or id or num:
2167 if default or id or num:
2168 changed = util.any(repo.status())
2168 changed = util.any(repo.status())
2169 if default or id:
2169 if default or id:
2170 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
2170 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
2171 (changed) and "+" or "")]
2171 (changed) and "+" or "")]
2172 if num:
2172 if num:
2173 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
2173 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
2174 (changed) and "+" or ""))
2174 (changed) and "+" or ""))
2175 else:
2175 else:
2176 ctx = repo[rev]
2176 ctx = repo[rev]
2177 if default or id:
2177 if default or id:
2178 output = [hexfunc(ctx.node())]
2178 output = [hexfunc(ctx.node())]
2179 if num:
2179 if num:
2180 output.append(str(ctx.rev()))
2180 output.append(str(ctx.rev()))
2181
2181
2182 if repo.local() and default and not ui.quiet:
2182 if repo.local() and default and not ui.quiet:
2183 b = encoding.tolocal(ctx.branch())
2183 b = encoding.tolocal(ctx.branch())
2184 if b != 'default':
2184 if b != 'default':
2185 output.append("(%s)" % b)
2185 output.append("(%s)" % b)
2186
2186
2187 # multiple tags for a single parent separated by '/'
2187 # multiple tags for a single parent separated by '/'
2188 t = "/".join(ctx.tags())
2188 t = "/".join(ctx.tags())
2189 if t:
2189 if t:
2190 output.append(t)
2190 output.append(t)
2191
2191
2192 if branch:
2192 if branch:
2193 output.append(encoding.tolocal(ctx.branch()))
2193 output.append(encoding.tolocal(ctx.branch()))
2194
2194
2195 if tags:
2195 if tags:
2196 output.extend(ctx.tags())
2196 output.extend(ctx.tags())
2197
2197
2198 ui.write("%s\n" % ' '.join(output))
2198 ui.write("%s\n" % ' '.join(output))
2199
2199
2200 def import_(ui, repo, patch1, *patches, **opts):
2200 def import_(ui, repo, patch1, *patches, **opts):
2201 """import an ordered set of patches
2201 """import an ordered set of patches
2202
2202
2203 Import a list of patches and commit them individually (unless
2203 Import a list of patches and commit them individually (unless
2204 --no-commit is specified).
2204 --no-commit is specified).
2205
2205
2206 If there are outstanding changes in the working directory, import
2206 If there are outstanding changes in the working directory, import
2207 will abort unless given the -f/--force flag.
2207 will abort unless given the -f/--force flag.
2208
2208
2209 You can import a patch straight from a mail message. Even patches
2209 You can import a patch straight from a mail message. Even patches
2210 as attachments work (to use the body part, it must have type
2210 as attachments work (to use the body part, it must have type
2211 text/plain or text/x-patch). From and Subject headers of email
2211 text/plain or text/x-patch). From and Subject headers of email
2212 message are used as default committer and commit message. All
2212 message are used as default committer and commit message. All
2213 text/plain body parts before first diff are added to commit
2213 text/plain body parts before first diff are added to commit
2214 message.
2214 message.
2215
2215
2216 If the imported patch was generated by :hg:`export`, user and
2216 If the imported patch was generated by :hg:`export`, user and
2217 description from patch override values from message headers and
2217 description from patch override values from message headers and
2218 body. Values given on command line with -m/--message and -u/--user
2218 body. Values given on command line with -m/--message and -u/--user
2219 override these.
2219 override these.
2220
2220
2221 If --exact is specified, import will set the working directory to
2221 If --exact is specified, import will set the working directory to
2222 the parent of each patch before applying it, and will abort if the
2222 the parent of each patch before applying it, and will abort if the
2223 resulting changeset has a different ID than the one recorded in
2223 resulting changeset has a different ID than the one recorded in
2224 the patch. This may happen due to character set problems or other
2224 the patch. This may happen due to character set problems or other
2225 deficiencies in the text patch format.
2225 deficiencies in the text patch format.
2226
2226
2227 With -s/--similarity, hg will attempt to discover renames and
2227 With -s/--similarity, hg will attempt to discover renames and
2228 copies in the patch in the same way as 'addremove'.
2228 copies in the patch in the same way as 'addremove'.
2229
2229
2230 To read a patch from standard input, use "-" as the patch name. If
2230 To read a patch from standard input, use "-" as the patch name. If
2231 a URL is specified, the patch will be downloaded from it.
2231 a URL is specified, the patch will be downloaded from it.
2232 See :hg:`help dates` for a list of formats valid for -d/--date.
2232 See :hg:`help dates` for a list of formats valid for -d/--date.
2233
2233
2234 Returns 0 on success.
2234 Returns 0 on success.
2235 """
2235 """
2236 patches = (patch1,) + patches
2236 patches = (patch1,) + patches
2237
2237
2238 date = opts.get('date')
2238 date = opts.get('date')
2239 if date:
2239 if date:
2240 opts['date'] = util.parsedate(date)
2240 opts['date'] = util.parsedate(date)
2241
2241
2242 try:
2242 try:
2243 sim = float(opts.get('similarity') or 0)
2243 sim = float(opts.get('similarity') or 0)
2244 except ValueError:
2244 except ValueError:
2245 raise util.Abort(_('similarity must be a number'))
2245 raise util.Abort(_('similarity must be a number'))
2246 if sim < 0 or sim > 100:
2246 if sim < 0 or sim > 100:
2247 raise util.Abort(_('similarity must be between 0 and 100'))
2247 raise util.Abort(_('similarity must be between 0 and 100'))
2248
2248
2249 if opts.get('exact') or not opts.get('force'):
2249 if opts.get('exact') or not opts.get('force'):
2250 cmdutil.bail_if_changed(repo)
2250 cmdutil.bail_if_changed(repo)
2251
2251
2252 d = opts["base"]
2252 d = opts["base"]
2253 strip = opts["strip"]
2253 strip = opts["strip"]
2254 wlock = lock = None
2254 wlock = lock = None
2255
2255
2256 def tryone(ui, hunk):
2256 def tryone(ui, hunk):
2257 tmpname, message, user, date, branch, nodeid, p1, p2 = \
2257 tmpname, message, user, date, branch, nodeid, p1, p2 = \
2258 patch.extract(ui, hunk)
2258 patch.extract(ui, hunk)
2259
2259
2260 if not tmpname:
2260 if not tmpname:
2261 return None
2261 return None
2262 commitid = _('to working directory')
2262 commitid = _('to working directory')
2263
2263
2264 try:
2264 try:
2265 cmdline_message = cmdutil.logmessage(opts)
2265 cmdline_message = cmdutil.logmessage(opts)
2266 if cmdline_message:
2266 if cmdline_message:
2267 # pickup the cmdline msg
2267 # pickup the cmdline msg
2268 message = cmdline_message
2268 message = cmdline_message
2269 elif message:
2269 elif message:
2270 # pickup the patch msg
2270 # pickup the patch msg
2271 message = message.strip()
2271 message = message.strip()
2272 else:
2272 else:
2273 # launch the editor
2273 # launch the editor
2274 message = None
2274 message = None
2275 ui.debug('message:\n%s\n' % message)
2275 ui.debug('message:\n%s\n' % message)
2276
2276
2277 wp = repo.parents()
2277 wp = repo.parents()
2278 if opts.get('exact'):
2278 if opts.get('exact'):
2279 if not nodeid or not p1:
2279 if not nodeid or not p1:
2280 raise util.Abort(_('not a Mercurial patch'))
2280 raise util.Abort(_('not a Mercurial patch'))
2281 p1 = repo.lookup(p1)
2281 p1 = repo.lookup(p1)
2282 p2 = repo.lookup(p2 or hex(nullid))
2282 p2 = repo.lookup(p2 or hex(nullid))
2283
2283
2284 if p1 != wp[0].node():
2284 if p1 != wp[0].node():
2285 hg.clean(repo, p1)
2285 hg.clean(repo, p1)
2286 repo.dirstate.setparents(p1, p2)
2286 repo.dirstate.setparents(p1, p2)
2287 elif p2:
2287 elif p2:
2288 try:
2288 try:
2289 p1 = repo.lookup(p1)
2289 p1 = repo.lookup(p1)
2290 p2 = repo.lookup(p2)
2290 p2 = repo.lookup(p2)
2291 if p1 == wp[0].node():
2291 if p1 == wp[0].node():
2292 repo.dirstate.setparents(p1, p2)
2292 repo.dirstate.setparents(p1, p2)
2293 except error.RepoError:
2293 except error.RepoError:
2294 pass
2294 pass
2295 if opts.get('exact') or opts.get('import_branch'):
2295 if opts.get('exact') or opts.get('import_branch'):
2296 repo.dirstate.setbranch(branch or 'default')
2296 repo.dirstate.setbranch(branch or 'default')
2297
2297
2298 files = {}
2298 files = {}
2299 try:
2299 try:
2300 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
2300 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
2301 files=files, eolmode=None)
2301 files=files, eolmode=None)
2302 finally:
2302 finally:
2303 files = cmdutil.updatedir(ui, repo, files,
2303 files = cmdutil.updatedir(ui, repo, files,
2304 similarity=sim / 100.0)
2304 similarity=sim / 100.0)
2305 if not opts.get('no_commit'):
2305 if not opts.get('no_commit'):
2306 if opts.get('exact'):
2306 if opts.get('exact'):
2307 m = None
2307 m = None
2308 else:
2308 else:
2309 m = cmdutil.matchfiles(repo, files or [])
2309 m = cmdutil.matchfiles(repo, files or [])
2310 n = repo.commit(message, opts.get('user') or user,
2310 n = repo.commit(message, opts.get('user') or user,
2311 opts.get('date') or date, match=m,
2311 opts.get('date') or date, match=m,
2312 editor=cmdutil.commiteditor)
2312 editor=cmdutil.commiteditor)
2313 if opts.get('exact'):
2313 if opts.get('exact'):
2314 if hex(n) != nodeid:
2314 if hex(n) != nodeid:
2315 repo.rollback()
2315 repo.rollback()
2316 raise util.Abort(_('patch is damaged'
2316 raise util.Abort(_('patch is damaged'
2317 ' or loses information'))
2317 ' or loses information'))
2318 # Force a dirstate write so that the next transaction
2318 # Force a dirstate write so that the next transaction
2319 # backups an up-do-date file.
2319 # backups an up-do-date file.
2320 repo.dirstate.write()
2320 repo.dirstate.write()
2321 if n:
2321 if n:
2322 commitid = short(n)
2322 commitid = short(n)
2323
2323
2324 return commitid
2324 return commitid
2325 finally:
2325 finally:
2326 os.unlink(tmpname)
2326 os.unlink(tmpname)
2327
2327
2328 try:
2328 try:
2329 wlock = repo.wlock()
2329 wlock = repo.wlock()
2330 lock = repo.lock()
2330 lock = repo.lock()
2331 lastcommit = None
2331 lastcommit = None
2332 for p in patches:
2332 for p in patches:
2333 pf = os.path.join(d, p)
2333 pf = os.path.join(d, p)
2334
2334
2335 if pf == '-':
2335 if pf == '-':
2336 ui.status(_("applying patch from stdin\n"))
2336 ui.status(_("applying patch from stdin\n"))
2337 pf = sys.stdin
2337 pf = sys.stdin
2338 else:
2338 else:
2339 ui.status(_("applying %s\n") % p)
2339 ui.status(_("applying %s\n") % p)
2340 pf = url.open(ui, pf)
2340 pf = url.open(ui, pf)
2341
2341
2342 haspatch = False
2342 haspatch = False
2343 for hunk in patch.split(pf):
2343 for hunk in patch.split(pf):
2344 commitid = tryone(ui, hunk)
2344 commitid = tryone(ui, hunk)
2345 if commitid:
2345 if commitid:
2346 haspatch = True
2346 haspatch = True
2347 if lastcommit:
2347 if lastcommit:
2348 ui.status(_('applied %s\n') % lastcommit)
2348 ui.status(_('applied %s\n') % lastcommit)
2349 lastcommit = commitid
2349 lastcommit = commitid
2350
2350
2351 if not haspatch:
2351 if not haspatch:
2352 raise util.Abort(_('no diffs found'))
2352 raise util.Abort(_('no diffs found'))
2353
2353
2354 finally:
2354 finally:
2355 release(lock, wlock)
2355 release(lock, wlock)
2356
2356
2357 def incoming(ui, repo, source="default", **opts):
2357 def incoming(ui, repo, source="default", **opts):
2358 """show new changesets found in source
2358 """show new changesets found in source
2359
2359
2360 Show new changesets found in the specified path/URL or the default
2360 Show new changesets found in the specified path/URL or the default
2361 pull location. These are the changesets that would have been pulled
2361 pull location. These are the changesets that would have been pulled
2362 if a pull at the time you issued this command.
2362 if a pull at the time you issued this command.
2363
2363
2364 For remote repository, using --bundle avoids downloading the
2364 For remote repository, using --bundle avoids downloading the
2365 changesets twice if the incoming is followed by a pull.
2365 changesets twice if the incoming is followed by a pull.
2366
2366
2367 See pull for valid source format details.
2367 See pull for valid source format details.
2368
2368
2369 Returns 0 if there are incoming changes, 1 otherwise.
2369 Returns 0 if there are incoming changes, 1 otherwise.
2370 """
2370 """
2371 if opts.get('bundle') and opts.get('subrepos'):
2371 if opts.get('bundle') and opts.get('subrepos'):
2372 raise util.Abort(_('cannot combine --bundle and --subrepos'))
2372 raise util.Abort(_('cannot combine --bundle and --subrepos'))
2373
2373
2374 ret = hg.incoming(ui, repo, source, opts)
2374 ret = hg.incoming(ui, repo, source, opts)
2375 return ret
2375 return ret
2376
2376
2377 def init(ui, dest=".", **opts):
2377 def init(ui, dest=".", **opts):
2378 """create a new repository in the given directory
2378 """create a new repository in the given directory
2379
2379
2380 Initialize a new repository in the given directory. If the given
2380 Initialize a new repository in the given directory. If the given
2381 directory does not exist, it will be created.
2381 directory does not exist, it will be created.
2382
2382
2383 If no directory is given, the current directory is used.
2383 If no directory is given, the current directory is used.
2384
2384
2385 It is possible to specify an ``ssh://`` URL as the destination.
2385 It is possible to specify an ``ssh://`` URL as the destination.
2386 See :hg:`help urls` for more information.
2386 See :hg:`help urls` for more information.
2387
2387
2388 Returns 0 on success.
2388 Returns 0 on success.
2389 """
2389 """
2390 hg.repository(hg.remoteui(ui, opts), ui.expandpath(dest), create=1)
2390 hg.repository(hg.remoteui(ui, opts), ui.expandpath(dest), create=1)
2391
2391
2392 def locate(ui, repo, *pats, **opts):
2392 def locate(ui, repo, *pats, **opts):
2393 """locate files matching specific patterns
2393 """locate files matching specific patterns
2394
2394
2395 Print files under Mercurial control in the working directory whose
2395 Print files under Mercurial control in the working directory whose
2396 names match the given patterns.
2396 names match the given patterns.
2397
2397
2398 By default, this command searches all directories in the working
2398 By default, this command searches all directories in the working
2399 directory. To search just the current directory and its
2399 directory. To search just the current directory and its
2400 subdirectories, use "--include .".
2400 subdirectories, use "--include .".
2401
2401
2402 If no patterns are given to match, this command prints the names
2402 If no patterns are given to match, this command prints the names
2403 of all files under Mercurial control in the working directory.
2403 of all files under Mercurial control in the working directory.
2404
2404
2405 If you want to feed the output of this command into the "xargs"
2405 If you want to feed the output of this command into the "xargs"
2406 command, use the -0 option to both this command and "xargs". This
2406 command, use the -0 option to both this command and "xargs". This
2407 will avoid the problem of "xargs" treating single filenames that
2407 will avoid the problem of "xargs" treating single filenames that
2408 contain whitespace as multiple filenames.
2408 contain whitespace as multiple filenames.
2409
2409
2410 Returns 0 if a match is found, 1 otherwise.
2410 Returns 0 if a match is found, 1 otherwise.
2411 """
2411 """
2412 end = opts.get('print0') and '\0' or '\n'
2412 end = opts.get('print0') and '\0' or '\n'
2413 rev = opts.get('rev') or None
2413 rev = opts.get('rev') or None
2414
2414
2415 ret = 1
2415 ret = 1
2416 m = cmdutil.match(repo, pats, opts, default='relglob')
2416 m = cmdutil.match(repo, pats, opts, default='relglob')
2417 m.bad = lambda x, y: False
2417 m.bad = lambda x, y: False
2418 for abs in repo[rev].walk(m):
2418 for abs in repo[rev].walk(m):
2419 if not rev and abs not in repo.dirstate:
2419 if not rev and abs not in repo.dirstate:
2420 continue
2420 continue
2421 if opts.get('fullpath'):
2421 if opts.get('fullpath'):
2422 ui.write(repo.wjoin(abs), end)
2422 ui.write(repo.wjoin(abs), end)
2423 else:
2423 else:
2424 ui.write(((pats and m.rel(abs)) or abs), end)
2424 ui.write(((pats and m.rel(abs)) or abs), end)
2425 ret = 0
2425 ret = 0
2426
2426
2427 return ret
2427 return ret
2428
2428
2429 def log(ui, repo, *pats, **opts):
2429 def log(ui, repo, *pats, **opts):
2430 """show revision history of entire repository or files
2430 """show revision history of entire repository or files
2431
2431
2432 Print the revision history of the specified files or the entire
2432 Print the revision history of the specified files or the entire
2433 project.
2433 project.
2434
2434
2435 File history is shown without following rename or copy history of
2435 File history is shown without following rename or copy history of
2436 files. Use -f/--follow with a filename to follow history across
2436 files. Use -f/--follow with a filename to follow history across
2437 renames and copies. --follow without a filename will only show
2437 renames and copies. --follow without a filename will only show
2438 ancestors or descendants of the starting revision. --follow-first
2438 ancestors or descendants of the starting revision. --follow-first
2439 only follows the first parent of merge revisions.
2439 only follows the first parent of merge revisions.
2440
2440
2441 If no revision range is specified, the default is tip:0 unless
2441 If no revision range is specified, the default is tip:0 unless
2442 --follow is set, in which case the working directory parent is
2442 --follow is set, in which case the working directory parent is
2443 used as the starting revision. You can specify a revision set for
2443 used as the starting revision. You can specify a revision set for
2444 log, see :hg:`help revsets` for more information.
2444 log, see :hg:`help revsets` for more information.
2445
2445
2446 See :hg:`help dates` for a list of formats valid for -d/--date.
2446 See :hg:`help dates` for a list of formats valid for -d/--date.
2447
2447
2448 By default this command prints revision number and changeset id,
2448 By default this command prints revision number and changeset id,
2449 tags, non-trivial parents, user, date and time, and a summary for
2449 tags, non-trivial parents, user, date and time, and a summary for
2450 each commit. When the -v/--verbose switch is used, the list of
2450 each commit. When the -v/--verbose switch is used, the list of
2451 changed files and full commit message are shown.
2451 changed files and full commit message are shown.
2452
2452
2453 .. note::
2453 .. note::
2454 log -p/--patch may generate unexpected diff output for merge
2454 log -p/--patch may generate unexpected diff output for merge
2455 changesets, as it will only compare the merge changeset against
2455 changesets, as it will only compare the merge changeset against
2456 its first parent. Also, only files different from BOTH parents
2456 its first parent. Also, only files different from BOTH parents
2457 will appear in files:.
2457 will appear in files:.
2458
2458
2459 Returns 0 on success.
2459 Returns 0 on success.
2460 """
2460 """
2461
2461
2462 matchfn = cmdutil.match(repo, pats, opts)
2462 matchfn = cmdutil.match(repo, pats, opts)
2463 limit = cmdutil.loglimit(opts)
2463 limit = cmdutil.loglimit(opts)
2464 count = 0
2464 count = 0
2465
2465
2466 endrev = None
2466 endrev = None
2467 if opts.get('copies') and opts.get('rev'):
2467 if opts.get('copies') and opts.get('rev'):
2468 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2468 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2469
2469
2470 df = False
2470 df = False
2471 if opts["date"]:
2471 if opts["date"]:
2472 df = util.matchdate(opts["date"])
2472 df = util.matchdate(opts["date"])
2473
2473
2474 branches = opts.get('branch', []) + opts.get('only_branch', [])
2474 branches = opts.get('branch', []) + opts.get('only_branch', [])
2475 opts['branch'] = [repo.lookupbranch(b) for b in branches]
2475 opts['branch'] = [repo.lookupbranch(b) for b in branches]
2476
2476
2477 displayer = cmdutil.show_changeset(ui, repo, opts, True)
2477 displayer = cmdutil.show_changeset(ui, repo, opts, True)
2478 def prep(ctx, fns):
2478 def prep(ctx, fns):
2479 rev = ctx.rev()
2479 rev = ctx.rev()
2480 parents = [p for p in repo.changelog.parentrevs(rev)
2480 parents = [p for p in repo.changelog.parentrevs(rev)
2481 if p != nullrev]
2481 if p != nullrev]
2482 if opts.get('no_merges') and len(parents) == 2:
2482 if opts.get('no_merges') and len(parents) == 2:
2483 return
2483 return
2484 if opts.get('only_merges') and len(parents) != 2:
2484 if opts.get('only_merges') and len(parents) != 2:
2485 return
2485 return
2486 if opts.get('branch') and ctx.branch() not in opts['branch']:
2486 if opts.get('branch') and ctx.branch() not in opts['branch']:
2487 return
2487 return
2488 if df and not df(ctx.date()[0]):
2488 if df and not df(ctx.date()[0]):
2489 return
2489 return
2490 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2490 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2491 return
2491 return
2492 if opts.get('keyword'):
2492 if opts.get('keyword'):
2493 for k in [kw.lower() for kw in opts['keyword']]:
2493 for k in [kw.lower() for kw in opts['keyword']]:
2494 if (k in ctx.user().lower() or
2494 if (k in ctx.user().lower() or
2495 k in ctx.description().lower() or
2495 k in ctx.description().lower() or
2496 k in " ".join(ctx.files()).lower()):
2496 k in " ".join(ctx.files()).lower()):
2497 break
2497 break
2498 else:
2498 else:
2499 return
2499 return
2500
2500
2501 copies = None
2501 copies = None
2502 if opts.get('copies') and rev:
2502 if opts.get('copies') and rev:
2503 copies = []
2503 copies = []
2504 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2504 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2505 for fn in ctx.files():
2505 for fn in ctx.files():
2506 rename = getrenamed(fn, rev)
2506 rename = getrenamed(fn, rev)
2507 if rename:
2507 if rename:
2508 copies.append((fn, rename[0]))
2508 copies.append((fn, rename[0]))
2509
2509
2510 revmatchfn = None
2510 revmatchfn = None
2511 if opts.get('patch') or opts.get('stat'):
2511 if opts.get('patch') or opts.get('stat'):
2512 if opts.get('follow') or opts.get('follow_first'):
2512 if opts.get('follow') or opts.get('follow_first'):
2513 # note: this might be wrong when following through merges
2513 # note: this might be wrong when following through merges
2514 revmatchfn = cmdutil.match(repo, fns, default='path')
2514 revmatchfn = cmdutil.match(repo, fns, default='path')
2515 else:
2515 else:
2516 revmatchfn = matchfn
2516 revmatchfn = matchfn
2517
2517
2518 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
2518 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
2519
2519
2520 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2520 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2521 if count == limit:
2521 if count == limit:
2522 break
2522 break
2523 if displayer.flush(ctx.rev()):
2523 if displayer.flush(ctx.rev()):
2524 count += 1
2524 count += 1
2525 displayer.close()
2525 displayer.close()
2526
2526
2527 def manifest(ui, repo, node=None, rev=None):
2527 def manifest(ui, repo, node=None, rev=None):
2528 """output the current or given revision of the project manifest
2528 """output the current or given revision of the project manifest
2529
2529
2530 Print a list of version controlled files for the given revision.
2530 Print a list of version controlled files for the given revision.
2531 If no revision is given, the first parent of the working directory
2531 If no revision is given, the first parent of the working directory
2532 is used, or the null revision if no revision is checked out.
2532 is used, or the null revision if no revision is checked out.
2533
2533
2534 With -v, print file permissions, symlink and executable bits.
2534 With -v, print file permissions, symlink and executable bits.
2535 With --debug, print file revision hashes.
2535 With --debug, print file revision hashes.
2536
2536
2537 Returns 0 on success.
2537 Returns 0 on success.
2538 """
2538 """
2539
2539
2540 if rev and node:
2540 if rev and node:
2541 raise util.Abort(_("please specify just one revision"))
2541 raise util.Abort(_("please specify just one revision"))
2542
2542
2543 if not node:
2543 if not node:
2544 node = rev
2544 node = rev
2545
2545
2546 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2546 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2547 ctx = repo[node]
2547 ctx = repo[node]
2548 for f in ctx:
2548 for f in ctx:
2549 if ui.debugflag:
2549 if ui.debugflag:
2550 ui.write("%40s " % hex(ctx.manifest()[f]))
2550 ui.write("%40s " % hex(ctx.manifest()[f]))
2551 if ui.verbose:
2551 if ui.verbose:
2552 ui.write(decor[ctx.flags(f)])
2552 ui.write(decor[ctx.flags(f)])
2553 ui.write("%s\n" % f)
2553 ui.write("%s\n" % f)
2554
2554
2555 def merge(ui, repo, node=None, **opts):
2555 def merge(ui, repo, node=None, **opts):
2556 """merge working directory with another revision
2556 """merge working directory with another revision
2557
2557
2558 The current working directory is updated with all changes made in
2558 The current working directory is updated with all changes made in
2559 the requested revision since the last common predecessor revision.
2559 the requested revision since the last common predecessor revision.
2560
2560
2561 Files that changed between either parent are marked as changed for
2561 Files that changed between either parent are marked as changed for
2562 the next commit and a commit must be performed before any further
2562 the next commit and a commit must be performed before any further
2563 updates to the repository are allowed. The next commit will have
2563 updates to the repository are allowed. The next commit will have
2564 two parents.
2564 two parents.
2565
2565
2566 ``--tool`` can be used to specify the merge tool used for file
2567 merges. It overrides the HGMERGE environment variable and your
2568 configuration files.
2569
2566 If no revision is specified, the working directory's parent is a
2570 If no revision is specified, the working directory's parent is a
2567 head revision, and the current branch contains exactly one other
2571 head revision, and the current branch contains exactly one other
2568 head, the other head is merged with by default. Otherwise, an
2572 head, the other head is merged with by default. Otherwise, an
2569 explicit revision with which to merge with must be provided.
2573 explicit revision with which to merge with must be provided.
2570
2574
2575 :hg:`resolve` must be used to resolve unresolved files.
2576
2571 To undo an uncommitted merge, use :hg:`update --clean .` which
2577 To undo an uncommitted merge, use :hg:`update --clean .` which
2572 will check out a clean copy of the original merge parent, losing
2578 will check out a clean copy of the original merge parent, losing
2573 all changes.
2579 all changes.
2574
2580
2575 Returns 0 on success, 1 if there are unresolved files.
2581 Returns 0 on success, 1 if there are unresolved files.
2576 """
2582 """
2577
2583
2578 if opts.get('rev') and node:
2584 if opts.get('rev') and node:
2579 raise util.Abort(_("please specify just one revision"))
2585 raise util.Abort(_("please specify just one revision"))
2580 if not node:
2586 if not node:
2581 node = opts.get('rev')
2587 node = opts.get('rev')
2582
2588
2589 t = opts.get('tool')
2590 if t:
2591 if 'HGMERGE' in os.environ:
2592 os.environ['HGMERGE'] = t
2593 ui.setconfig('ui', 'merge', t)
2594
2583 if not node:
2595 if not node:
2584 branch = repo.changectx(None).branch()
2596 branch = repo.changectx(None).branch()
2585 bheads = repo.branchheads(branch)
2597 bheads = repo.branchheads(branch)
2586 if len(bheads) > 2:
2598 if len(bheads) > 2:
2587 raise util.Abort(_(
2599 raise util.Abort(_(
2588 'branch \'%s\' has %d heads - '
2600 'branch \'%s\' has %d heads - '
2589 'please merge with an explicit rev\n'
2601 'please merge with an explicit rev\n'
2590 '(run \'hg heads .\' to see heads)')
2602 '(run \'hg heads .\' to see heads)')
2591 % (branch, len(bheads)))
2603 % (branch, len(bheads)))
2592
2604
2593 parent = repo.dirstate.parents()[0]
2605 parent = repo.dirstate.parents()[0]
2594 if len(bheads) == 1:
2606 if len(bheads) == 1:
2595 if len(repo.heads()) > 1:
2607 if len(repo.heads()) > 1:
2596 raise util.Abort(_(
2608 raise util.Abort(_(
2597 'branch \'%s\' has one head - '
2609 'branch \'%s\' has one head - '
2598 'please merge with an explicit rev\n'
2610 'please merge with an explicit rev\n'
2599 '(run \'hg heads\' to see all heads)')
2611 '(run \'hg heads\' to see all heads)')
2600 % branch)
2612 % branch)
2601 msg = _('there is nothing to merge')
2613 msg = _('there is nothing to merge')
2602 if parent != repo.lookup(repo[None].branch()):
2614 if parent != repo.lookup(repo[None].branch()):
2603 msg = _('%s - use "hg update" instead') % msg
2615 msg = _('%s - use "hg update" instead') % msg
2604 raise util.Abort(msg)
2616 raise util.Abort(msg)
2605
2617
2606 if parent not in bheads:
2618 if parent not in bheads:
2607 raise util.Abort(_('working dir not at a head rev - '
2619 raise util.Abort(_('working dir not at a head rev - '
2608 'use "hg update" or merge with an explicit rev'))
2620 'use "hg update" or merge with an explicit rev'))
2609 node = parent == bheads[0] and bheads[-1] or bheads[0]
2621 node = parent == bheads[0] and bheads[-1] or bheads[0]
2610
2622
2611 if opts.get('preview'):
2623 if opts.get('preview'):
2612 # find nodes that are ancestors of p2 but not of p1
2624 # find nodes that are ancestors of p2 but not of p1
2613 p1 = repo.lookup('.')
2625 p1 = repo.lookup('.')
2614 p2 = repo.lookup(node)
2626 p2 = repo.lookup(node)
2615 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
2627 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
2616
2628
2617 displayer = cmdutil.show_changeset(ui, repo, opts)
2629 displayer = cmdutil.show_changeset(ui, repo, opts)
2618 for node in nodes:
2630 for node in nodes:
2619 displayer.show(repo[node])
2631 displayer.show(repo[node])
2620 displayer.close()
2632 displayer.close()
2621 return 0
2633 return 0
2622
2634
2623 return hg.merge(repo, node, force=opts.get('force'))
2635 return hg.merge(repo, node, force=opts.get('force'))
2624
2636
2625 def outgoing(ui, repo, dest=None, **opts):
2637 def outgoing(ui, repo, dest=None, **opts):
2626 """show changesets not found in the destination
2638 """show changesets not found in the destination
2627
2639
2628 Show changesets not found in the specified destination repository
2640 Show changesets not found in the specified destination repository
2629 or the default push location. These are the changesets that would
2641 or the default push location. These are the changesets that would
2630 be pushed if a push was requested.
2642 be pushed if a push was requested.
2631
2643
2632 See pull for details of valid destination formats.
2644 See pull for details of valid destination formats.
2633
2645
2634 Returns 0 if there are outgoing changes, 1 otherwise.
2646 Returns 0 if there are outgoing changes, 1 otherwise.
2635 """
2647 """
2636 ret = hg.outgoing(ui, repo, dest, opts)
2648 ret = hg.outgoing(ui, repo, dest, opts)
2637 return ret
2649 return ret
2638
2650
2639 def parents(ui, repo, file_=None, **opts):
2651 def parents(ui, repo, file_=None, **opts):
2640 """show the parents of the working directory or revision
2652 """show the parents of the working directory or revision
2641
2653
2642 Print the working directory's parent revisions. If a revision is
2654 Print the working directory's parent revisions. If a revision is
2643 given via -r/--rev, the parent of that revision will be printed.
2655 given via -r/--rev, the parent of that revision will be printed.
2644 If a file argument is given, the revision in which the file was
2656 If a file argument is given, the revision in which the file was
2645 last changed (before the working directory revision or the
2657 last changed (before the working directory revision or the
2646 argument to --rev if given) is printed.
2658 argument to --rev if given) is printed.
2647
2659
2648 Returns 0 on success.
2660 Returns 0 on success.
2649 """
2661 """
2650 rev = opts.get('rev')
2662 rev = opts.get('rev')
2651 if rev:
2663 if rev:
2652 ctx = repo[rev]
2664 ctx = repo[rev]
2653 else:
2665 else:
2654 ctx = repo[None]
2666 ctx = repo[None]
2655
2667
2656 if file_:
2668 if file_:
2657 m = cmdutil.match(repo, (file_,), opts)
2669 m = cmdutil.match(repo, (file_,), opts)
2658 if m.anypats() or len(m.files()) != 1:
2670 if m.anypats() or len(m.files()) != 1:
2659 raise util.Abort(_('can only specify an explicit filename'))
2671 raise util.Abort(_('can only specify an explicit filename'))
2660 file_ = m.files()[0]
2672 file_ = m.files()[0]
2661 filenodes = []
2673 filenodes = []
2662 for cp in ctx.parents():
2674 for cp in ctx.parents():
2663 if not cp:
2675 if not cp:
2664 continue
2676 continue
2665 try:
2677 try:
2666 filenodes.append(cp.filenode(file_))
2678 filenodes.append(cp.filenode(file_))
2667 except error.LookupError:
2679 except error.LookupError:
2668 pass
2680 pass
2669 if not filenodes:
2681 if not filenodes:
2670 raise util.Abort(_("'%s' not found in manifest!") % file_)
2682 raise util.Abort(_("'%s' not found in manifest!") % file_)
2671 fl = repo.file(file_)
2683 fl = repo.file(file_)
2672 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2684 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2673 else:
2685 else:
2674 p = [cp.node() for cp in ctx.parents()]
2686 p = [cp.node() for cp in ctx.parents()]
2675
2687
2676 displayer = cmdutil.show_changeset(ui, repo, opts)
2688 displayer = cmdutil.show_changeset(ui, repo, opts)
2677 for n in p:
2689 for n in p:
2678 if n != nullid:
2690 if n != nullid:
2679 displayer.show(repo[n])
2691 displayer.show(repo[n])
2680 displayer.close()
2692 displayer.close()
2681
2693
2682 def paths(ui, repo, search=None):
2694 def paths(ui, repo, search=None):
2683 """show aliases for remote repositories
2695 """show aliases for remote repositories
2684
2696
2685 Show definition of symbolic path name NAME. If no name is given,
2697 Show definition of symbolic path name NAME. If no name is given,
2686 show definition of all available names.
2698 show definition of all available names.
2687
2699
2688 Path names are defined in the [paths] section of your
2700 Path names are defined in the [paths] section of your
2689 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
2701 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
2690 repository, ``.hg/hgrc`` is used, too.
2702 repository, ``.hg/hgrc`` is used, too.
2691
2703
2692 The path names ``default`` and ``default-push`` have a special
2704 The path names ``default`` and ``default-push`` have a special
2693 meaning. When performing a push or pull operation, they are used
2705 meaning. When performing a push or pull operation, they are used
2694 as fallbacks if no location is specified on the command-line.
2706 as fallbacks if no location is specified on the command-line.
2695 When ``default-push`` is set, it will be used for push and
2707 When ``default-push`` is set, it will be used for push and
2696 ``default`` will be used for pull; otherwise ``default`` is used
2708 ``default`` will be used for pull; otherwise ``default`` is used
2697 as the fallback for both. When cloning a repository, the clone
2709 as the fallback for both. When cloning a repository, the clone
2698 source is written as ``default`` in ``.hg/hgrc``. Note that
2710 source is written as ``default`` in ``.hg/hgrc``. Note that
2699 ``default`` and ``default-push`` apply to all inbound (e.g.
2711 ``default`` and ``default-push`` apply to all inbound (e.g.
2700 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
2712 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
2701 :hg:`bundle`) operations.
2713 :hg:`bundle`) operations.
2702
2714
2703 See :hg:`help urls` for more information.
2715 See :hg:`help urls` for more information.
2704
2716
2705 Returns 0 on success.
2717 Returns 0 on success.
2706 """
2718 """
2707 if search:
2719 if search:
2708 for name, path in ui.configitems("paths"):
2720 for name, path in ui.configitems("paths"):
2709 if name == search:
2721 if name == search:
2710 ui.write("%s\n" % url.hidepassword(path))
2722 ui.write("%s\n" % url.hidepassword(path))
2711 return
2723 return
2712 ui.warn(_("not found!\n"))
2724 ui.warn(_("not found!\n"))
2713 return 1
2725 return 1
2714 else:
2726 else:
2715 for name, path in ui.configitems("paths"):
2727 for name, path in ui.configitems("paths"):
2716 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2728 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2717
2729
2718 def postincoming(ui, repo, modheads, optupdate, checkout):
2730 def postincoming(ui, repo, modheads, optupdate, checkout):
2719 if modheads == 0:
2731 if modheads == 0:
2720 return
2732 return
2721 if optupdate:
2733 if optupdate:
2722 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2734 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2723 return hg.update(repo, checkout)
2735 return hg.update(repo, checkout)
2724 else:
2736 else:
2725 ui.status(_("not updating, since new heads added\n"))
2737 ui.status(_("not updating, since new heads added\n"))
2726 if modheads > 1:
2738 if modheads > 1:
2727 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2739 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2728 else:
2740 else:
2729 ui.status(_("(run 'hg update' to get a working copy)\n"))
2741 ui.status(_("(run 'hg update' to get a working copy)\n"))
2730
2742
2731 def pull(ui, repo, source="default", **opts):
2743 def pull(ui, repo, source="default", **opts):
2732 """pull changes from the specified source
2744 """pull changes from the specified source
2733
2745
2734 Pull changes from a remote repository to a local one.
2746 Pull changes from a remote repository to a local one.
2735
2747
2736 This finds all changes from the repository at the specified path
2748 This finds all changes from the repository at the specified path
2737 or URL and adds them to a local repository (the current one unless
2749 or URL and adds them to a local repository (the current one unless
2738 -R is specified). By default, this does not update the copy of the
2750 -R is specified). By default, this does not update the copy of the
2739 project in the working directory.
2751 project in the working directory.
2740
2752
2741 Use :hg:`incoming` if you want to see what would have been added
2753 Use :hg:`incoming` if you want to see what would have been added
2742 by a pull at the time you issued this command. If you then decide
2754 by a pull at the time you issued this command. If you then decide
2743 to add those changes to the repository, you should use :hg:`pull
2755 to add those changes to the repository, you should use :hg:`pull
2744 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
2756 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
2745
2757
2746 If SOURCE is omitted, the 'default' path will be used.
2758 If SOURCE is omitted, the 'default' path will be used.
2747 See :hg:`help urls` for more information.
2759 See :hg:`help urls` for more information.
2748
2760
2749 Returns 0 on success, 1 if an update had unresolved files.
2761 Returns 0 on success, 1 if an update had unresolved files.
2750 """
2762 """
2751 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2763 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2752 other = hg.repository(hg.remoteui(repo, opts), source)
2764 other = hg.repository(hg.remoteui(repo, opts), source)
2753 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2765 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2754 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2766 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2755 if revs:
2767 if revs:
2756 try:
2768 try:
2757 revs = [other.lookup(rev) for rev in revs]
2769 revs = [other.lookup(rev) for rev in revs]
2758 except error.CapabilityError:
2770 except error.CapabilityError:
2759 err = _("other repository doesn't support revision lookup, "
2771 err = _("other repository doesn't support revision lookup, "
2760 "so a rev cannot be specified.")
2772 "so a rev cannot be specified.")
2761 raise util.Abort(err)
2773 raise util.Abort(err)
2762
2774
2763 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2775 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2764 if checkout:
2776 if checkout:
2765 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2777 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2766 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2778 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2767
2779
2768 def push(ui, repo, dest=None, **opts):
2780 def push(ui, repo, dest=None, **opts):
2769 """push changes to the specified destination
2781 """push changes to the specified destination
2770
2782
2771 Push changesets from the local repository to the specified
2783 Push changesets from the local repository to the specified
2772 destination.
2784 destination.
2773
2785
2774 This operation is symmetrical to pull: it is identical to a pull
2786 This operation is symmetrical to pull: it is identical to a pull
2775 in the destination repository from the current one.
2787 in the destination repository from the current one.
2776
2788
2777 By default, push will not allow creation of new heads at the
2789 By default, push will not allow creation of new heads at the
2778 destination, since multiple heads would make it unclear which head
2790 destination, since multiple heads would make it unclear which head
2779 to use. In this situation, it is recommended to pull and merge
2791 to use. In this situation, it is recommended to pull and merge
2780 before pushing.
2792 before pushing.
2781
2793
2782 Use --new-branch if you want to allow push to create a new named
2794 Use --new-branch if you want to allow push to create a new named
2783 branch that is not present at the destination. This allows you to
2795 branch that is not present at the destination. This allows you to
2784 only create a new branch without forcing other changes.
2796 only create a new branch without forcing other changes.
2785
2797
2786 Use -f/--force to override the default behavior and push all
2798 Use -f/--force to override the default behavior and push all
2787 changesets on all branches.
2799 changesets on all branches.
2788
2800
2789 If -r/--rev is used, the specified revision and all its ancestors
2801 If -r/--rev is used, the specified revision and all its ancestors
2790 will be pushed to the remote repository.
2802 will be pushed to the remote repository.
2791
2803
2792 Please see :hg:`help urls` for important details about ``ssh://``
2804 Please see :hg:`help urls` for important details about ``ssh://``
2793 URLs. If DESTINATION is omitted, a default path will be used.
2805 URLs. If DESTINATION is omitted, a default path will be used.
2794
2806
2795 Returns 0 if push was successful, 1 if nothing to push.
2807 Returns 0 if push was successful, 1 if nothing to push.
2796 """
2808 """
2797 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2809 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2798 dest, branches = hg.parseurl(dest, opts.get('branch'))
2810 dest, branches = hg.parseurl(dest, opts.get('branch'))
2799 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2811 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2800 other = hg.repository(hg.remoteui(repo, opts), dest)
2812 other = hg.repository(hg.remoteui(repo, opts), dest)
2801 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2813 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2802 if revs:
2814 if revs:
2803 revs = [repo.lookup(rev) for rev in revs]
2815 revs = [repo.lookup(rev) for rev in revs]
2804
2816
2805 # push subrepos depth-first for coherent ordering
2817 # push subrepos depth-first for coherent ordering
2806 c = repo['']
2818 c = repo['']
2807 subs = c.substate # only repos that are committed
2819 subs = c.substate # only repos that are committed
2808 for s in sorted(subs):
2820 for s in sorted(subs):
2809 if not c.sub(s).push(opts.get('force')):
2821 if not c.sub(s).push(opts.get('force')):
2810 return False
2822 return False
2811
2823
2812 r = repo.push(other, opts.get('force'), revs=revs,
2824 r = repo.push(other, opts.get('force'), revs=revs,
2813 newbranch=opts.get('new_branch'))
2825 newbranch=opts.get('new_branch'))
2814 return r == 0
2826 return r == 0
2815
2827
2816 def recover(ui, repo):
2828 def recover(ui, repo):
2817 """roll back an interrupted transaction
2829 """roll back an interrupted transaction
2818
2830
2819 Recover from an interrupted commit or pull.
2831 Recover from an interrupted commit or pull.
2820
2832
2821 This command tries to fix the repository status after an
2833 This command tries to fix the repository status after an
2822 interrupted operation. It should only be necessary when Mercurial
2834 interrupted operation. It should only be necessary when Mercurial
2823 suggests it.
2835 suggests it.
2824
2836
2825 Returns 0 if successful, 1 if nothing to recover or verify fails.
2837 Returns 0 if successful, 1 if nothing to recover or verify fails.
2826 """
2838 """
2827 if repo.recover():
2839 if repo.recover():
2828 return hg.verify(repo)
2840 return hg.verify(repo)
2829 return 1
2841 return 1
2830
2842
2831 def remove(ui, repo, *pats, **opts):
2843 def remove(ui, repo, *pats, **opts):
2832 """remove the specified files on the next commit
2844 """remove the specified files on the next commit
2833
2845
2834 Schedule the indicated files for removal from the repository.
2846 Schedule the indicated files for removal from the repository.
2835
2847
2836 This only removes files from the current branch, not from the
2848 This only removes files from the current branch, not from the
2837 entire project history. -A/--after can be used to remove only
2849 entire project history. -A/--after can be used to remove only
2838 files that have already been deleted, -f/--force can be used to
2850 files that have already been deleted, -f/--force can be used to
2839 force deletion, and -Af can be used to remove files from the next
2851 force deletion, and -Af can be used to remove files from the next
2840 revision without deleting them from the working directory.
2852 revision without deleting them from the working directory.
2841
2853
2842 The following table details the behavior of remove for different
2854 The following table details the behavior of remove for different
2843 file states (columns) and option combinations (rows). The file
2855 file states (columns) and option combinations (rows). The file
2844 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2856 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2845 reported by :hg:`status`). The actions are Warn, Remove (from
2857 reported by :hg:`status`). The actions are Warn, Remove (from
2846 branch) and Delete (from disk)::
2858 branch) and Delete (from disk)::
2847
2859
2848 A C M !
2860 A C M !
2849 none W RD W R
2861 none W RD W R
2850 -f R RD RD R
2862 -f R RD RD R
2851 -A W W W R
2863 -A W W W R
2852 -Af R R R R
2864 -Af R R R R
2853
2865
2854 This command schedules the files to be removed at the next commit.
2866 This command schedules the files to be removed at the next commit.
2855 To undo a remove before that, see :hg:`revert`.
2867 To undo a remove before that, see :hg:`revert`.
2856
2868
2857 Returns 0 on success, 1 if any warnings encountered.
2869 Returns 0 on success, 1 if any warnings encountered.
2858 """
2870 """
2859
2871
2860 ret = 0
2872 ret = 0
2861 after, force = opts.get('after'), opts.get('force')
2873 after, force = opts.get('after'), opts.get('force')
2862 if not pats and not after:
2874 if not pats and not after:
2863 raise util.Abort(_('no files specified'))
2875 raise util.Abort(_('no files specified'))
2864
2876
2865 m = cmdutil.match(repo, pats, opts)
2877 m = cmdutil.match(repo, pats, opts)
2866 s = repo.status(match=m, clean=True)
2878 s = repo.status(match=m, clean=True)
2867 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2879 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2868
2880
2869 for f in m.files():
2881 for f in m.files():
2870 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2882 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2871 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2883 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2872 ret = 1
2884 ret = 1
2873
2885
2874 if force:
2886 if force:
2875 remove, forget = modified + deleted + clean, added
2887 remove, forget = modified + deleted + clean, added
2876 elif after:
2888 elif after:
2877 remove, forget = deleted, []
2889 remove, forget = deleted, []
2878 for f in modified + added + clean:
2890 for f in modified + added + clean:
2879 ui.warn(_('not removing %s: file still exists (use -f'
2891 ui.warn(_('not removing %s: file still exists (use -f'
2880 ' to force removal)\n') % m.rel(f))
2892 ' to force removal)\n') % m.rel(f))
2881 ret = 1
2893 ret = 1
2882 else:
2894 else:
2883 remove, forget = deleted + clean, []
2895 remove, forget = deleted + clean, []
2884 for f in modified:
2896 for f in modified:
2885 ui.warn(_('not removing %s: file is modified (use -f'
2897 ui.warn(_('not removing %s: file is modified (use -f'
2886 ' to force removal)\n') % m.rel(f))
2898 ' to force removal)\n') % m.rel(f))
2887 ret = 1
2899 ret = 1
2888 for f in added:
2900 for f in added:
2889 ui.warn(_('not removing %s: file has been marked for add (use -f'
2901 ui.warn(_('not removing %s: file has been marked for add (use -f'
2890 ' to force removal)\n') % m.rel(f))
2902 ' to force removal)\n') % m.rel(f))
2891 ret = 1
2903 ret = 1
2892
2904
2893 for f in sorted(remove + forget):
2905 for f in sorted(remove + forget):
2894 if ui.verbose or not m.exact(f):
2906 if ui.verbose or not m.exact(f):
2895 ui.status(_('removing %s\n') % m.rel(f))
2907 ui.status(_('removing %s\n') % m.rel(f))
2896
2908
2897 repo[None].forget(forget)
2909 repo[None].forget(forget)
2898 repo[None].remove(remove, unlink=not after)
2910 repo[None].remove(remove, unlink=not after)
2899 return ret
2911 return ret
2900
2912
2901 def rename(ui, repo, *pats, **opts):
2913 def rename(ui, repo, *pats, **opts):
2902 """rename files; equivalent of copy + remove
2914 """rename files; equivalent of copy + remove
2903
2915
2904 Mark dest as copies of sources; mark sources for deletion. If dest
2916 Mark dest as copies of sources; mark sources for deletion. If dest
2905 is a directory, copies are put in that directory. If dest is a
2917 is a directory, copies are put in that directory. If dest is a
2906 file, there can only be one source.
2918 file, there can only be one source.
2907
2919
2908 By default, this command copies the contents of files as they
2920 By default, this command copies the contents of files as they
2909 exist in the working directory. If invoked with -A/--after, the
2921 exist in the working directory. If invoked with -A/--after, the
2910 operation is recorded, but no copying is performed.
2922 operation is recorded, but no copying is performed.
2911
2923
2912 This command takes effect at the next commit. To undo a rename
2924 This command takes effect at the next commit. To undo a rename
2913 before that, see :hg:`revert`.
2925 before that, see :hg:`revert`.
2914
2926
2915 Returns 0 on success, 1 if errors are encountered.
2927 Returns 0 on success, 1 if errors are encountered.
2916 """
2928 """
2917 wlock = repo.wlock(False)
2929 wlock = repo.wlock(False)
2918 try:
2930 try:
2919 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2931 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2920 finally:
2932 finally:
2921 wlock.release()
2933 wlock.release()
2922
2934
2923 def resolve(ui, repo, *pats, **opts):
2935 def resolve(ui, repo, *pats, **opts):
2924 """redo merges or set/view the merge status of files
2936 """redo merges or set/view the merge status of files
2925
2937
2926 Merges with unresolved conflicts are often the result of
2938 Merges with unresolved conflicts are often the result of
2927 non-interactive merging using the ``internal:merge`` configuration
2939 non-interactive merging using the ``internal:merge`` configuration
2928 setting, or a command-line merge tool like ``diff3``. The resolve
2940 setting, or a command-line merge tool like ``diff3``. The resolve
2929 command is used to manage the files involved in a merge, after
2941 command is used to manage the files involved in a merge, after
2930 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
2942 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
2931 working directory must have two parents).
2943 working directory must have two parents).
2932
2944
2933 The resolve command can be used in the following ways:
2945 The resolve command can be used in the following ways:
2934
2946
2935 - :hg:`resolve FILE...`: attempt to re-merge the specified files,
2947 - :hg:`resolve [--tool] FILE...`: attempt to re-merge the specified
2936 discarding any previous merge attempts. Re-merging is not
2948 files, discarding any previous merge attempts. Re-merging is not
2937 performed for files already marked as resolved. Use ``--all/-a``
2949 performed for files already marked as resolved. Use ``--all/-a``
2938 to selects all unresolved files.
2950 to selects all unresolved files. ``--tool`` can be used to specify
2951 the merge tool used for the given files. It overrides the HGMERGE
2952 environment variable and your configuration files.
2939
2953
2940 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
2954 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
2941 (e.g. after having manually fixed-up the files). The default is
2955 (e.g. after having manually fixed-up the files). The default is
2942 to mark all unresolved files.
2956 to mark all unresolved files.
2943
2957
2944 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
2958 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
2945 default is to mark all resolved files.
2959 default is to mark all resolved files.
2946
2960
2947 - :hg:`resolve -l`: list files which had or still have conflicts.
2961 - :hg:`resolve -l`: list files which had or still have conflicts.
2948 In the printed list, ``U`` = unresolved and ``R`` = resolved.
2962 In the printed list, ``U`` = unresolved and ``R`` = resolved.
2949
2963
2950 Note that Mercurial will not let you commit files with unresolved
2964 Note that Mercurial will not let you commit files with unresolved
2951 merge conflicts. You must use :hg:`resolve -m ...` before you can
2965 merge conflicts. You must use :hg:`resolve -m ...` before you can
2952 commit after a conflicting merge.
2966 commit after a conflicting merge.
2953
2967
2954 Returns 0 on success, 1 if any files fail a resolve attempt.
2968 Returns 0 on success, 1 if any files fail a resolve attempt.
2955 """
2969 """
2956
2970
2957 all, mark, unmark, show, nostatus = \
2971 all, mark, unmark, show, nostatus = \
2958 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2972 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2959
2973
2960 if (show and (mark or unmark)) or (mark and unmark):
2974 if (show and (mark or unmark)) or (mark and unmark):
2961 raise util.Abort(_("too many options specified"))
2975 raise util.Abort(_("too many options specified"))
2962 if pats and all:
2976 if pats and all:
2963 raise util.Abort(_("can't specify --all and patterns"))
2977 raise util.Abort(_("can't specify --all and patterns"))
2964 if not (all or pats or show or mark or unmark):
2978 if not (all or pats or show or mark or unmark):
2965 raise util.Abort(_('no files or directories specified; '
2979 raise util.Abort(_('no files or directories specified; '
2966 'use --all to remerge all files'))
2980 'use --all to remerge all files'))
2967
2981
2982 t = opts.get('tool')
2983 if t:
2984 if 'HGMERGE' in os.environ:
2985 os.environ['HGMERGE'] = t
2986 ui.setconfig('ui', 'merge', t)
2987
2968 ms = mergemod.mergestate(repo)
2988 ms = mergemod.mergestate(repo)
2969 m = cmdutil.match(repo, pats, opts)
2989 m = cmdutil.match(repo, pats, opts)
2970 ret = 0
2990 ret = 0
2971
2991
2972 for f in ms:
2992 for f in ms:
2973 if m(f):
2993 if m(f):
2974 if show:
2994 if show:
2975 if nostatus:
2995 if nostatus:
2976 ui.write("%s\n" % f)
2996 ui.write("%s\n" % f)
2977 else:
2997 else:
2978 ui.write("%s %s\n" % (ms[f].upper(), f),
2998 ui.write("%s %s\n" % (ms[f].upper(), f),
2979 label='resolve.' +
2999 label='resolve.' +
2980 {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
3000 {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
2981 elif mark:
3001 elif mark:
2982 ms.mark(f, "r")
3002 ms.mark(f, "r")
2983 elif unmark:
3003 elif unmark:
2984 ms.mark(f, "u")
3004 ms.mark(f, "u")
2985 else:
3005 else:
2986 wctx = repo[None]
3006 wctx = repo[None]
2987 mctx = wctx.parents()[-1]
3007 mctx = wctx.parents()[-1]
2988
3008
2989 # backup pre-resolve (merge uses .orig for its own purposes)
3009 # backup pre-resolve (merge uses .orig for its own purposes)
2990 a = repo.wjoin(f)
3010 a = repo.wjoin(f)
2991 util.copyfile(a, a + ".resolve")
3011 util.copyfile(a, a + ".resolve")
2992
3012
2993 # resolve file
3013 # resolve file
2994 if ms.resolve(f, wctx, mctx):
3014 if ms.resolve(f, wctx, mctx):
2995 ret = 1
3015 ret = 1
2996
3016
2997 # replace filemerge's .orig file with our resolve file
3017 # replace filemerge's .orig file with our resolve file
2998 util.rename(a + ".resolve", a + ".orig")
3018 util.rename(a + ".resolve", a + ".orig")
2999
3019
3000 ms.commit()
3020 ms.commit()
3001 return ret
3021 return ret
3002
3022
3003 def revert(ui, repo, *pats, **opts):
3023 def revert(ui, repo, *pats, **opts):
3004 """restore individual files or directories to an earlier state
3024 """restore individual files or directories to an earlier state
3005
3025
3006 .. note::
3026 .. note::
3007 This command is most likely not what you are looking for.
3027 This command is most likely not what you are looking for.
3008 revert will partially overwrite content in the working
3028 revert will partially overwrite content in the working
3009 directory without changing the working directory parents. Use
3029 directory without changing the working directory parents. Use
3010 :hg:`update -r rev` to check out earlier revisions, or
3030 :hg:`update -r rev` to check out earlier revisions, or
3011 :hg:`update --clean .` to undo a merge which has added another
3031 :hg:`update --clean .` to undo a merge which has added another
3012 parent.
3032 parent.
3013
3033
3014 With no revision specified, revert the named files or directories
3034 With no revision specified, revert the named files or directories
3015 to the contents they had in the parent of the working directory.
3035 to the contents they had in the parent of the working directory.
3016 This restores the contents of the affected files to an unmodified
3036 This restores the contents of the affected files to an unmodified
3017 state and unschedules adds, removes, copies, and renames. If the
3037 state and unschedules adds, removes, copies, and renames. If the
3018 working directory has two parents, you must explicitly specify a
3038 working directory has two parents, you must explicitly specify a
3019 revision.
3039 revision.
3020
3040
3021 Using the -r/--rev option, revert the given files or directories
3041 Using the -r/--rev option, revert the given files or directories
3022 to their contents as of a specific revision. This can be helpful
3042 to their contents as of a specific revision. This can be helpful
3023 to "roll back" some or all of an earlier change. See :hg:`help
3043 to "roll back" some or all of an earlier change. See :hg:`help
3024 dates` for a list of formats valid for -d/--date.
3044 dates` for a list of formats valid for -d/--date.
3025
3045
3026 Revert modifies the working directory. It does not commit any
3046 Revert modifies the working directory. It does not commit any
3027 changes, or change the parent of the working directory. If you
3047 changes, or change the parent of the working directory. If you
3028 revert to a revision other than the parent of the working
3048 revert to a revision other than the parent of the working
3029 directory, the reverted files will thus appear modified
3049 directory, the reverted files will thus appear modified
3030 afterwards.
3050 afterwards.
3031
3051
3032 If a file has been deleted, it is restored. If the executable mode
3052 If a file has been deleted, it is restored. If the executable mode
3033 of a file was changed, it is reset.
3053 of a file was changed, it is reset.
3034
3054
3035 If names are given, all files matching the names are reverted.
3055 If names are given, all files matching the names are reverted.
3036 If no arguments are given, no files are reverted.
3056 If no arguments are given, no files are reverted.
3037
3057
3038 Modified files are saved with a .orig suffix before reverting.
3058 Modified files are saved with a .orig suffix before reverting.
3039 To disable these backups, use --no-backup.
3059 To disable these backups, use --no-backup.
3040
3060
3041 Returns 0 on success.
3061 Returns 0 on success.
3042 """
3062 """
3043
3063
3044 if opts.get("date"):
3064 if opts.get("date"):
3045 if opts.get("rev"):
3065 if opts.get("rev"):
3046 raise util.Abort(_("you can't specify a revision and a date"))
3066 raise util.Abort(_("you can't specify a revision and a date"))
3047 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
3067 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
3048
3068
3049 if not pats and not opts.get('all'):
3069 if not pats and not opts.get('all'):
3050 raise util.Abort(_('no files or directories specified; '
3070 raise util.Abort(_('no files or directories specified; '
3051 'use --all to revert the whole repo'))
3071 'use --all to revert the whole repo'))
3052
3072
3053 parent, p2 = repo.dirstate.parents()
3073 parent, p2 = repo.dirstate.parents()
3054 if not opts.get('rev') and p2 != nullid:
3074 if not opts.get('rev') and p2 != nullid:
3055 raise util.Abort(_('uncommitted merge - please provide a '
3075 raise util.Abort(_('uncommitted merge - please provide a '
3056 'specific revision'))
3076 'specific revision'))
3057 ctx = repo[opts.get('rev')]
3077 ctx = repo[opts.get('rev')]
3058 node = ctx.node()
3078 node = ctx.node()
3059 mf = ctx.manifest()
3079 mf = ctx.manifest()
3060 if node == parent:
3080 if node == parent:
3061 pmf = mf
3081 pmf = mf
3062 else:
3082 else:
3063 pmf = None
3083 pmf = None
3064
3084
3065 # need all matching names in dirstate and manifest of target rev,
3085 # need all matching names in dirstate and manifest of target rev,
3066 # so have to walk both. do not print errors if files exist in one
3086 # so have to walk both. do not print errors if files exist in one
3067 # but not other.
3087 # but not other.
3068
3088
3069 names = {}
3089 names = {}
3070
3090
3071 wlock = repo.wlock()
3091 wlock = repo.wlock()
3072 try:
3092 try:
3073 # walk dirstate.
3093 # walk dirstate.
3074
3094
3075 m = cmdutil.match(repo, pats, opts)
3095 m = cmdutil.match(repo, pats, opts)
3076 m.bad = lambda x, y: False
3096 m.bad = lambda x, y: False
3077 for abs in repo.walk(m):
3097 for abs in repo.walk(m):
3078 names[abs] = m.rel(abs), m.exact(abs)
3098 names[abs] = m.rel(abs), m.exact(abs)
3079
3099
3080 # walk target manifest.
3100 # walk target manifest.
3081
3101
3082 def badfn(path, msg):
3102 def badfn(path, msg):
3083 if path in names:
3103 if path in names:
3084 return
3104 return
3085 path_ = path + '/'
3105 path_ = path + '/'
3086 for f in names:
3106 for f in names:
3087 if f.startswith(path_):
3107 if f.startswith(path_):
3088 return
3108 return
3089 ui.warn("%s: %s\n" % (m.rel(path), msg))
3109 ui.warn("%s: %s\n" % (m.rel(path), msg))
3090
3110
3091 m = cmdutil.match(repo, pats, opts)
3111 m = cmdutil.match(repo, pats, opts)
3092 m.bad = badfn
3112 m.bad = badfn
3093 for abs in repo[node].walk(m):
3113 for abs in repo[node].walk(m):
3094 if abs not in names:
3114 if abs not in names:
3095 names[abs] = m.rel(abs), m.exact(abs)
3115 names[abs] = m.rel(abs), m.exact(abs)
3096
3116
3097 m = cmdutil.matchfiles(repo, names)
3117 m = cmdutil.matchfiles(repo, names)
3098 changes = repo.status(match=m)[:4]
3118 changes = repo.status(match=m)[:4]
3099 modified, added, removed, deleted = map(set, changes)
3119 modified, added, removed, deleted = map(set, changes)
3100
3120
3101 # if f is a rename, also revert the source
3121 # if f is a rename, also revert the source
3102 cwd = repo.getcwd()
3122 cwd = repo.getcwd()
3103 for f in added:
3123 for f in added:
3104 src = repo.dirstate.copied(f)
3124 src = repo.dirstate.copied(f)
3105 if src and src not in names and repo.dirstate[src] == 'r':
3125 if src and src not in names and repo.dirstate[src] == 'r':
3106 removed.add(src)
3126 removed.add(src)
3107 names[src] = (repo.pathto(src, cwd), True)
3127 names[src] = (repo.pathto(src, cwd), True)
3108
3128
3109 def removeforget(abs):
3129 def removeforget(abs):
3110 if repo.dirstate[abs] == 'a':
3130 if repo.dirstate[abs] == 'a':
3111 return _('forgetting %s\n')
3131 return _('forgetting %s\n')
3112 return _('removing %s\n')
3132 return _('removing %s\n')
3113
3133
3114 revert = ([], _('reverting %s\n'))
3134 revert = ([], _('reverting %s\n'))
3115 add = ([], _('adding %s\n'))
3135 add = ([], _('adding %s\n'))
3116 remove = ([], removeforget)
3136 remove = ([], removeforget)
3117 undelete = ([], _('undeleting %s\n'))
3137 undelete = ([], _('undeleting %s\n'))
3118
3138
3119 disptable = (
3139 disptable = (
3120 # dispatch table:
3140 # dispatch table:
3121 # file state
3141 # file state
3122 # action if in target manifest
3142 # action if in target manifest
3123 # action if not in target manifest
3143 # action if not in target manifest
3124 # make backup if in target manifest
3144 # make backup if in target manifest
3125 # make backup if not in target manifest
3145 # make backup if not in target manifest
3126 (modified, revert, remove, True, True),
3146 (modified, revert, remove, True, True),
3127 (added, revert, remove, True, False),
3147 (added, revert, remove, True, False),
3128 (removed, undelete, None, False, False),
3148 (removed, undelete, None, False, False),
3129 (deleted, revert, remove, False, False),
3149 (deleted, revert, remove, False, False),
3130 )
3150 )
3131
3151
3132 for abs, (rel, exact) in sorted(names.items()):
3152 for abs, (rel, exact) in sorted(names.items()):
3133 mfentry = mf.get(abs)
3153 mfentry = mf.get(abs)
3134 target = repo.wjoin(abs)
3154 target = repo.wjoin(abs)
3135 def handle(xlist, dobackup):
3155 def handle(xlist, dobackup):
3136 xlist[0].append(abs)
3156 xlist[0].append(abs)
3137 if (dobackup and not opts.get('no_backup') and
3157 if (dobackup and not opts.get('no_backup') and
3138 os.path.lexists(target)):
3158 os.path.lexists(target)):
3139 bakname = "%s.orig" % rel
3159 bakname = "%s.orig" % rel
3140 ui.note(_('saving current version of %s as %s\n') %
3160 ui.note(_('saving current version of %s as %s\n') %
3141 (rel, bakname))
3161 (rel, bakname))
3142 if not opts.get('dry_run'):
3162 if not opts.get('dry_run'):
3143 util.rename(target, bakname)
3163 util.rename(target, bakname)
3144 if ui.verbose or not exact:
3164 if ui.verbose or not exact:
3145 msg = xlist[1]
3165 msg = xlist[1]
3146 if not isinstance(msg, basestring):
3166 if not isinstance(msg, basestring):
3147 msg = msg(abs)
3167 msg = msg(abs)
3148 ui.status(msg % rel)
3168 ui.status(msg % rel)
3149 for table, hitlist, misslist, backuphit, backupmiss in disptable:
3169 for table, hitlist, misslist, backuphit, backupmiss in disptable:
3150 if abs not in table:
3170 if abs not in table:
3151 continue
3171 continue
3152 # file has changed in dirstate
3172 # file has changed in dirstate
3153 if mfentry:
3173 if mfentry:
3154 handle(hitlist, backuphit)
3174 handle(hitlist, backuphit)
3155 elif misslist is not None:
3175 elif misslist is not None:
3156 handle(misslist, backupmiss)
3176 handle(misslist, backupmiss)
3157 break
3177 break
3158 else:
3178 else:
3159 if abs not in repo.dirstate:
3179 if abs not in repo.dirstate:
3160 if mfentry:
3180 if mfentry:
3161 handle(add, True)
3181 handle(add, True)
3162 elif exact:
3182 elif exact:
3163 ui.warn(_('file not managed: %s\n') % rel)
3183 ui.warn(_('file not managed: %s\n') % rel)
3164 continue
3184 continue
3165 # file has not changed in dirstate
3185 # file has not changed in dirstate
3166 if node == parent:
3186 if node == parent:
3167 if exact:
3187 if exact:
3168 ui.warn(_('no changes needed to %s\n') % rel)
3188 ui.warn(_('no changes needed to %s\n') % rel)
3169 continue
3189 continue
3170 if pmf is None:
3190 if pmf is None:
3171 # only need parent manifest in this unlikely case,
3191 # only need parent manifest in this unlikely case,
3172 # so do not read by default
3192 # so do not read by default
3173 pmf = repo[parent].manifest()
3193 pmf = repo[parent].manifest()
3174 if abs in pmf:
3194 if abs in pmf:
3175 if mfentry:
3195 if mfentry:
3176 # if version of file is same in parent and target
3196 # if version of file is same in parent and target
3177 # manifests, do nothing
3197 # manifests, do nothing
3178 if (pmf[abs] != mfentry or
3198 if (pmf[abs] != mfentry or
3179 pmf.flags(abs) != mf.flags(abs)):
3199 pmf.flags(abs) != mf.flags(abs)):
3180 handle(revert, False)
3200 handle(revert, False)
3181 else:
3201 else:
3182 handle(remove, False)
3202 handle(remove, False)
3183
3203
3184 if not opts.get('dry_run'):
3204 if not opts.get('dry_run'):
3185 def checkout(f):
3205 def checkout(f):
3186 fc = ctx[f]
3206 fc = ctx[f]
3187 repo.wwrite(f, fc.data(), fc.flags())
3207 repo.wwrite(f, fc.data(), fc.flags())
3188
3208
3189 audit_path = util.path_auditor(repo.root)
3209 audit_path = util.path_auditor(repo.root)
3190 for f in remove[0]:
3210 for f in remove[0]:
3191 if repo.dirstate[f] == 'a':
3211 if repo.dirstate[f] == 'a':
3192 repo.dirstate.forget(f)
3212 repo.dirstate.forget(f)
3193 continue
3213 continue
3194 audit_path(f)
3214 audit_path(f)
3195 try:
3215 try:
3196 util.unlink(repo.wjoin(f))
3216 util.unlink(repo.wjoin(f))
3197 except OSError:
3217 except OSError:
3198 pass
3218 pass
3199 repo.dirstate.remove(f)
3219 repo.dirstate.remove(f)
3200
3220
3201 normal = None
3221 normal = None
3202 if node == parent:
3222 if node == parent:
3203 # We're reverting to our parent. If possible, we'd like status
3223 # We're reverting to our parent. If possible, we'd like status
3204 # to report the file as clean. We have to use normallookup for
3224 # to report the file as clean. We have to use normallookup for
3205 # merges to avoid losing information about merged/dirty files.
3225 # merges to avoid losing information about merged/dirty files.
3206 if p2 != nullid:
3226 if p2 != nullid:
3207 normal = repo.dirstate.normallookup
3227 normal = repo.dirstate.normallookup
3208 else:
3228 else:
3209 normal = repo.dirstate.normal
3229 normal = repo.dirstate.normal
3210 for f in revert[0]:
3230 for f in revert[0]:
3211 checkout(f)
3231 checkout(f)
3212 if normal:
3232 if normal:
3213 normal(f)
3233 normal(f)
3214
3234
3215 for f in add[0]:
3235 for f in add[0]:
3216 checkout(f)
3236 checkout(f)
3217 repo.dirstate.add(f)
3237 repo.dirstate.add(f)
3218
3238
3219 normal = repo.dirstate.normallookup
3239 normal = repo.dirstate.normallookup
3220 if node == parent and p2 == nullid:
3240 if node == parent and p2 == nullid:
3221 normal = repo.dirstate.normal
3241 normal = repo.dirstate.normal
3222 for f in undelete[0]:
3242 for f in undelete[0]:
3223 checkout(f)
3243 checkout(f)
3224 normal(f)
3244 normal(f)
3225
3245
3226 finally:
3246 finally:
3227 wlock.release()
3247 wlock.release()
3228
3248
3229 def rollback(ui, repo, **opts):
3249 def rollback(ui, repo, **opts):
3230 """roll back the last transaction (dangerous)
3250 """roll back the last transaction (dangerous)
3231
3251
3232 This command should be used with care. There is only one level of
3252 This command should be used with care. There is only one level of
3233 rollback, and there is no way to undo a rollback. It will also
3253 rollback, and there is no way to undo a rollback. It will also
3234 restore the dirstate at the time of the last transaction, losing
3254 restore the dirstate at the time of the last transaction, losing
3235 any dirstate changes since that time. This command does not alter
3255 any dirstate changes since that time. This command does not alter
3236 the working directory.
3256 the working directory.
3237
3257
3238 Transactions are used to encapsulate the effects of all commands
3258 Transactions are used to encapsulate the effects of all commands
3239 that create new changesets or propagate existing changesets into a
3259 that create new changesets or propagate existing changesets into a
3240 repository. For example, the following commands are transactional,
3260 repository. For example, the following commands are transactional,
3241 and their effects can be rolled back:
3261 and their effects can be rolled back:
3242
3262
3243 - commit
3263 - commit
3244 - import
3264 - import
3245 - pull
3265 - pull
3246 - push (with this repository as the destination)
3266 - push (with this repository as the destination)
3247 - unbundle
3267 - unbundle
3248
3268
3249 This command is not intended for use on public repositories. Once
3269 This command is not intended for use on public repositories. Once
3250 changes are visible for pull by other users, rolling a transaction
3270 changes are visible for pull by other users, rolling a transaction
3251 back locally is ineffective (someone else may already have pulled
3271 back locally is ineffective (someone else may already have pulled
3252 the changes). Furthermore, a race is possible with readers of the
3272 the changes). Furthermore, a race is possible with readers of the
3253 repository; for example an in-progress pull from the repository
3273 repository; for example an in-progress pull from the repository
3254 may fail if a rollback is performed.
3274 may fail if a rollback is performed.
3255
3275
3256 Returns 0 on success, 1 if no rollback data is available.
3276 Returns 0 on success, 1 if no rollback data is available.
3257 """
3277 """
3258 return repo.rollback(opts.get('dry_run'))
3278 return repo.rollback(opts.get('dry_run'))
3259
3279
3260 def root(ui, repo):
3280 def root(ui, repo):
3261 """print the root (top) of the current working directory
3281 """print the root (top) of the current working directory
3262
3282
3263 Print the root directory of the current repository.
3283 Print the root directory of the current repository.
3264
3284
3265 Returns 0 on success.
3285 Returns 0 on success.
3266 """
3286 """
3267 ui.write(repo.root + "\n")
3287 ui.write(repo.root + "\n")
3268
3288
3269 def serve(ui, repo, **opts):
3289 def serve(ui, repo, **opts):
3270 """start stand-alone webserver
3290 """start stand-alone webserver
3271
3291
3272 Start a local HTTP repository browser and pull server. You can use
3292 Start a local HTTP repository browser and pull server. You can use
3273 this for ad-hoc sharing and browing of repositories. It is
3293 this for ad-hoc sharing and browing of repositories. It is
3274 recommended to use a real web server to serve a repository for
3294 recommended to use a real web server to serve a repository for
3275 longer periods of time.
3295 longer periods of time.
3276
3296
3277 Please note that the server does not implement access control.
3297 Please note that the server does not implement access control.
3278 This means that, by default, anybody can read from the server and
3298 This means that, by default, anybody can read from the server and
3279 nobody can write to it by default. Set the ``web.allow_push``
3299 nobody can write to it by default. Set the ``web.allow_push``
3280 option to ``*`` to allow everybody to push to the server. You
3300 option to ``*`` to allow everybody to push to the server. You
3281 should use a real web server if you need to authenticate users.
3301 should use a real web server if you need to authenticate users.
3282
3302
3283 By default, the server logs accesses to stdout and errors to
3303 By default, the server logs accesses to stdout and errors to
3284 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
3304 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
3285 files.
3305 files.
3286
3306
3287 To have the server choose a free port number to listen on, specify
3307 To have the server choose a free port number to listen on, specify
3288 a port number of 0; in this case, the server will print the port
3308 a port number of 0; in this case, the server will print the port
3289 number it uses.
3309 number it uses.
3290
3310
3291 Returns 0 on success.
3311 Returns 0 on success.
3292 """
3312 """
3293
3313
3294 if opts["stdio"]:
3314 if opts["stdio"]:
3295 if repo is None:
3315 if repo is None:
3296 raise error.RepoError(_("There is no Mercurial repository here"
3316 raise error.RepoError(_("There is no Mercurial repository here"
3297 " (.hg not found)"))
3317 " (.hg not found)"))
3298 s = sshserver.sshserver(ui, repo)
3318 s = sshserver.sshserver(ui, repo)
3299 s.serve_forever()
3319 s.serve_forever()
3300
3320
3301 # this way we can check if something was given in the command-line
3321 # this way we can check if something was given in the command-line
3302 if opts.get('port'):
3322 if opts.get('port'):
3303 opts['port'] = util.getport(opts.get('port'))
3323 opts['port'] = util.getport(opts.get('port'))
3304
3324
3305 baseui = repo and repo.baseui or ui
3325 baseui = repo and repo.baseui or ui
3306 optlist = ("name templates style address port prefix ipv6"
3326 optlist = ("name templates style address port prefix ipv6"
3307 " accesslog errorlog certificate encoding")
3327 " accesslog errorlog certificate encoding")
3308 for o in optlist.split():
3328 for o in optlist.split():
3309 val = opts.get(o, '')
3329 val = opts.get(o, '')
3310 if val in (None, ''): # should check against default options instead
3330 if val in (None, ''): # should check against default options instead
3311 continue
3331 continue
3312 baseui.setconfig("web", o, val)
3332 baseui.setconfig("web", o, val)
3313 if repo and repo.ui != baseui:
3333 if repo and repo.ui != baseui:
3314 repo.ui.setconfig("web", o, val)
3334 repo.ui.setconfig("web", o, val)
3315
3335
3316 o = opts.get('web_conf') or opts.get('webdir_conf')
3336 o = opts.get('web_conf') or opts.get('webdir_conf')
3317 if not o:
3337 if not o:
3318 if not repo:
3338 if not repo:
3319 raise error.RepoError(_("There is no Mercurial repository"
3339 raise error.RepoError(_("There is no Mercurial repository"
3320 " here (.hg not found)"))
3340 " here (.hg not found)"))
3321 o = repo.root
3341 o = repo.root
3322
3342
3323 app = hgweb.hgweb(o, baseui=ui)
3343 app = hgweb.hgweb(o, baseui=ui)
3324
3344
3325 class service(object):
3345 class service(object):
3326 def init(self):
3346 def init(self):
3327 util.set_signal_handler()
3347 util.set_signal_handler()
3328 self.httpd = hgweb.server.create_server(ui, app)
3348 self.httpd = hgweb.server.create_server(ui, app)
3329
3349
3330 if opts['port'] and not ui.verbose:
3350 if opts['port'] and not ui.verbose:
3331 return
3351 return
3332
3352
3333 if self.httpd.prefix:
3353 if self.httpd.prefix:
3334 prefix = self.httpd.prefix.strip('/') + '/'
3354 prefix = self.httpd.prefix.strip('/') + '/'
3335 else:
3355 else:
3336 prefix = ''
3356 prefix = ''
3337
3357
3338 port = ':%d' % self.httpd.port
3358 port = ':%d' % self.httpd.port
3339 if port == ':80':
3359 if port == ':80':
3340 port = ''
3360 port = ''
3341
3361
3342 bindaddr = self.httpd.addr
3362 bindaddr = self.httpd.addr
3343 if bindaddr == '0.0.0.0':
3363 if bindaddr == '0.0.0.0':
3344 bindaddr = '*'
3364 bindaddr = '*'
3345 elif ':' in bindaddr: # IPv6
3365 elif ':' in bindaddr: # IPv6
3346 bindaddr = '[%s]' % bindaddr
3366 bindaddr = '[%s]' % bindaddr
3347
3367
3348 fqaddr = self.httpd.fqaddr
3368 fqaddr = self.httpd.fqaddr
3349 if ':' in fqaddr:
3369 if ':' in fqaddr:
3350 fqaddr = '[%s]' % fqaddr
3370 fqaddr = '[%s]' % fqaddr
3351 if opts['port']:
3371 if opts['port']:
3352 write = ui.status
3372 write = ui.status
3353 else:
3373 else:
3354 write = ui.write
3374 write = ui.write
3355 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
3375 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
3356 (fqaddr, port, prefix, bindaddr, self.httpd.port))
3376 (fqaddr, port, prefix, bindaddr, self.httpd.port))
3357
3377
3358 def run(self):
3378 def run(self):
3359 self.httpd.serve_forever()
3379 self.httpd.serve_forever()
3360
3380
3361 service = service()
3381 service = service()
3362
3382
3363 cmdutil.service(opts, initfn=service.init, runfn=service.run)
3383 cmdutil.service(opts, initfn=service.init, runfn=service.run)
3364
3384
3365 def status(ui, repo, *pats, **opts):
3385 def status(ui, repo, *pats, **opts):
3366 """show changed files in the working directory
3386 """show changed files in the working directory
3367
3387
3368 Show status of files in the repository. If names are given, only
3388 Show status of files in the repository. If names are given, only
3369 files that match are shown. Files that are clean or ignored or
3389 files that match are shown. Files that are clean or ignored or
3370 the source of a copy/move operation, are not listed unless
3390 the source of a copy/move operation, are not listed unless
3371 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
3391 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
3372 Unless options described with "show only ..." are given, the
3392 Unless options described with "show only ..." are given, the
3373 options -mardu are used.
3393 options -mardu are used.
3374
3394
3375 Option -q/--quiet hides untracked (unknown and ignored) files
3395 Option -q/--quiet hides untracked (unknown and ignored) files
3376 unless explicitly requested with -u/--unknown or -i/--ignored.
3396 unless explicitly requested with -u/--unknown or -i/--ignored.
3377
3397
3378 .. note::
3398 .. note::
3379 status may appear to disagree with diff if permissions have
3399 status may appear to disagree with diff if permissions have
3380 changed or a merge has occurred. The standard diff format does
3400 changed or a merge has occurred. The standard diff format does
3381 not report permission changes and diff only reports changes
3401 not report permission changes and diff only reports changes
3382 relative to one merge parent.
3402 relative to one merge parent.
3383
3403
3384 If one revision is given, it is used as the base revision.
3404 If one revision is given, it is used as the base revision.
3385 If two revisions are given, the differences between them are
3405 If two revisions are given, the differences between them are
3386 shown. The --change option can also be used as a shortcut to list
3406 shown. The --change option can also be used as a shortcut to list
3387 the changed files of a revision from its first parent.
3407 the changed files of a revision from its first parent.
3388
3408
3389 The codes used to show the status of files are::
3409 The codes used to show the status of files are::
3390
3410
3391 M = modified
3411 M = modified
3392 A = added
3412 A = added
3393 R = removed
3413 R = removed
3394 C = clean
3414 C = clean
3395 ! = missing (deleted by non-hg command, but still tracked)
3415 ! = missing (deleted by non-hg command, but still tracked)
3396 ? = not tracked
3416 ? = not tracked
3397 I = ignored
3417 I = ignored
3398 = origin of the previous file listed as A (added)
3418 = origin of the previous file listed as A (added)
3399
3419
3400 Returns 0 on success.
3420 Returns 0 on success.
3401 """
3421 """
3402
3422
3403 revs = opts.get('rev')
3423 revs = opts.get('rev')
3404 change = opts.get('change')
3424 change = opts.get('change')
3405
3425
3406 if revs and change:
3426 if revs and change:
3407 msg = _('cannot specify --rev and --change at the same time')
3427 msg = _('cannot specify --rev and --change at the same time')
3408 raise util.Abort(msg)
3428 raise util.Abort(msg)
3409 elif change:
3429 elif change:
3410 node2 = repo.lookup(change)
3430 node2 = repo.lookup(change)
3411 node1 = repo[node2].parents()[0].node()
3431 node1 = repo[node2].parents()[0].node()
3412 else:
3432 else:
3413 node1, node2 = cmdutil.revpair(repo, revs)
3433 node1, node2 = cmdutil.revpair(repo, revs)
3414
3434
3415 cwd = (pats and repo.getcwd()) or ''
3435 cwd = (pats and repo.getcwd()) or ''
3416 end = opts.get('print0') and '\0' or '\n'
3436 end = opts.get('print0') and '\0' or '\n'
3417 copy = {}
3437 copy = {}
3418 states = 'modified added removed deleted unknown ignored clean'.split()
3438 states = 'modified added removed deleted unknown ignored clean'.split()
3419 show = [k for k in states if opts.get(k)]
3439 show = [k for k in states if opts.get(k)]
3420 if opts.get('all'):
3440 if opts.get('all'):
3421 show += ui.quiet and (states[:4] + ['clean']) or states
3441 show += ui.quiet and (states[:4] + ['clean']) or states
3422 if not show:
3442 if not show:
3423 show = ui.quiet and states[:4] or states[:5]
3443 show = ui.quiet and states[:4] or states[:5]
3424
3444
3425 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
3445 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
3426 'ignored' in show, 'clean' in show, 'unknown' in show,
3446 'ignored' in show, 'clean' in show, 'unknown' in show,
3427 opts.get('subrepos'))
3447 opts.get('subrepos'))
3428 changestates = zip(states, 'MAR!?IC', stat)
3448 changestates = zip(states, 'MAR!?IC', stat)
3429
3449
3430 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
3450 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
3431 ctxn = repo[nullid]
3451 ctxn = repo[nullid]
3432 ctx1 = repo[node1]
3452 ctx1 = repo[node1]
3433 ctx2 = repo[node2]
3453 ctx2 = repo[node2]
3434 added = stat[1]
3454 added = stat[1]
3435 if node2 is None:
3455 if node2 is None:
3436 added = stat[0] + stat[1] # merged?
3456 added = stat[0] + stat[1] # merged?
3437
3457
3438 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
3458 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
3439 if k in added:
3459 if k in added:
3440 copy[k] = v
3460 copy[k] = v
3441 elif v in added:
3461 elif v in added:
3442 copy[v] = k
3462 copy[v] = k
3443
3463
3444 for state, char, files in changestates:
3464 for state, char, files in changestates:
3445 if state in show:
3465 if state in show:
3446 format = "%s %%s%s" % (char, end)
3466 format = "%s %%s%s" % (char, end)
3447 if opts.get('no_status'):
3467 if opts.get('no_status'):
3448 format = "%%s%s" % end
3468 format = "%%s%s" % end
3449
3469
3450 for f in files:
3470 for f in files:
3451 ui.write(format % repo.pathto(f, cwd),
3471 ui.write(format % repo.pathto(f, cwd),
3452 label='status.' + state)
3472 label='status.' + state)
3453 if f in copy:
3473 if f in copy:
3454 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end),
3474 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end),
3455 label='status.copied')
3475 label='status.copied')
3456
3476
3457 def summary(ui, repo, **opts):
3477 def summary(ui, repo, **opts):
3458 """summarize working directory state
3478 """summarize working directory state
3459
3479
3460 This generates a brief summary of the working directory state,
3480 This generates a brief summary of the working directory state,
3461 including parents, branch, commit status, and available updates.
3481 including parents, branch, commit status, and available updates.
3462
3482
3463 With the --remote option, this will check the default paths for
3483 With the --remote option, this will check the default paths for
3464 incoming and outgoing changes. This can be time-consuming.
3484 incoming and outgoing changes. This can be time-consuming.
3465
3485
3466 Returns 0 on success.
3486 Returns 0 on success.
3467 """
3487 """
3468
3488
3469 ctx = repo[None]
3489 ctx = repo[None]
3470 parents = ctx.parents()
3490 parents = ctx.parents()
3471 pnode = parents[0].node()
3491 pnode = parents[0].node()
3472
3492
3473 for p in parents:
3493 for p in parents:
3474 # label with log.changeset (instead of log.parent) since this
3494 # label with log.changeset (instead of log.parent) since this
3475 # shows a working directory parent *changeset*:
3495 # shows a working directory parent *changeset*:
3476 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
3496 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
3477 label='log.changeset')
3497 label='log.changeset')
3478 ui.write(' '.join(p.tags()), label='log.tag')
3498 ui.write(' '.join(p.tags()), label='log.tag')
3479 if p.rev() == -1:
3499 if p.rev() == -1:
3480 if not len(repo):
3500 if not len(repo):
3481 ui.write(_(' (empty repository)'))
3501 ui.write(_(' (empty repository)'))
3482 else:
3502 else:
3483 ui.write(_(' (no revision checked out)'))
3503 ui.write(_(' (no revision checked out)'))
3484 ui.write('\n')
3504 ui.write('\n')
3485 if p.description():
3505 if p.description():
3486 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
3506 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
3487 label='log.summary')
3507 label='log.summary')
3488
3508
3489 branch = ctx.branch()
3509 branch = ctx.branch()
3490 bheads = repo.branchheads(branch)
3510 bheads = repo.branchheads(branch)
3491 m = _('branch: %s\n') % branch
3511 m = _('branch: %s\n') % branch
3492 if branch != 'default':
3512 if branch != 'default':
3493 ui.write(m, label='log.branch')
3513 ui.write(m, label='log.branch')
3494 else:
3514 else:
3495 ui.status(m, label='log.branch')
3515 ui.status(m, label='log.branch')
3496
3516
3497 st = list(repo.status(unknown=True))[:6]
3517 st = list(repo.status(unknown=True))[:6]
3498
3518
3499 c = repo.dirstate.copies()
3519 c = repo.dirstate.copies()
3500 copied, renamed = [], []
3520 copied, renamed = [], []
3501 for d, s in c.iteritems():
3521 for d, s in c.iteritems():
3502 if s in st[2]:
3522 if s in st[2]:
3503 st[2].remove(s)
3523 st[2].remove(s)
3504 renamed.append(d)
3524 renamed.append(d)
3505 else:
3525 else:
3506 copied.append(d)
3526 copied.append(d)
3507 if d in st[1]:
3527 if d in st[1]:
3508 st[1].remove(d)
3528 st[1].remove(d)
3509 st.insert(3, renamed)
3529 st.insert(3, renamed)
3510 st.insert(4, copied)
3530 st.insert(4, copied)
3511
3531
3512 ms = mergemod.mergestate(repo)
3532 ms = mergemod.mergestate(repo)
3513 st.append([f for f in ms if ms[f] == 'u'])
3533 st.append([f for f in ms if ms[f] == 'u'])
3514
3534
3515 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
3535 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
3516 st.append(subs)
3536 st.append(subs)
3517
3537
3518 labels = [ui.label(_('%d modified'), 'status.modified'),
3538 labels = [ui.label(_('%d modified'), 'status.modified'),
3519 ui.label(_('%d added'), 'status.added'),
3539 ui.label(_('%d added'), 'status.added'),
3520 ui.label(_('%d removed'), 'status.removed'),
3540 ui.label(_('%d removed'), 'status.removed'),
3521 ui.label(_('%d renamed'), 'status.copied'),
3541 ui.label(_('%d renamed'), 'status.copied'),
3522 ui.label(_('%d copied'), 'status.copied'),
3542 ui.label(_('%d copied'), 'status.copied'),
3523 ui.label(_('%d deleted'), 'status.deleted'),
3543 ui.label(_('%d deleted'), 'status.deleted'),
3524 ui.label(_('%d unknown'), 'status.unknown'),
3544 ui.label(_('%d unknown'), 'status.unknown'),
3525 ui.label(_('%d ignored'), 'status.ignored'),
3545 ui.label(_('%d ignored'), 'status.ignored'),
3526 ui.label(_('%d unresolved'), 'resolve.unresolved'),
3546 ui.label(_('%d unresolved'), 'resolve.unresolved'),
3527 ui.label(_('%d subrepos'), 'status.modified')]
3547 ui.label(_('%d subrepos'), 'status.modified')]
3528 t = []
3548 t = []
3529 for s, l in zip(st, labels):
3549 for s, l in zip(st, labels):
3530 if s:
3550 if s:
3531 t.append(l % len(s))
3551 t.append(l % len(s))
3532
3552
3533 t = ', '.join(t)
3553 t = ', '.join(t)
3534 cleanworkdir = False
3554 cleanworkdir = False
3535
3555
3536 if len(parents) > 1:
3556 if len(parents) > 1:
3537 t += _(' (merge)')
3557 t += _(' (merge)')
3538 elif branch != parents[0].branch():
3558 elif branch != parents[0].branch():
3539 t += _(' (new branch)')
3559 t += _(' (new branch)')
3540 elif (parents[0].extra().get('close') and
3560 elif (parents[0].extra().get('close') and
3541 pnode in repo.branchheads(branch, closed=True)):
3561 pnode in repo.branchheads(branch, closed=True)):
3542 t += _(' (head closed)')
3562 t += _(' (head closed)')
3543 elif not (st[0] or st[1] or st[2] or st[3] or st[4] or st[9]):
3563 elif not (st[0] or st[1] or st[2] or st[3] or st[4] or st[9]):
3544 t += _(' (clean)')
3564 t += _(' (clean)')
3545 cleanworkdir = True
3565 cleanworkdir = True
3546 elif pnode not in bheads:
3566 elif pnode not in bheads:
3547 t += _(' (new branch head)')
3567 t += _(' (new branch head)')
3548
3568
3549 if cleanworkdir:
3569 if cleanworkdir:
3550 ui.status(_('commit: %s\n') % t.strip())
3570 ui.status(_('commit: %s\n') % t.strip())
3551 else:
3571 else:
3552 ui.write(_('commit: %s\n') % t.strip())
3572 ui.write(_('commit: %s\n') % t.strip())
3553
3573
3554 # all ancestors of branch heads - all ancestors of parent = new csets
3574 # all ancestors of branch heads - all ancestors of parent = new csets
3555 new = [0] * len(repo)
3575 new = [0] * len(repo)
3556 cl = repo.changelog
3576 cl = repo.changelog
3557 for a in [cl.rev(n) for n in bheads]:
3577 for a in [cl.rev(n) for n in bheads]:
3558 new[a] = 1
3578 new[a] = 1
3559 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3579 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3560 new[a] = 1
3580 new[a] = 1
3561 for a in [p.rev() for p in parents]:
3581 for a in [p.rev() for p in parents]:
3562 if a >= 0:
3582 if a >= 0:
3563 new[a] = 0
3583 new[a] = 0
3564 for a in cl.ancestors(*[p.rev() for p in parents]):
3584 for a in cl.ancestors(*[p.rev() for p in parents]):
3565 new[a] = 0
3585 new[a] = 0
3566 new = sum(new)
3586 new = sum(new)
3567
3587
3568 if new == 0:
3588 if new == 0:
3569 ui.status(_('update: (current)\n'))
3589 ui.status(_('update: (current)\n'))
3570 elif pnode not in bheads:
3590 elif pnode not in bheads:
3571 ui.write(_('update: %d new changesets (update)\n') % new)
3591 ui.write(_('update: %d new changesets (update)\n') % new)
3572 else:
3592 else:
3573 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3593 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3574 (new, len(bheads)))
3594 (new, len(bheads)))
3575
3595
3576 if opts.get('remote'):
3596 if opts.get('remote'):
3577 t = []
3597 t = []
3578 source, branches = hg.parseurl(ui.expandpath('default'))
3598 source, branches = hg.parseurl(ui.expandpath('default'))
3579 other = hg.repository(hg.remoteui(repo, {}), source)
3599 other = hg.repository(hg.remoteui(repo, {}), source)
3580 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
3600 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
3581 ui.debug('comparing with %s\n' % url.hidepassword(source))
3601 ui.debug('comparing with %s\n' % url.hidepassword(source))
3582 repo.ui.pushbuffer()
3602 repo.ui.pushbuffer()
3583 common, incoming, rheads = discovery.findcommonincoming(repo, other)
3603 common, incoming, rheads = discovery.findcommonincoming(repo, other)
3584 repo.ui.popbuffer()
3604 repo.ui.popbuffer()
3585 if incoming:
3605 if incoming:
3586 t.append(_('1 or more incoming'))
3606 t.append(_('1 or more incoming'))
3587
3607
3588 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
3608 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
3589 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
3609 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
3590 other = hg.repository(hg.remoteui(repo, {}), dest)
3610 other = hg.repository(hg.remoteui(repo, {}), dest)
3591 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3611 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3592 repo.ui.pushbuffer()
3612 repo.ui.pushbuffer()
3593 o = discovery.findoutgoing(repo, other)
3613 o = discovery.findoutgoing(repo, other)
3594 repo.ui.popbuffer()
3614 repo.ui.popbuffer()
3595 o = repo.changelog.nodesbetween(o, None)[0]
3615 o = repo.changelog.nodesbetween(o, None)[0]
3596 if o:
3616 if o:
3597 t.append(_('%d outgoing') % len(o))
3617 t.append(_('%d outgoing') % len(o))
3598
3618
3599 if t:
3619 if t:
3600 ui.write(_('remote: %s\n') % (', '.join(t)))
3620 ui.write(_('remote: %s\n') % (', '.join(t)))
3601 else:
3621 else:
3602 ui.status(_('remote: (synced)\n'))
3622 ui.status(_('remote: (synced)\n'))
3603
3623
3604 def tag(ui, repo, name1, *names, **opts):
3624 def tag(ui, repo, name1, *names, **opts):
3605 """add one or more tags for the current or given revision
3625 """add one or more tags for the current or given revision
3606
3626
3607 Name a particular revision using <name>.
3627 Name a particular revision using <name>.
3608
3628
3609 Tags are used to name particular revisions of the repository and are
3629 Tags are used to name particular revisions of the repository and are
3610 very useful to compare different revisions, to go back to significant
3630 very useful to compare different revisions, to go back to significant
3611 earlier versions or to mark branch points as releases, etc.
3631 earlier versions or to mark branch points as releases, etc.
3612
3632
3613 If no revision is given, the parent of the working directory is
3633 If no revision is given, the parent of the working directory is
3614 used, or tip if no revision is checked out.
3634 used, or tip if no revision is checked out.
3615
3635
3616 To facilitate version control, distribution, and merging of tags,
3636 To facilitate version control, distribution, and merging of tags,
3617 they are stored as a file named ".hgtags" which is managed
3637 they are stored as a file named ".hgtags" which is managed
3618 similarly to other project files and can be hand-edited if
3638 similarly to other project files and can be hand-edited if
3619 necessary. The file '.hg/localtags' is used for local tags (not
3639 necessary. The file '.hg/localtags' is used for local tags (not
3620 shared among repositories).
3640 shared among repositories).
3621
3641
3622 See :hg:`help dates` for a list of formats valid for -d/--date.
3642 See :hg:`help dates` for a list of formats valid for -d/--date.
3623
3643
3624 Since tag names have priority over branch names during revision
3644 Since tag names have priority over branch names during revision
3625 lookup, using an existing branch name as a tag name is discouraged.
3645 lookup, using an existing branch name as a tag name is discouraged.
3626
3646
3627 Returns 0 on success.
3647 Returns 0 on success.
3628 """
3648 """
3629
3649
3630 rev_ = "."
3650 rev_ = "."
3631 names = [t.strip() for t in (name1,) + names]
3651 names = [t.strip() for t in (name1,) + names]
3632 if len(names) != len(set(names)):
3652 if len(names) != len(set(names)):
3633 raise util.Abort(_('tag names must be unique'))
3653 raise util.Abort(_('tag names must be unique'))
3634 for n in names:
3654 for n in names:
3635 if n in ['tip', '.', 'null']:
3655 if n in ['tip', '.', 'null']:
3636 raise util.Abort(_('the name \'%s\' is reserved') % n)
3656 raise util.Abort(_('the name \'%s\' is reserved') % n)
3637 if not n:
3657 if not n:
3638 raise util.Abort(_('tag names cannot consist entirely of whitespace'))
3658 raise util.Abort(_('tag names cannot consist entirely of whitespace'))
3639 if opts.get('rev') and opts.get('remove'):
3659 if opts.get('rev') and opts.get('remove'):
3640 raise util.Abort(_("--rev and --remove are incompatible"))
3660 raise util.Abort(_("--rev and --remove are incompatible"))
3641 if opts.get('rev'):
3661 if opts.get('rev'):
3642 rev_ = opts['rev']
3662 rev_ = opts['rev']
3643 message = opts.get('message')
3663 message = opts.get('message')
3644 if opts.get('remove'):
3664 if opts.get('remove'):
3645 expectedtype = opts.get('local') and 'local' or 'global'
3665 expectedtype = opts.get('local') and 'local' or 'global'
3646 for n in names:
3666 for n in names:
3647 if not repo.tagtype(n):
3667 if not repo.tagtype(n):
3648 raise util.Abort(_('tag \'%s\' does not exist') % n)
3668 raise util.Abort(_('tag \'%s\' does not exist') % n)
3649 if repo.tagtype(n) != expectedtype:
3669 if repo.tagtype(n) != expectedtype:
3650 if expectedtype == 'global':
3670 if expectedtype == 'global':
3651 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3671 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3652 else:
3672 else:
3653 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3673 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3654 rev_ = nullid
3674 rev_ = nullid
3655 if not message:
3675 if not message:
3656 # we don't translate commit messages
3676 # we don't translate commit messages
3657 message = 'Removed tag %s' % ', '.join(names)
3677 message = 'Removed tag %s' % ', '.join(names)
3658 elif not opts.get('force'):
3678 elif not opts.get('force'):
3659 for n in names:
3679 for n in names:
3660 if n in repo.tags():
3680 if n in repo.tags():
3661 raise util.Abort(_('tag \'%s\' already exists '
3681 raise util.Abort(_('tag \'%s\' already exists '
3662 '(use -f to force)') % n)
3682 '(use -f to force)') % n)
3663 if not rev_ and repo.dirstate.parents()[1] != nullid:
3683 if not rev_ and repo.dirstate.parents()[1] != nullid:
3664 raise util.Abort(_('uncommitted merge - please provide a '
3684 raise util.Abort(_('uncommitted merge - please provide a '
3665 'specific revision'))
3685 'specific revision'))
3666 r = repo[rev_].node()
3686 r = repo[rev_].node()
3667
3687
3668 if not message:
3688 if not message:
3669 # we don't translate commit messages
3689 # we don't translate commit messages
3670 message = ('Added tag %s for changeset %s' %
3690 message = ('Added tag %s for changeset %s' %
3671 (', '.join(names), short(r)))
3691 (', '.join(names), short(r)))
3672
3692
3673 date = opts.get('date')
3693 date = opts.get('date')
3674 if date:
3694 if date:
3675 date = util.parsedate(date)
3695 date = util.parsedate(date)
3676
3696
3677 if opts.get('edit'):
3697 if opts.get('edit'):
3678 message = ui.edit(message, ui.username())
3698 message = ui.edit(message, ui.username())
3679
3699
3680 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3700 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3681
3701
3682 def tags(ui, repo):
3702 def tags(ui, repo):
3683 """list repository tags
3703 """list repository tags
3684
3704
3685 This lists both regular and local tags. When the -v/--verbose
3705 This lists both regular and local tags. When the -v/--verbose
3686 switch is used, a third column "local" is printed for local tags.
3706 switch is used, a third column "local" is printed for local tags.
3687
3707
3688 Returns 0 on success.
3708 Returns 0 on success.
3689 """
3709 """
3690
3710
3691 hexfunc = ui.debugflag and hex or short
3711 hexfunc = ui.debugflag and hex or short
3692 tagtype = ""
3712 tagtype = ""
3693
3713
3694 for t, n in reversed(repo.tagslist()):
3714 for t, n in reversed(repo.tagslist()):
3695 if ui.quiet:
3715 if ui.quiet:
3696 ui.write("%s\n" % t)
3716 ui.write("%s\n" % t)
3697 continue
3717 continue
3698
3718
3699 try:
3719 try:
3700 hn = hexfunc(n)
3720 hn = hexfunc(n)
3701 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3721 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3702 except error.LookupError:
3722 except error.LookupError:
3703 r = " ?:%s" % hn
3723 r = " ?:%s" % hn
3704 else:
3724 else:
3705 spaces = " " * (30 - encoding.colwidth(t))
3725 spaces = " " * (30 - encoding.colwidth(t))
3706 if ui.verbose:
3726 if ui.verbose:
3707 if repo.tagtype(t) == 'local':
3727 if repo.tagtype(t) == 'local':
3708 tagtype = " local"
3728 tagtype = " local"
3709 else:
3729 else:
3710 tagtype = ""
3730 tagtype = ""
3711 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3731 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3712
3732
3713 def tip(ui, repo, **opts):
3733 def tip(ui, repo, **opts):
3714 """show the tip revision
3734 """show the tip revision
3715
3735
3716 The tip revision (usually just called the tip) is the changeset
3736 The tip revision (usually just called the tip) is the changeset
3717 most recently added to the repository (and therefore the most
3737 most recently added to the repository (and therefore the most
3718 recently changed head).
3738 recently changed head).
3719
3739
3720 If you have just made a commit, that commit will be the tip. If
3740 If you have just made a commit, that commit will be the tip. If
3721 you have just pulled changes from another repository, the tip of
3741 you have just pulled changes from another repository, the tip of
3722 that repository becomes the current tip. The "tip" tag is special
3742 that repository becomes the current tip. The "tip" tag is special
3723 and cannot be renamed or assigned to a different changeset.
3743 and cannot be renamed or assigned to a different changeset.
3724
3744
3725 Returns 0 on success.
3745 Returns 0 on success.
3726 """
3746 """
3727 displayer = cmdutil.show_changeset(ui, repo, opts)
3747 displayer = cmdutil.show_changeset(ui, repo, opts)
3728 displayer.show(repo[len(repo) - 1])
3748 displayer.show(repo[len(repo) - 1])
3729 displayer.close()
3749 displayer.close()
3730
3750
3731 def unbundle(ui, repo, fname1, *fnames, **opts):
3751 def unbundle(ui, repo, fname1, *fnames, **opts):
3732 """apply one or more changegroup files
3752 """apply one or more changegroup files
3733
3753
3734 Apply one or more compressed changegroup files generated by the
3754 Apply one or more compressed changegroup files generated by the
3735 bundle command.
3755 bundle command.
3736
3756
3737 Returns 0 on success, 1 if an update has unresolved files.
3757 Returns 0 on success, 1 if an update has unresolved files.
3738 """
3758 """
3739 fnames = (fname1,) + fnames
3759 fnames = (fname1,) + fnames
3740
3760
3741 lock = repo.lock()
3761 lock = repo.lock()
3742 try:
3762 try:
3743 for fname in fnames:
3763 for fname in fnames:
3744 f = url.open(ui, fname)
3764 f = url.open(ui, fname)
3745 gen = changegroup.readbundle(f, fname)
3765 gen = changegroup.readbundle(f, fname)
3746 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname,
3766 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname,
3747 lock=lock)
3767 lock=lock)
3748 finally:
3768 finally:
3749 lock.release()
3769 lock.release()
3750
3770
3751 return postincoming(ui, repo, modheads, opts.get('update'), None)
3771 return postincoming(ui, repo, modheads, opts.get('update'), None)
3752
3772
3753 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3773 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3754 """update working directory (or switch revisions)
3774 """update working directory (or switch revisions)
3755
3775
3756 Update the repository's working directory to the specified
3776 Update the repository's working directory to the specified
3757 changeset. If no changeset is specified, update to the tip of the
3777 changeset. If no changeset is specified, update to the tip of the
3758 current named branch.
3778 current named branch.
3759
3779
3760 If the changeset is not a descendant of the working directory's
3780 If the changeset is not a descendant of the working directory's
3761 parent, the update is aborted. With the -c/--check option, the
3781 parent, the update is aborted. With the -c/--check option, the
3762 working directory is checked for uncommitted changes; if none are
3782 working directory is checked for uncommitted changes; if none are
3763 found, the working directory is updated to the specified
3783 found, the working directory is updated to the specified
3764 changeset.
3784 changeset.
3765
3785
3766 The following rules apply when the working directory contains
3786 The following rules apply when the working directory contains
3767 uncommitted changes:
3787 uncommitted changes:
3768
3788
3769 1. If neither -c/--check nor -C/--clean is specified, and if
3789 1. If neither -c/--check nor -C/--clean is specified, and if
3770 the requested changeset is an ancestor or descendant of
3790 the requested changeset is an ancestor or descendant of
3771 the working directory's parent, the uncommitted changes
3791 the working directory's parent, the uncommitted changes
3772 are merged into the requested changeset and the merged
3792 are merged into the requested changeset and the merged
3773 result is left uncommitted. If the requested changeset is
3793 result is left uncommitted. If the requested changeset is
3774 not an ancestor or descendant (that is, it is on another
3794 not an ancestor or descendant (that is, it is on another
3775 branch), the update is aborted and the uncommitted changes
3795 branch), the update is aborted and the uncommitted changes
3776 are preserved.
3796 are preserved.
3777
3797
3778 2. With the -c/--check option, the update is aborted and the
3798 2. With the -c/--check option, the update is aborted and the
3779 uncommitted changes are preserved.
3799 uncommitted changes are preserved.
3780
3800
3781 3. With the -C/--clean option, uncommitted changes are discarded and
3801 3. With the -C/--clean option, uncommitted changes are discarded and
3782 the working directory is updated to the requested changeset.
3802 the working directory is updated to the requested changeset.
3783
3803
3784 Use null as the changeset to remove the working directory (like
3804 Use null as the changeset to remove the working directory (like
3785 :hg:`clone -U`).
3805 :hg:`clone -U`).
3786
3806
3787 If you want to update just one file to an older changeset, use
3807 If you want to update just one file to an older changeset, use
3788 :hg:`revert`.
3808 :hg:`revert`.
3789
3809
3790 See :hg:`help dates` for a list of formats valid for -d/--date.
3810 See :hg:`help dates` for a list of formats valid for -d/--date.
3791
3811
3792 Returns 0 on success, 1 if there are unresolved files.
3812 Returns 0 on success, 1 if there are unresolved files.
3793 """
3813 """
3794 if rev and node:
3814 if rev and node:
3795 raise util.Abort(_("please specify just one revision"))
3815 raise util.Abort(_("please specify just one revision"))
3796
3816
3797 if not rev:
3817 if not rev:
3798 rev = node
3818 rev = node
3799
3819
3800 rev = cmdutil.revsingle(repo, rev, rev).rev()
3820 rev = cmdutil.revsingle(repo, rev, rev).rev()
3801
3821
3802 if check and clean:
3822 if check and clean:
3803 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3823 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3804
3824
3805 if check:
3825 if check:
3806 # we could use dirty() but we can ignore merge and branch trivia
3826 # we could use dirty() but we can ignore merge and branch trivia
3807 c = repo[None]
3827 c = repo[None]
3808 if c.modified() or c.added() or c.removed():
3828 if c.modified() or c.added() or c.removed():
3809 raise util.Abort(_("uncommitted local changes"))
3829 raise util.Abort(_("uncommitted local changes"))
3810
3830
3811 if date:
3831 if date:
3812 if rev:
3832 if rev:
3813 raise util.Abort(_("you can't specify a revision and a date"))
3833 raise util.Abort(_("you can't specify a revision and a date"))
3814 rev = cmdutil.finddate(ui, repo, date)
3834 rev = cmdutil.finddate(ui, repo, date)
3815
3835
3816 if clean or check:
3836 if clean or check:
3817 return hg.clean(repo, rev)
3837 return hg.clean(repo, rev)
3818 else:
3838 else:
3819 return hg.update(repo, rev)
3839 return hg.update(repo, rev)
3820
3840
3821 def verify(ui, repo):
3841 def verify(ui, repo):
3822 """verify the integrity of the repository
3842 """verify the integrity of the repository
3823
3843
3824 Verify the integrity of the current repository.
3844 Verify the integrity of the current repository.
3825
3845
3826 This will perform an extensive check of the repository's
3846 This will perform an extensive check of the repository's
3827 integrity, validating the hashes and checksums of each entry in
3847 integrity, validating the hashes and checksums of each entry in
3828 the changelog, manifest, and tracked files, as well as the
3848 the changelog, manifest, and tracked files, as well as the
3829 integrity of their crosslinks and indices.
3849 integrity of their crosslinks and indices.
3830
3850
3831 Returns 0 on success, 1 if errors are encountered.
3851 Returns 0 on success, 1 if errors are encountered.
3832 """
3852 """
3833 return hg.verify(repo)
3853 return hg.verify(repo)
3834
3854
3835 def version_(ui):
3855 def version_(ui):
3836 """output version and copyright information"""
3856 """output version and copyright information"""
3837 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3857 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3838 % util.version())
3858 % util.version())
3839 ui.status(_(
3859 ui.status(_(
3840 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3860 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3841 "This is free software; see the source for copying conditions. "
3861 "This is free software; see the source for copying conditions. "
3842 "There is NO\nwarranty; "
3862 "There is NO\nwarranty; "
3843 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3863 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3844 ))
3864 ))
3845
3865
3846 # Command options and aliases are listed here, alphabetically
3866 # Command options and aliases are listed here, alphabetically
3847
3867
3848 globalopts = [
3868 globalopts = [
3849 ('R', 'repository', '',
3869 ('R', 'repository', '',
3850 _('repository root directory or name of overlay bundle file'),
3870 _('repository root directory or name of overlay bundle file'),
3851 _('REPO')),
3871 _('REPO')),
3852 ('', 'cwd', '',
3872 ('', 'cwd', '',
3853 _('change working directory'), _('DIR')),
3873 _('change working directory'), _('DIR')),
3854 ('y', 'noninteractive', None,
3874 ('y', 'noninteractive', None,
3855 _('do not prompt, assume \'yes\' for any required answers')),
3875 _('do not prompt, assume \'yes\' for any required answers')),
3856 ('q', 'quiet', None, _('suppress output')),
3876 ('q', 'quiet', None, _('suppress output')),
3857 ('v', 'verbose', None, _('enable additional output')),
3877 ('v', 'verbose', None, _('enable additional output')),
3858 ('', 'config', [],
3878 ('', 'config', [],
3859 _('set/override config option (use \'section.name=value\')'),
3879 _('set/override config option (use \'section.name=value\')'),
3860 _('CONFIG')),
3880 _('CONFIG')),
3861 ('', 'debug', None, _('enable debugging output')),
3881 ('', 'debug', None, _('enable debugging output')),
3862 ('', 'debugger', None, _('start debugger')),
3882 ('', 'debugger', None, _('start debugger')),
3863 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
3883 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
3864 _('ENCODE')),
3884 _('ENCODE')),
3865 ('', 'encodingmode', encoding.encodingmode,
3885 ('', 'encodingmode', encoding.encodingmode,
3866 _('set the charset encoding mode'), _('MODE')),
3886 _('set the charset encoding mode'), _('MODE')),
3867 ('', 'traceback', None, _('always print a traceback on exception')),
3887 ('', 'traceback', None, _('always print a traceback on exception')),
3868 ('', 'time', None, _('time how long the command takes')),
3888 ('', 'time', None, _('time how long the command takes')),
3869 ('', 'profile', None, _('print command execution profile')),
3889 ('', 'profile', None, _('print command execution profile')),
3870 ('', 'version', None, _('output version information and exit')),
3890 ('', 'version', None, _('output version information and exit')),
3871 ('h', 'help', None, _('display help and exit')),
3891 ('h', 'help', None, _('display help and exit')),
3872 ]
3892 ]
3873
3893
3874 dryrunopts = [('n', 'dry-run', None,
3894 dryrunopts = [('n', 'dry-run', None,
3875 _('do not perform actions, just print output'))]
3895 _('do not perform actions, just print output'))]
3876
3896
3877 remoteopts = [
3897 remoteopts = [
3878 ('e', 'ssh', '',
3898 ('e', 'ssh', '',
3879 _('specify ssh command to use'), _('CMD')),
3899 _('specify ssh command to use'), _('CMD')),
3880 ('', 'remotecmd', '',
3900 ('', 'remotecmd', '',
3881 _('specify hg command to run on the remote side'), _('CMD')),
3901 _('specify hg command to run on the remote side'), _('CMD')),
3882 ]
3902 ]
3883
3903
3884 walkopts = [
3904 walkopts = [
3885 ('I', 'include', [],
3905 ('I', 'include', [],
3886 _('include names matching the given patterns'), _('PATTERN')),
3906 _('include names matching the given patterns'), _('PATTERN')),
3887 ('X', 'exclude', [],
3907 ('X', 'exclude', [],
3888 _('exclude names matching the given patterns'), _('PATTERN')),
3908 _('exclude names matching the given patterns'), _('PATTERN')),
3889 ]
3909 ]
3890
3910
3891 commitopts = [
3911 commitopts = [
3892 ('m', 'message', '',
3912 ('m', 'message', '',
3893 _('use text as commit message'), _('TEXT')),
3913 _('use text as commit message'), _('TEXT')),
3894 ('l', 'logfile', '',
3914 ('l', 'logfile', '',
3895 _('read commit message from file'), _('FILE')),
3915 _('read commit message from file'), _('FILE')),
3896 ]
3916 ]
3897
3917
3898 commitopts2 = [
3918 commitopts2 = [
3899 ('d', 'date', '',
3919 ('d', 'date', '',
3900 _('record datecode as commit date'), _('DATE')),
3920 _('record datecode as commit date'), _('DATE')),
3901 ('u', 'user', '',
3921 ('u', 'user', '',
3902 _('record the specified user as committer'), _('USER')),
3922 _('record the specified user as committer'), _('USER')),
3903 ]
3923 ]
3904
3924
3905 templateopts = [
3925 templateopts = [
3906 ('', 'style', '',
3926 ('', 'style', '',
3907 _('display using template map file'), _('STYLE')),
3927 _('display using template map file'), _('STYLE')),
3908 ('', 'template', '',
3928 ('', 'template', '',
3909 _('display with template'), _('TEMPLATE')),
3929 _('display with template'), _('TEMPLATE')),
3910 ]
3930 ]
3911
3931
3912 logopts = [
3932 logopts = [
3913 ('p', 'patch', None, _('show patch')),
3933 ('p', 'patch', None, _('show patch')),
3914 ('g', 'git', None, _('use git extended diff format')),
3934 ('g', 'git', None, _('use git extended diff format')),
3915 ('l', 'limit', '',
3935 ('l', 'limit', '',
3916 _('limit number of changes displayed'), _('NUM')),
3936 _('limit number of changes displayed'), _('NUM')),
3917 ('M', 'no-merges', None, _('do not show merges')),
3937 ('M', 'no-merges', None, _('do not show merges')),
3918 ('', 'stat', None, _('output diffstat-style summary of changes')),
3938 ('', 'stat', None, _('output diffstat-style summary of changes')),
3919 ] + templateopts
3939 ] + templateopts
3920
3940
3921 diffopts = [
3941 diffopts = [
3922 ('a', 'text', None, _('treat all files as text')),
3942 ('a', 'text', None, _('treat all files as text')),
3923 ('g', 'git', None, _('use git extended diff format')),
3943 ('g', 'git', None, _('use git extended diff format')),
3924 ('', 'nodates', None, _('omit dates from diff headers'))
3944 ('', 'nodates', None, _('omit dates from diff headers'))
3925 ]
3945 ]
3926
3946
3927 diffopts2 = [
3947 diffopts2 = [
3928 ('p', 'show-function', None, _('show which function each change is in')),
3948 ('p', 'show-function', None, _('show which function each change is in')),
3929 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3949 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3930 ('w', 'ignore-all-space', None,
3950 ('w', 'ignore-all-space', None,
3931 _('ignore white space when comparing lines')),
3951 _('ignore white space when comparing lines')),
3932 ('b', 'ignore-space-change', None,
3952 ('b', 'ignore-space-change', None,
3933 _('ignore changes in the amount of white space')),
3953 _('ignore changes in the amount of white space')),
3934 ('B', 'ignore-blank-lines', None,
3954 ('B', 'ignore-blank-lines', None,
3935 _('ignore changes whose lines are all blank')),
3955 _('ignore changes whose lines are all blank')),
3936 ('U', 'unified', '',
3956 ('U', 'unified', '',
3937 _('number of lines of context to show'), _('NUM')),
3957 _('number of lines of context to show'), _('NUM')),
3938 ('', 'stat', None, _('output diffstat-style summary of changes')),
3958 ('', 'stat', None, _('output diffstat-style summary of changes')),
3939 ]
3959 ]
3940
3960
3941 similarityopts = [
3961 similarityopts = [
3942 ('s', 'similarity', '',
3962 ('s', 'similarity', '',
3943 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
3963 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
3944 ]
3964 ]
3945
3965
3946 subrepoopts = [
3966 subrepoopts = [
3947 ('S', 'subrepos', None,
3967 ('S', 'subrepos', None,
3948 _('recurse into subrepositories'))
3968 _('recurse into subrepositories'))
3949 ]
3969 ]
3950
3970
3951 table = {
3971 table = {
3952 "^add": (add, walkopts + subrepoopts + dryrunopts,
3972 "^add": (add, walkopts + subrepoopts + dryrunopts,
3953 _('[OPTION]... [FILE]...')),
3973 _('[OPTION]... [FILE]...')),
3954 "addremove":
3974 "addremove":
3955 (addremove, similarityopts + walkopts + dryrunopts,
3975 (addremove, similarityopts + walkopts + dryrunopts,
3956 _('[OPTION]... [FILE]...')),
3976 _('[OPTION]... [FILE]...')),
3957 "^annotate|blame":
3977 "^annotate|blame":
3958 (annotate,
3978 (annotate,
3959 [('r', 'rev', '',
3979 [('r', 'rev', '',
3960 _('annotate the specified revision'), _('REV')),
3980 _('annotate the specified revision'), _('REV')),
3961 ('', 'follow', None,
3981 ('', 'follow', None,
3962 _('follow copies/renames and list the filename (DEPRECATED)')),
3982 _('follow copies/renames and list the filename (DEPRECATED)')),
3963 ('', 'no-follow', None, _("don't follow copies and renames")),
3983 ('', 'no-follow', None, _("don't follow copies and renames")),
3964 ('a', 'text', None, _('treat all files as text')),
3984 ('a', 'text', None, _('treat all files as text')),
3965 ('u', 'user', None, _('list the author (long with -v)')),
3985 ('u', 'user', None, _('list the author (long with -v)')),
3966 ('f', 'file', None, _('list the filename')),
3986 ('f', 'file', None, _('list the filename')),
3967 ('d', 'date', None, _('list the date (short with -q)')),
3987 ('d', 'date', None, _('list the date (short with -q)')),
3968 ('n', 'number', None, _('list the revision number (default)')),
3988 ('n', 'number', None, _('list the revision number (default)')),
3969 ('c', 'changeset', None, _('list the changeset')),
3989 ('c', 'changeset', None, _('list the changeset')),
3970 ('l', 'line-number', None,
3990 ('l', 'line-number', None,
3971 _('show line number at the first appearance'))
3991 _('show line number at the first appearance'))
3972 ] + walkopts,
3992 ] + walkopts,
3973 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3993 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3974 "archive":
3994 "archive":
3975 (archive,
3995 (archive,
3976 [('', 'no-decode', None, _('do not pass files through decoders')),
3996 [('', 'no-decode', None, _('do not pass files through decoders')),
3977 ('p', 'prefix', '',
3997 ('p', 'prefix', '',
3978 _('directory prefix for files in archive'), _('PREFIX')),
3998 _('directory prefix for files in archive'), _('PREFIX')),
3979 ('r', 'rev', '',
3999 ('r', 'rev', '',
3980 _('revision to distribute'), _('REV')),
4000 _('revision to distribute'), _('REV')),
3981 ('t', 'type', '',
4001 ('t', 'type', '',
3982 _('type of distribution to create'), _('TYPE')),
4002 _('type of distribution to create'), _('TYPE')),
3983 ] + subrepoopts + walkopts,
4003 ] + subrepoopts + walkopts,
3984 _('[OPTION]... DEST')),
4004 _('[OPTION]... DEST')),
3985 "backout":
4005 "backout":
3986 (backout,
4006 (backout,
3987 [('', 'merge', None,
4007 [('', 'merge', None,
3988 _('merge with old dirstate parent after backout')),
4008 _('merge with old dirstate parent after backout')),
3989 ('', 'parent', '',
4009 ('', 'parent', '',
3990 _('parent to choose when backing out merge'), _('REV')),
4010 _('parent to choose when backing out merge'), _('REV')),
3991 ('r', 'rev', '',
4011 ('r', 'rev', '',
3992 _('revision to backout'), _('REV')),
4012 _('revision to backout'), _('REV')),
3993 ] + walkopts + commitopts + commitopts2,
4013 ] + walkopts + commitopts + commitopts2,
3994 _('[OPTION]... [-r] REV')),
4014 _('[OPTION]... [-r] REV')),
3995 "bisect":
4015 "bisect":
3996 (bisect,
4016 (bisect,
3997 [('r', 'reset', False, _('reset bisect state')),
4017 [('r', 'reset', False, _('reset bisect state')),
3998 ('g', 'good', False, _('mark changeset good')),
4018 ('g', 'good', False, _('mark changeset good')),
3999 ('b', 'bad', False, _('mark changeset bad')),
4019 ('b', 'bad', False, _('mark changeset bad')),
4000 ('s', 'skip', False, _('skip testing changeset')),
4020 ('s', 'skip', False, _('skip testing changeset')),
4001 ('c', 'command', '',
4021 ('c', 'command', '',
4002 _('use command to check changeset state'), _('CMD')),
4022 _('use command to check changeset state'), _('CMD')),
4003 ('U', 'noupdate', False, _('do not update to target'))],
4023 ('U', 'noupdate', False, _('do not update to target'))],
4004 _("[-gbsr] [-U] [-c CMD] [REV]")),
4024 _("[-gbsr] [-U] [-c CMD] [REV]")),
4005 "branch":
4025 "branch":
4006 (branch,
4026 (branch,
4007 [('f', 'force', None,
4027 [('f', 'force', None,
4008 _('set branch name even if it shadows an existing branch')),
4028 _('set branch name even if it shadows an existing branch')),
4009 ('C', 'clean', None, _('reset branch name to parent branch name'))],
4029 ('C', 'clean', None, _('reset branch name to parent branch name'))],
4010 _('[-fC] [NAME]')),
4030 _('[-fC] [NAME]')),
4011 "branches":
4031 "branches":
4012 (branches,
4032 (branches,
4013 [('a', 'active', False,
4033 [('a', 'active', False,
4014 _('show only branches that have unmerged heads')),
4034 _('show only branches that have unmerged heads')),
4015 ('c', 'closed', False,
4035 ('c', 'closed', False,
4016 _('show normal and closed branches'))],
4036 _('show normal and closed branches'))],
4017 _('[-ac]')),
4037 _('[-ac]')),
4018 "bundle":
4038 "bundle":
4019 (bundle,
4039 (bundle,
4020 [('f', 'force', None,
4040 [('f', 'force', None,
4021 _('run even when the destination is unrelated')),
4041 _('run even when the destination is unrelated')),
4022 ('r', 'rev', [],
4042 ('r', 'rev', [],
4023 _('a changeset intended to be added to the destination'),
4043 _('a changeset intended to be added to the destination'),
4024 _('REV')),
4044 _('REV')),
4025 ('b', 'branch', [],
4045 ('b', 'branch', [],
4026 _('a specific branch you would like to bundle'),
4046 _('a specific branch you would like to bundle'),
4027 _('BRANCH')),
4047 _('BRANCH')),
4028 ('', 'base', [],
4048 ('', 'base', [],
4029 _('a base changeset assumed to be available at the destination'),
4049 _('a base changeset assumed to be available at the destination'),
4030 _('REV')),
4050 _('REV')),
4031 ('a', 'all', None, _('bundle all changesets in the repository')),
4051 ('a', 'all', None, _('bundle all changesets in the repository')),
4032 ('t', 'type', 'bzip2',
4052 ('t', 'type', 'bzip2',
4033 _('bundle compression type to use'), _('TYPE')),
4053 _('bundle compression type to use'), _('TYPE')),
4034 ] + remoteopts,
4054 ] + remoteopts,
4035 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
4055 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
4036 "cat":
4056 "cat":
4037 (cat,
4057 (cat,
4038 [('o', 'output', '',
4058 [('o', 'output', '',
4039 _('print output to file with formatted name'), _('FORMAT')),
4059 _('print output to file with formatted name'), _('FORMAT')),
4040 ('r', 'rev', '',
4060 ('r', 'rev', '',
4041 _('print the given revision'), _('REV')),
4061 _('print the given revision'), _('REV')),
4042 ('', 'decode', None, _('apply any matching decode filter')),
4062 ('', 'decode', None, _('apply any matching decode filter')),
4043 ] + walkopts,
4063 ] + walkopts,
4044 _('[OPTION]... FILE...')),
4064 _('[OPTION]... FILE...')),
4045 "^clone":
4065 "^clone":
4046 (clone,
4066 (clone,
4047 [('U', 'noupdate', None,
4067 [('U', 'noupdate', None,
4048 _('the clone will include an empty working copy (only a repository)')),
4068 _('the clone will include an empty working copy (only a repository)')),
4049 ('u', 'updaterev', '',
4069 ('u', 'updaterev', '',
4050 _('revision, tag or branch to check out'), _('REV')),
4070 _('revision, tag or branch to check out'), _('REV')),
4051 ('r', 'rev', [],
4071 ('r', 'rev', [],
4052 _('include the specified changeset'), _('REV')),
4072 _('include the specified changeset'), _('REV')),
4053 ('b', 'branch', [],
4073 ('b', 'branch', [],
4054 _('clone only the specified branch'), _('BRANCH')),
4074 _('clone only the specified branch'), _('BRANCH')),
4055 ('', 'pull', None, _('use pull protocol to copy metadata')),
4075 ('', 'pull', None, _('use pull protocol to copy metadata')),
4056 ('', 'uncompressed', None,
4076 ('', 'uncompressed', None,
4057 _('use uncompressed transfer (fast over LAN)')),
4077 _('use uncompressed transfer (fast over LAN)')),
4058 ] + remoteopts,
4078 ] + remoteopts,
4059 _('[OPTION]... SOURCE [DEST]')),
4079 _('[OPTION]... SOURCE [DEST]')),
4060 "^commit|ci":
4080 "^commit|ci":
4061 (commit,
4081 (commit,
4062 [('A', 'addremove', None,
4082 [('A', 'addremove', None,
4063 _('mark new/missing files as added/removed before committing')),
4083 _('mark new/missing files as added/removed before committing')),
4064 ('', 'close-branch', None,
4084 ('', 'close-branch', None,
4065 _('mark a branch as closed, hiding it from the branch list')),
4085 _('mark a branch as closed, hiding it from the branch list')),
4066 ] + walkopts + commitopts + commitopts2,
4086 ] + walkopts + commitopts + commitopts2,
4067 _('[OPTION]... [FILE]...')),
4087 _('[OPTION]... [FILE]...')),
4068 "copy|cp":
4088 "copy|cp":
4069 (copy,
4089 (copy,
4070 [('A', 'after', None, _('record a copy that has already occurred')),
4090 [('A', 'after', None, _('record a copy that has already occurred')),
4071 ('f', 'force', None,
4091 ('f', 'force', None,
4072 _('forcibly copy over an existing managed file')),
4092 _('forcibly copy over an existing managed file')),
4073 ] + walkopts + dryrunopts,
4093 ] + walkopts + dryrunopts,
4074 _('[OPTION]... [SOURCE]... DEST')),
4094 _('[OPTION]... [SOURCE]... DEST')),
4075 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
4095 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
4076 "debugbuilddag":
4096 "debugbuilddag":
4077 (debugbuilddag,
4097 (debugbuilddag,
4078 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
4098 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
4079 ('a', 'appended-file', None, _('add single file all revs append to')),
4099 ('a', 'appended-file', None, _('add single file all revs append to')),
4080 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
4100 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
4081 ('n', 'new-file', None, _('add new file at each rev')),
4101 ('n', 'new-file', None, _('add new file at each rev')),
4082 ],
4102 ],
4083 _('[OPTION]... TEXT')),
4103 _('[OPTION]... TEXT')),
4084 "debugcheckstate": (debugcheckstate, [], ''),
4104 "debugcheckstate": (debugcheckstate, [], ''),
4085 "debugcommands": (debugcommands, [], _('[COMMAND]')),
4105 "debugcommands": (debugcommands, [], _('[COMMAND]')),
4086 "debugcomplete":
4106 "debugcomplete":
4087 (debugcomplete,
4107 (debugcomplete,
4088 [('o', 'options', None, _('show the command options'))],
4108 [('o', 'options', None, _('show the command options'))],
4089 _('[-o] CMD')),
4109 _('[-o] CMD')),
4090 "debugdag":
4110 "debugdag":
4091 (debugdag,
4111 (debugdag,
4092 [('t', 'tags', None, _('use tags as labels')),
4112 [('t', 'tags', None, _('use tags as labels')),
4093 ('b', 'branches', None, _('annotate with branch names')),
4113 ('b', 'branches', None, _('annotate with branch names')),
4094 ('', 'dots', None, _('use dots for runs')),
4114 ('', 'dots', None, _('use dots for runs')),
4095 ('s', 'spaces', None, _('separate elements by spaces')),
4115 ('s', 'spaces', None, _('separate elements by spaces')),
4096 ],
4116 ],
4097 _('[OPTION]... [FILE [REV]...]')),
4117 _('[OPTION]... [FILE [REV]...]')),
4098 "debugdate":
4118 "debugdate":
4099 (debugdate,
4119 (debugdate,
4100 [('e', 'extended', None, _('try extended date formats'))],
4120 [('e', 'extended', None, _('try extended date formats'))],
4101 _('[-e] DATE [RANGE]')),
4121 _('[-e] DATE [RANGE]')),
4102 "debugdata": (debugdata, [], _('FILE REV')),
4122 "debugdata": (debugdata, [], _('FILE REV')),
4103 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
4123 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
4104 "debugindex": (debugindex, [], _('FILE')),
4124 "debugindex": (debugindex, [], _('FILE')),
4105 "debugindexdot": (debugindexdot, [], _('FILE')),
4125 "debugindexdot": (debugindexdot, [], _('FILE')),
4106 "debuginstall": (debuginstall, [], ''),
4126 "debuginstall": (debuginstall, [], ''),
4107 "debugpushkey": (debugpushkey, [], _('REPO NAMESPACE [KEY OLD NEW]')),
4127 "debugpushkey": (debugpushkey, [], _('REPO NAMESPACE [KEY OLD NEW]')),
4108 "debugrebuildstate":
4128 "debugrebuildstate":
4109 (debugrebuildstate,
4129 (debugrebuildstate,
4110 [('r', 'rev', '',
4130 [('r', 'rev', '',
4111 _('revision to rebuild to'), _('REV'))],
4131 _('revision to rebuild to'), _('REV'))],
4112 _('[-r REV] [REV]')),
4132 _('[-r REV] [REV]')),
4113 "debugrename":
4133 "debugrename":
4114 (debugrename,
4134 (debugrename,
4115 [('r', 'rev', '',
4135 [('r', 'rev', '',
4116 _('revision to debug'), _('REV'))],
4136 _('revision to debug'), _('REV'))],
4117 _('[-r REV] FILE')),
4137 _('[-r REV] FILE')),
4118 "debugrevspec":
4138 "debugrevspec":
4119 (debugrevspec, [], ('REVSPEC')),
4139 (debugrevspec, [], ('REVSPEC')),
4120 "debugsetparents":
4140 "debugsetparents":
4121 (debugsetparents, [], _('REV1 [REV2]')),
4141 (debugsetparents, [], _('REV1 [REV2]')),
4122 "debugstate":
4142 "debugstate":
4123 (debugstate,
4143 (debugstate,
4124 [('', 'nodates', None, _('do not display the saved mtime'))],
4144 [('', 'nodates', None, _('do not display the saved mtime'))],
4125 _('[OPTION]...')),
4145 _('[OPTION]...')),
4126 "debugsub":
4146 "debugsub":
4127 (debugsub,
4147 (debugsub,
4128 [('r', 'rev', '',
4148 [('r', 'rev', '',
4129 _('revision to check'), _('REV'))],
4149 _('revision to check'), _('REV'))],
4130 _('[-r REV] [REV]')),
4150 _('[-r REV] [REV]')),
4131 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
4151 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
4132 "^diff":
4152 "^diff":
4133 (diff,
4153 (diff,
4134 [('r', 'rev', [],
4154 [('r', 'rev', [],
4135 _('revision'), _('REV')),
4155 _('revision'), _('REV')),
4136 ('c', 'change', '',
4156 ('c', 'change', '',
4137 _('change made by revision'), _('REV'))
4157 _('change made by revision'), _('REV'))
4138 ] + diffopts + diffopts2 + walkopts + subrepoopts,
4158 ] + diffopts + diffopts2 + walkopts + subrepoopts,
4139 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...')),
4159 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...')),
4140 "^export":
4160 "^export":
4141 (export,
4161 (export,
4142 [('o', 'output', '',
4162 [('o', 'output', '',
4143 _('print output to file with formatted name'), _('FORMAT')),
4163 _('print output to file with formatted name'), _('FORMAT')),
4144 ('', 'switch-parent', None, _('diff against the second parent')),
4164 ('', 'switch-parent', None, _('diff against the second parent')),
4145 ('r', 'rev', [],
4165 ('r', 'rev', [],
4146 _('revisions to export'), _('REV')),
4166 _('revisions to export'), _('REV')),
4147 ] + diffopts,
4167 ] + diffopts,
4148 _('[OPTION]... [-o OUTFILESPEC] REV...')),
4168 _('[OPTION]... [-o OUTFILESPEC] REV...')),
4149 "^forget":
4169 "^forget":
4150 (forget,
4170 (forget,
4151 [] + walkopts,
4171 [] + walkopts,
4152 _('[OPTION]... FILE...')),
4172 _('[OPTION]... FILE...')),
4153 "grep":
4173 "grep":
4154 (grep,
4174 (grep,
4155 [('0', 'print0', None, _('end fields with NUL')),
4175 [('0', 'print0', None, _('end fields with NUL')),
4156 ('', 'all', None, _('print all revisions that match')),
4176 ('', 'all', None, _('print all revisions that match')),
4157 ('f', 'follow', None,
4177 ('f', 'follow', None,
4158 _('follow changeset history,'
4178 _('follow changeset history,'
4159 ' or file history across copies and renames')),
4179 ' or file history across copies and renames')),
4160 ('i', 'ignore-case', None, _('ignore case when matching')),
4180 ('i', 'ignore-case', None, _('ignore case when matching')),
4161 ('l', 'files-with-matches', None,
4181 ('l', 'files-with-matches', None,
4162 _('print only filenames and revisions that match')),
4182 _('print only filenames and revisions that match')),
4163 ('n', 'line-number', None, _('print matching line numbers')),
4183 ('n', 'line-number', None, _('print matching line numbers')),
4164 ('r', 'rev', [],
4184 ('r', 'rev', [],
4165 _('only search files changed within revision range'), _('REV')),
4185 _('only search files changed within revision range'), _('REV')),
4166 ('u', 'user', None, _('list the author (long with -v)')),
4186 ('u', 'user', None, _('list the author (long with -v)')),
4167 ('d', 'date', None, _('list the date (short with -q)')),
4187 ('d', 'date', None, _('list the date (short with -q)')),
4168 ] + walkopts,
4188 ] + walkopts,
4169 _('[OPTION]... PATTERN [FILE]...')),
4189 _('[OPTION]... PATTERN [FILE]...')),
4170 "heads":
4190 "heads":
4171 (heads,
4191 (heads,
4172 [('r', 'rev', '',
4192 [('r', 'rev', '',
4173 _('show only heads which are descendants of STARTREV'),
4193 _('show only heads which are descendants of STARTREV'),
4174 _('STARTREV')),
4194 _('STARTREV')),
4175 ('t', 'topo', False, _('show topological heads only')),
4195 ('t', 'topo', False, _('show topological heads only')),
4176 ('a', 'active', False,
4196 ('a', 'active', False,
4177 _('show active branchheads only (DEPRECATED)')),
4197 _('show active branchheads only (DEPRECATED)')),
4178 ('c', 'closed', False,
4198 ('c', 'closed', False,
4179 _('show normal and closed branch heads')),
4199 _('show normal and closed branch heads')),
4180 ] + templateopts,
4200 ] + templateopts,
4181 _('[-ac] [-r STARTREV] [REV]...')),
4201 _('[-ac] [-r STARTREV] [REV]...')),
4182 "help": (help_, [], _('[TOPIC]')),
4202 "help": (help_, [], _('[TOPIC]')),
4183 "identify|id":
4203 "identify|id":
4184 (identify,
4204 (identify,
4185 [('r', 'rev', '',
4205 [('r', 'rev', '',
4186 _('identify the specified revision'), _('REV')),
4206 _('identify the specified revision'), _('REV')),
4187 ('n', 'num', None, _('show local revision number')),
4207 ('n', 'num', None, _('show local revision number')),
4188 ('i', 'id', None, _('show global revision id')),
4208 ('i', 'id', None, _('show global revision id')),
4189 ('b', 'branch', None, _('show branch')),
4209 ('b', 'branch', None, _('show branch')),
4190 ('t', 'tags', None, _('show tags'))],
4210 ('t', 'tags', None, _('show tags'))],
4191 _('[-nibt] [-r REV] [SOURCE]')),
4211 _('[-nibt] [-r REV] [SOURCE]')),
4192 "import|patch":
4212 "import|patch":
4193 (import_,
4213 (import_,
4194 [('p', 'strip', 1,
4214 [('p', 'strip', 1,
4195 _('directory strip option for patch. This has the same '
4215 _('directory strip option for patch. This has the same '
4196 'meaning as the corresponding patch option'),
4216 'meaning as the corresponding patch option'),
4197 _('NUM')),
4217 _('NUM')),
4198 ('b', 'base', '',
4218 ('b', 'base', '',
4199 _('base path'), _('PATH')),
4219 _('base path'), _('PATH')),
4200 ('f', 'force', None,
4220 ('f', 'force', None,
4201 _('skip check for outstanding uncommitted changes')),
4221 _('skip check for outstanding uncommitted changes')),
4202 ('', 'no-commit', None,
4222 ('', 'no-commit', None,
4203 _("don't commit, just update the working directory")),
4223 _("don't commit, just update the working directory")),
4204 ('', 'exact', None,
4224 ('', 'exact', None,
4205 _('apply patch to the nodes from which it was generated')),
4225 _('apply patch to the nodes from which it was generated')),
4206 ('', 'import-branch', None,
4226 ('', 'import-branch', None,
4207 _('use any branch information in patch (implied by --exact)'))] +
4227 _('use any branch information in patch (implied by --exact)'))] +
4208 commitopts + commitopts2 + similarityopts,
4228 commitopts + commitopts2 + similarityopts,
4209 _('[OPTION]... PATCH...')),
4229 _('[OPTION]... PATCH...')),
4210 "incoming|in":
4230 "incoming|in":
4211 (incoming,
4231 (incoming,
4212 [('f', 'force', None,
4232 [('f', 'force', None,
4213 _('run even if remote repository is unrelated')),
4233 _('run even if remote repository is unrelated')),
4214 ('n', 'newest-first', None, _('show newest record first')),
4234 ('n', 'newest-first', None, _('show newest record first')),
4215 ('', 'bundle', '',
4235 ('', 'bundle', '',
4216 _('file to store the bundles into'), _('FILE')),
4236 _('file to store the bundles into'), _('FILE')),
4217 ('r', 'rev', [],
4237 ('r', 'rev', [],
4218 _('a remote changeset intended to be added'), _('REV')),
4238 _('a remote changeset intended to be added'), _('REV')),
4219 ('b', 'branch', [],
4239 ('b', 'branch', [],
4220 _('a specific branch you would like to pull'), _('BRANCH')),
4240 _('a specific branch you would like to pull'), _('BRANCH')),
4221 ] + logopts + remoteopts + subrepoopts,
4241 ] + logopts + remoteopts + subrepoopts,
4222 _('[-p] [-n] [-M] [-f] [-r REV]...'
4242 _('[-p] [-n] [-M] [-f] [-r REV]...'
4223 ' [--bundle FILENAME] [SOURCE]')),
4243 ' [--bundle FILENAME] [SOURCE]')),
4224 "^init":
4244 "^init":
4225 (init,
4245 (init,
4226 remoteopts,
4246 remoteopts,
4227 _('[-e CMD] [--remotecmd CMD] [DEST]')),
4247 _('[-e CMD] [--remotecmd CMD] [DEST]')),
4228 "locate":
4248 "locate":
4229 (locate,
4249 (locate,
4230 [('r', 'rev', '',
4250 [('r', 'rev', '',
4231 _('search the repository as it is in REV'), _('REV')),
4251 _('search the repository as it is in REV'), _('REV')),
4232 ('0', 'print0', None,
4252 ('0', 'print0', None,
4233 _('end filenames with NUL, for use with xargs')),
4253 _('end filenames with NUL, for use with xargs')),
4234 ('f', 'fullpath', None,
4254 ('f', 'fullpath', None,
4235 _('print complete paths from the filesystem root')),
4255 _('print complete paths from the filesystem root')),
4236 ] + walkopts,
4256 ] + walkopts,
4237 _('[OPTION]... [PATTERN]...')),
4257 _('[OPTION]... [PATTERN]...')),
4238 "^log|history":
4258 "^log|history":
4239 (log,
4259 (log,
4240 [('f', 'follow', None,
4260 [('f', 'follow', None,
4241 _('follow changeset history,'
4261 _('follow changeset history,'
4242 ' or file history across copies and renames')),
4262 ' or file history across copies and renames')),
4243 ('', 'follow-first', None,
4263 ('', 'follow-first', None,
4244 _('only follow the first parent of merge changesets')),
4264 _('only follow the first parent of merge changesets')),
4245 ('d', 'date', '',
4265 ('d', 'date', '',
4246 _('show revisions matching date spec'), _('DATE')),
4266 _('show revisions matching date spec'), _('DATE')),
4247 ('C', 'copies', None, _('show copied files')),
4267 ('C', 'copies', None, _('show copied files')),
4248 ('k', 'keyword', [],
4268 ('k', 'keyword', [],
4249 _('do case-insensitive search for a given text'), _('TEXT')),
4269 _('do case-insensitive search for a given text'), _('TEXT')),
4250 ('r', 'rev', [],
4270 ('r', 'rev', [],
4251 _('show the specified revision or range'), _('REV')),
4271 _('show the specified revision or range'), _('REV')),
4252 ('', 'removed', None, _('include revisions where files were removed')),
4272 ('', 'removed', None, _('include revisions where files were removed')),
4253 ('m', 'only-merges', None, _('show only merges')),
4273 ('m', 'only-merges', None, _('show only merges')),
4254 ('u', 'user', [],
4274 ('u', 'user', [],
4255 _('revisions committed by user'), _('USER')),
4275 _('revisions committed by user'), _('USER')),
4256 ('', 'only-branch', [],
4276 ('', 'only-branch', [],
4257 _('show only changesets within the given named branch (DEPRECATED)'),
4277 _('show only changesets within the given named branch (DEPRECATED)'),
4258 _('BRANCH')),
4278 _('BRANCH')),
4259 ('b', 'branch', [],
4279 ('b', 'branch', [],
4260 _('show changesets within the given named branch'), _('BRANCH')),
4280 _('show changesets within the given named branch'), _('BRANCH')),
4261 ('P', 'prune', [],
4281 ('P', 'prune', [],
4262 _('do not display revision or any of its ancestors'), _('REV')),
4282 _('do not display revision or any of its ancestors'), _('REV')),
4263 ] + logopts + walkopts,
4283 ] + logopts + walkopts,
4264 _('[OPTION]... [FILE]')),
4284 _('[OPTION]... [FILE]')),
4265 "manifest":
4285 "manifest":
4266 (manifest,
4286 (manifest,
4267 [('r', 'rev', '',
4287 [('r', 'rev', '',
4268 _('revision to display'), _('REV'))],
4288 _('revision to display'), _('REV'))],
4269 _('[-r REV]')),
4289 _('[-r REV]')),
4270 "^merge":
4290 "^merge":
4271 (merge,
4291 (merge,
4272 [('f', 'force', None, _('force a merge with outstanding changes')),
4292 [('f', 'force', None, _('force a merge with outstanding changes')),
4293 ('t', 'tool', '', _('specify merge tool')),
4273 ('r', 'rev', '',
4294 ('r', 'rev', '',
4274 _('revision to merge'), _('REV')),
4295 _('revision to merge'), _('REV')),
4275 ('P', 'preview', None,
4296 ('P', 'preview', None,
4276 _('review revisions to merge (no merge is performed)'))],
4297 _('review revisions to merge (no merge is performed)'))],
4277 _('[-P] [-f] [[-r] REV]')),
4298 _('[-P] [-f] [[-r] REV]')),
4278 "outgoing|out":
4299 "outgoing|out":
4279 (outgoing,
4300 (outgoing,
4280 [('f', 'force', None,
4301 [('f', 'force', None,
4281 _('run even when the destination is unrelated')),
4302 _('run even when the destination is unrelated')),
4282 ('r', 'rev', [],
4303 ('r', 'rev', [],
4283 _('a changeset intended to be included in the destination'),
4304 _('a changeset intended to be included in the destination'),
4284 _('REV')),
4305 _('REV')),
4285 ('n', 'newest-first', None, _('show newest record first')),
4306 ('n', 'newest-first', None, _('show newest record first')),
4286 ('b', 'branch', [],
4307 ('b', 'branch', [],
4287 _('a specific branch you would like to push'), _('BRANCH')),
4308 _('a specific branch you would like to push'), _('BRANCH')),
4288 ] + logopts + remoteopts + subrepoopts,
4309 ] + logopts + remoteopts + subrepoopts,
4289 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
4310 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
4290 "parents":
4311 "parents":
4291 (parents,
4312 (parents,
4292 [('r', 'rev', '',
4313 [('r', 'rev', '',
4293 _('show parents of the specified revision'), _('REV')),
4314 _('show parents of the specified revision'), _('REV')),
4294 ] + templateopts,
4315 ] + templateopts,
4295 _('[-r REV] [FILE]')),
4316 _('[-r REV] [FILE]')),
4296 "paths": (paths, [], _('[NAME]')),
4317 "paths": (paths, [], _('[NAME]')),
4297 "^pull":
4318 "^pull":
4298 (pull,
4319 (pull,
4299 [('u', 'update', None,
4320 [('u', 'update', None,
4300 _('update to new branch head if changesets were pulled')),
4321 _('update to new branch head if changesets were pulled')),
4301 ('f', 'force', None,
4322 ('f', 'force', None,
4302 _('run even when remote repository is unrelated')),
4323 _('run even when remote repository is unrelated')),
4303 ('r', 'rev', [],
4324 ('r', 'rev', [],
4304 _('a remote changeset intended to be added'), _('REV')),
4325 _('a remote changeset intended to be added'), _('REV')),
4305 ('b', 'branch', [],
4326 ('b', 'branch', [],
4306 _('a specific branch you would like to pull'), _('BRANCH')),
4327 _('a specific branch you would like to pull'), _('BRANCH')),
4307 ] + remoteopts,
4328 ] + remoteopts,
4308 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
4329 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
4309 "^push":
4330 "^push":
4310 (push,
4331 (push,
4311 [('f', 'force', None, _('force push')),
4332 [('f', 'force', None, _('force push')),
4312 ('r', 'rev', [],
4333 ('r', 'rev', [],
4313 _('a changeset intended to be included in the destination'),
4334 _('a changeset intended to be included in the destination'),
4314 _('REV')),
4335 _('REV')),
4315 ('b', 'branch', [],
4336 ('b', 'branch', [],
4316 _('a specific branch you would like to push'), _('BRANCH')),
4337 _('a specific branch you would like to push'), _('BRANCH')),
4317 ('', 'new-branch', False, _('allow pushing a new branch')),
4338 ('', 'new-branch', False, _('allow pushing a new branch')),
4318 ] + remoteopts,
4339 ] + remoteopts,
4319 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
4340 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
4320 "recover": (recover, []),
4341 "recover": (recover, []),
4321 "^remove|rm":
4342 "^remove|rm":
4322 (remove,
4343 (remove,
4323 [('A', 'after', None, _('record delete for missing files')),
4344 [('A', 'after', None, _('record delete for missing files')),
4324 ('f', 'force', None,
4345 ('f', 'force', None,
4325 _('remove (and delete) file even if added or modified')),
4346 _('remove (and delete) file even if added or modified')),
4326 ] + walkopts,
4347 ] + walkopts,
4327 _('[OPTION]... FILE...')),
4348 _('[OPTION]... FILE...')),
4328 "rename|move|mv":
4349 "rename|move|mv":
4329 (rename,
4350 (rename,
4330 [('A', 'after', None, _('record a rename that has already occurred')),
4351 [('A', 'after', None, _('record a rename that has already occurred')),
4331 ('f', 'force', None,
4352 ('f', 'force', None,
4332 _('forcibly copy over an existing managed file')),
4353 _('forcibly copy over an existing managed file')),
4333 ] + walkopts + dryrunopts,
4354 ] + walkopts + dryrunopts,
4334 _('[OPTION]... SOURCE... DEST')),
4355 _('[OPTION]... SOURCE... DEST')),
4335 "resolve":
4356 "resolve":
4336 (resolve,
4357 (resolve,
4337 [('a', 'all', None, _('select all unresolved files')),
4358 [('a', 'all', None, _('select all unresolved files')),
4338 ('l', 'list', None, _('list state of files needing merge')),
4359 ('l', 'list', None, _('list state of files needing merge')),
4339 ('m', 'mark', None, _('mark files as resolved')),
4360 ('m', 'mark', None, _('mark files as resolved')),
4340 ('u', 'unmark', None, _('mark files as unresolved')),
4361 ('u', 'unmark', None, _('mark files as unresolved')),
4362 ('t', 'tool', '', _('specify merge tool')),
4341 ('n', 'no-status', None, _('hide status prefix'))]
4363 ('n', 'no-status', None, _('hide status prefix'))]
4342 + walkopts,
4364 + walkopts,
4343 _('[OPTION]... [FILE]...')),
4365 _('[OPTION]... [FILE]...')),
4344 "revert":
4366 "revert":
4345 (revert,
4367 (revert,
4346 [('a', 'all', None, _('revert all changes when no arguments given')),
4368 [('a', 'all', None, _('revert all changes when no arguments given')),
4347 ('d', 'date', '',
4369 ('d', 'date', '',
4348 _('tipmost revision matching date'), _('DATE')),
4370 _('tipmost revision matching date'), _('DATE')),
4349 ('r', 'rev', '',
4371 ('r', 'rev', '',
4350 _('revert to the specified revision'), _('REV')),
4372 _('revert to the specified revision'), _('REV')),
4351 ('', 'no-backup', None, _('do not save backup copies of files')),
4373 ('', 'no-backup', None, _('do not save backup copies of files')),
4352 ] + walkopts + dryrunopts,
4374 ] + walkopts + dryrunopts,
4353 _('[OPTION]... [-r REV] [NAME]...')),
4375 _('[OPTION]... [-r REV] [NAME]...')),
4354 "rollback": (rollback, dryrunopts),
4376 "rollback": (rollback, dryrunopts),
4355 "root": (root, []),
4377 "root": (root, []),
4356 "^serve":
4378 "^serve":
4357 (serve,
4379 (serve,
4358 [('A', 'accesslog', '',
4380 [('A', 'accesslog', '',
4359 _('name of access log file to write to'), _('FILE')),
4381 _('name of access log file to write to'), _('FILE')),
4360 ('d', 'daemon', None, _('run server in background')),
4382 ('d', 'daemon', None, _('run server in background')),
4361 ('', 'daemon-pipefds', '',
4383 ('', 'daemon-pipefds', '',
4362 _('used internally by daemon mode'), _('NUM')),
4384 _('used internally by daemon mode'), _('NUM')),
4363 ('E', 'errorlog', '',
4385 ('E', 'errorlog', '',
4364 _('name of error log file to write to'), _('FILE')),
4386 _('name of error log file to write to'), _('FILE')),
4365 # use string type, then we can check if something was passed
4387 # use string type, then we can check if something was passed
4366 ('p', 'port', '',
4388 ('p', 'port', '',
4367 _('port to listen on (default: 8000)'), _('PORT')),
4389 _('port to listen on (default: 8000)'), _('PORT')),
4368 ('a', 'address', '',
4390 ('a', 'address', '',
4369 _('address to listen on (default: all interfaces)'), _('ADDR')),
4391 _('address to listen on (default: all interfaces)'), _('ADDR')),
4370 ('', 'prefix', '',
4392 ('', 'prefix', '',
4371 _('prefix path to serve from (default: server root)'), _('PREFIX')),
4393 _('prefix path to serve from (default: server root)'), _('PREFIX')),
4372 ('n', 'name', '',
4394 ('n', 'name', '',
4373 _('name to show in web pages (default: working directory)'),
4395 _('name to show in web pages (default: working directory)'),
4374 _('NAME')),
4396 _('NAME')),
4375 ('', 'web-conf', '',
4397 ('', 'web-conf', '',
4376 _('name of the hgweb config file (see "hg help hgweb")'),
4398 _('name of the hgweb config file (see "hg help hgweb")'),
4377 _('FILE')),
4399 _('FILE')),
4378 ('', 'webdir-conf', '',
4400 ('', 'webdir-conf', '',
4379 _('name of the hgweb config file (DEPRECATED)'), _('FILE')),
4401 _('name of the hgweb config file (DEPRECATED)'), _('FILE')),
4380 ('', 'pid-file', '',
4402 ('', 'pid-file', '',
4381 _('name of file to write process ID to'), _('FILE')),
4403 _('name of file to write process ID to'), _('FILE')),
4382 ('', 'stdio', None, _('for remote clients')),
4404 ('', 'stdio', None, _('for remote clients')),
4383 ('t', 'templates', '',
4405 ('t', 'templates', '',
4384 _('web templates to use'), _('TEMPLATE')),
4406 _('web templates to use'), _('TEMPLATE')),
4385 ('', 'style', '',
4407 ('', 'style', '',
4386 _('template style to use'), _('STYLE')),
4408 _('template style to use'), _('STYLE')),
4387 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
4409 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
4388 ('', 'certificate', '',
4410 ('', 'certificate', '',
4389 _('SSL certificate file'), _('FILE'))],
4411 _('SSL certificate file'), _('FILE'))],
4390 _('[OPTION]...')),
4412 _('[OPTION]...')),
4391 "showconfig|debugconfig":
4413 "showconfig|debugconfig":
4392 (showconfig,
4414 (showconfig,
4393 [('u', 'untrusted', None, _('show untrusted configuration options'))],
4415 [('u', 'untrusted', None, _('show untrusted configuration options'))],
4394 _('[-u] [NAME]...')),
4416 _('[-u] [NAME]...')),
4395 "^summary|sum":
4417 "^summary|sum":
4396 (summary,
4418 (summary,
4397 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
4419 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
4398 "^status|st":
4420 "^status|st":
4399 (status,
4421 (status,
4400 [('A', 'all', None, _('show status of all files')),
4422 [('A', 'all', None, _('show status of all files')),
4401 ('m', 'modified', None, _('show only modified files')),
4423 ('m', 'modified', None, _('show only modified files')),
4402 ('a', 'added', None, _('show only added files')),
4424 ('a', 'added', None, _('show only added files')),
4403 ('r', 'removed', None, _('show only removed files')),
4425 ('r', 'removed', None, _('show only removed files')),
4404 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
4426 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
4405 ('c', 'clean', None, _('show only files without changes')),
4427 ('c', 'clean', None, _('show only files without changes')),
4406 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
4428 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
4407 ('i', 'ignored', None, _('show only ignored files')),
4429 ('i', 'ignored', None, _('show only ignored files')),
4408 ('n', 'no-status', None, _('hide status prefix')),
4430 ('n', 'no-status', None, _('hide status prefix')),
4409 ('C', 'copies', None, _('show source of copied files')),
4431 ('C', 'copies', None, _('show source of copied files')),
4410 ('0', 'print0', None,
4432 ('0', 'print0', None,
4411 _('end filenames with NUL, for use with xargs')),
4433 _('end filenames with NUL, for use with xargs')),
4412 ('', 'rev', [],
4434 ('', 'rev', [],
4413 _('show difference from revision'), _('REV')),
4435 _('show difference from revision'), _('REV')),
4414 ('', 'change', '',
4436 ('', 'change', '',
4415 _('list the changed files of a revision'), _('REV')),
4437 _('list the changed files of a revision'), _('REV')),
4416 ] + walkopts + subrepoopts,
4438 ] + walkopts + subrepoopts,
4417 _('[OPTION]... [FILE]...')),
4439 _('[OPTION]... [FILE]...')),
4418 "tag":
4440 "tag":
4419 (tag,
4441 (tag,
4420 [('f', 'force', None, _('replace existing tag')),
4442 [('f', 'force', None, _('replace existing tag')),
4421 ('l', 'local', None, _('make the tag local')),
4443 ('l', 'local', None, _('make the tag local')),
4422 ('r', 'rev', '',
4444 ('r', 'rev', '',
4423 _('revision to tag'), _('REV')),
4445 _('revision to tag'), _('REV')),
4424 ('', 'remove', None, _('remove a tag')),
4446 ('', 'remove', None, _('remove a tag')),
4425 # -l/--local is already there, commitopts cannot be used
4447 # -l/--local is already there, commitopts cannot be used
4426 ('e', 'edit', None, _('edit commit message')),
4448 ('e', 'edit', None, _('edit commit message')),
4427 ('m', 'message', '',
4449 ('m', 'message', '',
4428 _('use <text> as commit message'), _('TEXT')),
4450 _('use <text> as commit message'), _('TEXT')),
4429 ] + commitopts2,
4451 ] + commitopts2,
4430 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
4452 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
4431 "tags": (tags, [], ''),
4453 "tags": (tags, [], ''),
4432 "tip":
4454 "tip":
4433 (tip,
4455 (tip,
4434 [('p', 'patch', None, _('show patch')),
4456 [('p', 'patch', None, _('show patch')),
4435 ('g', 'git', None, _('use git extended diff format')),
4457 ('g', 'git', None, _('use git extended diff format')),
4436 ] + templateopts,
4458 ] + templateopts,
4437 _('[-p] [-g]')),
4459 _('[-p] [-g]')),
4438 "unbundle":
4460 "unbundle":
4439 (unbundle,
4461 (unbundle,
4440 [('u', 'update', None,
4462 [('u', 'update', None,
4441 _('update to new branch head if changesets were unbundled'))],
4463 _('update to new branch head if changesets were unbundled'))],
4442 _('[-u] FILE...')),
4464 _('[-u] FILE...')),
4443 "^update|up|checkout|co":
4465 "^update|up|checkout|co":
4444 (update,
4466 (update,
4445 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
4467 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
4446 ('c', 'check', None,
4468 ('c', 'check', None,
4447 _('update across branches if no uncommitted changes')),
4469 _('update across branches if no uncommitted changes')),
4448 ('d', 'date', '',
4470 ('d', 'date', '',
4449 _('tipmost revision matching date'), _('DATE')),
4471 _('tipmost revision matching date'), _('DATE')),
4450 ('r', 'rev', '',
4472 ('r', 'rev', '',
4451 _('revision'), _('REV'))],
4473 _('revision'), _('REV'))],
4452 _('[-c] [-C] [-d DATE] [[-r] REV]')),
4474 _('[-c] [-C] [-d DATE] [[-r] REV]')),
4453 "verify": (verify, []),
4475 "verify": (verify, []),
4454 "version": (version_, []),
4476 "version": (version_, []),
4455 }
4477 }
4456
4478
4457 norepo = ("clone init version help debugcommands debugcomplete"
4479 norepo = ("clone init version help debugcommands debugcomplete"
4458 " debugdate debuginstall debugfsinfo debugpushkey")
4480 " debugdate debuginstall debugfsinfo debugpushkey")
4459 optionalrepo = ("identify paths serve showconfig debugancestor debugdag"
4481 optionalrepo = ("identify paths serve showconfig debugancestor debugdag"
4460 " debugdata debugindex debugindexdot")
4482 " debugdata debugindex debugindexdot")
@@ -1,249 +1,249 b''
1 Show all commands except debug commands
1 Show all commands except debug commands
2 $ hg debugcomplete
2 $ hg debugcomplete
3 add
3 add
4 addremove
4 addremove
5 annotate
5 annotate
6 archive
6 archive
7 backout
7 backout
8 bisect
8 bisect
9 branch
9 branch
10 branches
10 branches
11 bundle
11 bundle
12 cat
12 cat
13 clone
13 clone
14 commit
14 commit
15 copy
15 copy
16 diff
16 diff
17 export
17 export
18 forget
18 forget
19 grep
19 grep
20 heads
20 heads
21 help
21 help
22 identify
22 identify
23 import
23 import
24 incoming
24 incoming
25 init
25 init
26 locate
26 locate
27 log
27 log
28 manifest
28 manifest
29 merge
29 merge
30 outgoing
30 outgoing
31 parents
31 parents
32 paths
32 paths
33 pull
33 pull
34 push
34 push
35 recover
35 recover
36 remove
36 remove
37 rename
37 rename
38 resolve
38 resolve
39 revert
39 revert
40 rollback
40 rollback
41 root
41 root
42 serve
42 serve
43 showconfig
43 showconfig
44 status
44 status
45 summary
45 summary
46 tag
46 tag
47 tags
47 tags
48 tip
48 tip
49 unbundle
49 unbundle
50 update
50 update
51 verify
51 verify
52 version
52 version
53
53
54 Show all commands that start with "a"
54 Show all commands that start with "a"
55 $ hg debugcomplete a
55 $ hg debugcomplete a
56 add
56 add
57 addremove
57 addremove
58 annotate
58 annotate
59 archive
59 archive
60
60
61 Do not show debug commands if there are other candidates
61 Do not show debug commands if there are other candidates
62 $ hg debugcomplete d
62 $ hg debugcomplete d
63 diff
63 diff
64
64
65 Show debug commands if there are no other candidates
65 Show debug commands if there are no other candidates
66 $ hg debugcomplete debug
66 $ hg debugcomplete debug
67 debugancestor
67 debugancestor
68 debugbuilddag
68 debugbuilddag
69 debugcheckstate
69 debugcheckstate
70 debugcommands
70 debugcommands
71 debugcomplete
71 debugcomplete
72 debugconfig
72 debugconfig
73 debugdag
73 debugdag
74 debugdata
74 debugdata
75 debugdate
75 debugdate
76 debugfsinfo
76 debugfsinfo
77 debugindex
77 debugindex
78 debugindexdot
78 debugindexdot
79 debuginstall
79 debuginstall
80 debugpushkey
80 debugpushkey
81 debugrebuildstate
81 debugrebuildstate
82 debugrename
82 debugrename
83 debugrevspec
83 debugrevspec
84 debugsetparents
84 debugsetparents
85 debugstate
85 debugstate
86 debugsub
86 debugsub
87 debugwalk
87 debugwalk
88
88
89 Do not show the alias of a debug command if there are other candidates
89 Do not show the alias of a debug command if there are other candidates
90 (this should hide rawcommit)
90 (this should hide rawcommit)
91 $ hg debugcomplete r
91 $ hg debugcomplete r
92 recover
92 recover
93 remove
93 remove
94 rename
94 rename
95 resolve
95 resolve
96 revert
96 revert
97 rollback
97 rollback
98 root
98 root
99 Show the alias of a debug command if there are no other candidates
99 Show the alias of a debug command if there are no other candidates
100 $ hg debugcomplete rawc
100 $ hg debugcomplete rawc
101
101
102
102
103 Show the global options
103 Show the global options
104 $ hg debugcomplete --options | sort
104 $ hg debugcomplete --options | sort
105 --config
105 --config
106 --cwd
106 --cwd
107 --debug
107 --debug
108 --debugger
108 --debugger
109 --encoding
109 --encoding
110 --encodingmode
110 --encodingmode
111 --help
111 --help
112 --noninteractive
112 --noninteractive
113 --profile
113 --profile
114 --quiet
114 --quiet
115 --repository
115 --repository
116 --time
116 --time
117 --traceback
117 --traceback
118 --verbose
118 --verbose
119 --version
119 --version
120 -R
120 -R
121 -h
121 -h
122 -q
122 -q
123 -v
123 -v
124 -y
124 -y
125
125
126 Show the options for the "serve" command
126 Show the options for the "serve" command
127 $ hg debugcomplete --options serve | sort
127 $ hg debugcomplete --options serve | sort
128 --accesslog
128 --accesslog
129 --address
129 --address
130 --certificate
130 --certificate
131 --config
131 --config
132 --cwd
132 --cwd
133 --daemon
133 --daemon
134 --daemon-pipefds
134 --daemon-pipefds
135 --debug
135 --debug
136 --debugger
136 --debugger
137 --encoding
137 --encoding
138 --encodingmode
138 --encodingmode
139 --errorlog
139 --errorlog
140 --help
140 --help
141 --ipv6
141 --ipv6
142 --name
142 --name
143 --noninteractive
143 --noninteractive
144 --pid-file
144 --pid-file
145 --port
145 --port
146 --prefix
146 --prefix
147 --profile
147 --profile
148 --quiet
148 --quiet
149 --repository
149 --repository
150 --stdio
150 --stdio
151 --style
151 --style
152 --templates
152 --templates
153 --time
153 --time
154 --traceback
154 --traceback
155 --verbose
155 --verbose
156 --version
156 --version
157 --web-conf
157 --web-conf
158 -6
158 -6
159 -A
159 -A
160 -E
160 -E
161 -R
161 -R
162 -a
162 -a
163 -d
163 -d
164 -h
164 -h
165 -n
165 -n
166 -p
166 -p
167 -q
167 -q
168 -t
168 -t
169 -v
169 -v
170 -y
170 -y
171
171
172 Show an error if we use --options with an ambiguous abbreviation
172 Show an error if we use --options with an ambiguous abbreviation
173 $ hg debugcomplete --options s
173 $ hg debugcomplete --options s
174 hg: command 's' is ambiguous:
174 hg: command 's' is ambiguous:
175 serve showconfig status summary
175 serve showconfig status summary
176 [255]
176 [255]
177
177
178 Show all commands + options
178 Show all commands + options
179 $ hg debugcommands
179 $ hg debugcommands
180 add: include, exclude, subrepos, dry-run
180 add: include, exclude, subrepos, dry-run
181 annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, include, exclude
181 annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, include, exclude
182 clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd
182 clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd
183 commit: addremove, close-branch, include, exclude, message, logfile, date, user
183 commit: addremove, close-branch, include, exclude, message, logfile, date, user
184 diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
184 diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
185 export: output, switch-parent, rev, text, git, nodates
185 export: output, switch-parent, rev, text, git, nodates
186 forget: include, exclude
186 forget: include, exclude
187 init: ssh, remotecmd
187 init: ssh, remotecmd
188 log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, style, template, include, exclude
188 log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, style, template, include, exclude
189 merge: force, rev, preview
189 merge: force, tool, rev, preview
190 pull: update, force, rev, branch, ssh, remotecmd
190 pull: update, force, rev, branch, ssh, remotecmd
191 push: force, rev, branch, new-branch, ssh, remotecmd
191 push: force, rev, branch, new-branch, ssh, remotecmd
192 remove: after, force, include, exclude
192 remove: after, force, include, exclude
193 serve: accesslog, daemon, daemon-pipefds, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, templates, style, ipv6, certificate
193 serve: accesslog, daemon, daemon-pipefds, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, templates, style, ipv6, certificate
194 status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos
194 status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos
195 summary: remote
195 summary: remote
196 update: clean, check, date, rev
196 update: clean, check, date, rev
197 addremove: similarity, include, exclude, dry-run
197 addremove: similarity, include, exclude, dry-run
198 archive: no-decode, prefix, rev, type, subrepos, include, exclude
198 archive: no-decode, prefix, rev, type, subrepos, include, exclude
199 backout: merge, parent, rev, include, exclude, message, logfile, date, user
199 backout: merge, parent, rev, include, exclude, message, logfile, date, user
200 bisect: reset, good, bad, skip, command, noupdate
200 bisect: reset, good, bad, skip, command, noupdate
201 branch: force, clean
201 branch: force, clean
202 branches: active, closed
202 branches: active, closed
203 bundle: force, rev, branch, base, all, type, ssh, remotecmd
203 bundle: force, rev, branch, base, all, type, ssh, remotecmd
204 cat: output, rev, decode, include, exclude
204 cat: output, rev, decode, include, exclude
205 copy: after, force, include, exclude, dry-run
205 copy: after, force, include, exclude, dry-run
206 debugancestor:
206 debugancestor:
207 debugbuilddag: mergeable-file, appended-file, overwritten-file, new-file
207 debugbuilddag: mergeable-file, appended-file, overwritten-file, new-file
208 debugcheckstate:
208 debugcheckstate:
209 debugcommands:
209 debugcommands:
210 debugcomplete: options
210 debugcomplete: options
211 debugdag: tags, branches, dots, spaces
211 debugdag: tags, branches, dots, spaces
212 debugdata:
212 debugdata:
213 debugdate: extended
213 debugdate: extended
214 debugfsinfo:
214 debugfsinfo:
215 debugindex:
215 debugindex:
216 debugindexdot:
216 debugindexdot:
217 debuginstall:
217 debuginstall:
218 debugpushkey:
218 debugpushkey:
219 debugrebuildstate: rev
219 debugrebuildstate: rev
220 debugrename: rev
220 debugrename: rev
221 debugrevspec:
221 debugrevspec:
222 debugsetparents:
222 debugsetparents:
223 debugstate: nodates
223 debugstate: nodates
224 debugsub: rev
224 debugsub: rev
225 debugwalk: include, exclude
225 debugwalk: include, exclude
226 grep: print0, all, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude
226 grep: print0, all, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude
227 heads: rev, topo, active, closed, style, template
227 heads: rev, topo, active, closed, style, template
228 help:
228 help:
229 identify: rev, num, id, branch, tags
229 identify: rev, num, id, branch, tags
230 import: strip, base, force, no-commit, exact, import-branch, message, logfile, date, user, similarity
230 import: strip, base, force, no-commit, exact, import-branch, message, logfile, date, user, similarity
231 incoming: force, newest-first, bundle, rev, branch, patch, git, limit, no-merges, stat, style, template, ssh, remotecmd, subrepos
231 incoming: force, newest-first, bundle, rev, branch, patch, git, limit, no-merges, stat, style, template, ssh, remotecmd, subrepos
232 locate: rev, print0, fullpath, include, exclude
232 locate: rev, print0, fullpath, include, exclude
233 manifest: rev
233 manifest: rev
234 outgoing: force, rev, newest-first, branch, patch, git, limit, no-merges, stat, style, template, ssh, remotecmd, subrepos
234 outgoing: force, rev, newest-first, branch, patch, git, limit, no-merges, stat, style, template, ssh, remotecmd, subrepos
235 parents: rev, style, template
235 parents: rev, style, template
236 paths:
236 paths:
237 recover:
237 recover:
238 rename: after, force, include, exclude, dry-run
238 rename: after, force, include, exclude, dry-run
239 resolve: all, list, mark, unmark, no-status, include, exclude
239 resolve: all, list, mark, unmark, tool, no-status, include, exclude
240 revert: all, date, rev, no-backup, include, exclude, dry-run
240 revert: all, date, rev, no-backup, include, exclude, dry-run
241 rollback: dry-run
241 rollback: dry-run
242 root:
242 root:
243 showconfig: untrusted
243 showconfig: untrusted
244 tag: force, local, rev, remove, edit, message, date, user
244 tag: force, local, rev, remove, edit, message, date, user
245 tags:
245 tags:
246 tip: patch, git, style, template
246 tip: patch, git, style, template
247 unbundle: update
247 unbundle: update
248 verify:
248 verify:
249 version:
249 version:
General Comments 0
You need to be logged in to leave comments. Login now