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