##// END OF EJS Templates
commands: mention diff -c
timeless -
r10520:75361931 stable
parent child Browse files
Show More
@@ -1,3829 +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
1118 as a baseline.
1119
1117 Without the -a/--text option, diff will avoid generating diffs of
1120 Without the -a/--text option, diff will avoid generating diffs of
1118 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
1119 anyway, probably with undesirable results.
1122 anyway, probably with undesirable results.
1120
1123
1121 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
1122 format. For more information, read 'hg help diffs'.
1125 format. For more information, read 'hg help diffs'.
1123 """
1126 """
1124
1127
1125 revs = opts.get('rev')
1128 revs = opts.get('rev')
1126 change = opts.get('change')
1129 change = opts.get('change')
1127 stat = opts.get('stat')
1130 stat = opts.get('stat')
1128 reverse = opts.get('reverse')
1131 reverse = opts.get('reverse')
1129
1132
1130 if revs and change:
1133 if revs and change:
1131 msg = _('cannot specify --rev and --change at the same time')
1134 msg = _('cannot specify --rev and --change at the same time')
1132 raise util.Abort(msg)
1135 raise util.Abort(msg)
1133 elif change:
1136 elif change:
1134 node2 = repo.lookup(change)
1137 node2 = repo.lookup(change)
1135 node1 = repo[node2].parents()[0].node()
1138 node1 = repo[node2].parents()[0].node()
1136 else:
1139 else:
1137 node1, node2 = cmdutil.revpair(repo, revs)
1140 node1, node2 = cmdutil.revpair(repo, revs)
1138
1141
1139 if reverse:
1142 if reverse:
1140 node1, node2 = node2, node1
1143 node1, node2 = node2, node1
1141
1144
1142 if stat:
1145 if stat:
1143 opts['unified'] = '0'
1146 opts['unified'] = '0'
1144 diffopts = patch.diffopts(ui, opts)
1147 diffopts = patch.diffopts(ui, opts)
1145
1148
1146 m = cmdutil.match(repo, pats, opts)
1149 m = cmdutil.match(repo, pats, opts)
1147 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1150 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1148 if stat:
1151 if stat:
1149 width = ui.interactive() and util.termwidth() or 80
1152 width = ui.interactive() and util.termwidth() or 80
1150 ui.write(patch.diffstat(util.iterlines(it), width=width,
1153 ui.write(patch.diffstat(util.iterlines(it), width=width,
1151 git=diffopts.git))
1154 git=diffopts.git))
1152 else:
1155 else:
1153 for chunk in it:
1156 for chunk in it:
1154 ui.write(chunk)
1157 ui.write(chunk)
1155
1158
1156 def export(ui, repo, *changesets, **opts):
1159 def export(ui, repo, *changesets, **opts):
1157 """dump the header and diffs for one or more changesets
1160 """dump the header and diffs for one or more changesets
1158
1161
1159 Print the changeset header and diffs for one or more revisions.
1162 Print the changeset header and diffs for one or more revisions.
1160
1163
1161 The information shown in the changeset header is: author, date,
1164 The information shown in the changeset header is: author, date,
1162 branch name (if non-default), changeset hash, parent(s) and commit
1165 branch name (if non-default), changeset hash, parent(s) and commit
1163 comment.
1166 comment.
1164
1167
1165 NOTE: export may generate unexpected diff output for merge
1168 NOTE: export may generate unexpected diff output for merge
1166 changesets, as it will compare the merge changeset against its
1169 changesets, as it will compare the merge changeset against its
1167 first parent only.
1170 first parent only.
1168
1171
1169 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
1170 given using a format string. The formatting rules are as follows:
1173 given using a format string. The formatting rules are as follows:
1171
1174
1172 :``%%``: literal "%" character
1175 :``%%``: literal "%" character
1173 :``%H``: changeset hash (40 bytes of hexadecimal)
1176 :``%H``: changeset hash (40 bytes of hexadecimal)
1174 :``%N``: number of patches being generated
1177 :``%N``: number of patches being generated
1175 :``%R``: changeset revision number
1178 :``%R``: changeset revision number
1176 :``%b``: basename of the exporting repository
1179 :``%b``: basename of the exporting repository
1177 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1180 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1178 :``%n``: zero-padded sequence number, starting at 1
1181 :``%n``: zero-padded sequence number, starting at 1
1179 :``%r``: zero-padded changeset revision number
1182 :``%r``: zero-padded changeset revision number
1180
1183
1181 Without the -a/--text option, export will avoid generating diffs
1184 Without the -a/--text option, export will avoid generating diffs
1182 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
1183 diff anyway, probably with undesirable results.
1186 diff anyway, probably with undesirable results.
1184
1187
1185 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
1186 format. See 'hg help diffs' for more information.
1189 format. See 'hg help diffs' for more information.
1187
1190
1188 With the --switch-parent option, the diff will be against the
1191 With the --switch-parent option, the diff will be against the
1189 second parent. It can be useful to review a merge.
1192 second parent. It can be useful to review a merge.
1190 """
1193 """
1191 changesets += tuple(opts.get('rev', []))
1194 changesets += tuple(opts.get('rev', []))
1192 if not changesets:
1195 if not changesets:
1193 raise util.Abort(_("export requires at least one changeset"))
1196 raise util.Abort(_("export requires at least one changeset"))
1194 revs = cmdutil.revrange(repo, changesets)
1197 revs = cmdutil.revrange(repo, changesets)
1195 if len(revs) > 1:
1198 if len(revs) > 1:
1196 ui.note(_('exporting patches:\n'))
1199 ui.note(_('exporting patches:\n'))
1197 else:
1200 else:
1198 ui.note(_('exporting patch:\n'))
1201 ui.note(_('exporting patch:\n'))
1199 patch.export(repo, revs, template=opts.get('output'),
1202 patch.export(repo, revs, template=opts.get('output'),
1200 switch_parent=opts.get('switch_parent'),
1203 switch_parent=opts.get('switch_parent'),
1201 opts=patch.diffopts(ui, opts))
1204 opts=patch.diffopts(ui, opts))
1202
1205
1203 def forget(ui, repo, *pats, **opts):
1206 def forget(ui, repo, *pats, **opts):
1204 """forget the specified files on the next commit
1207 """forget the specified files on the next commit
1205
1208
1206 Mark the specified files so they will no longer be tracked
1209 Mark the specified files so they will no longer be tracked
1207 after the next commit.
1210 after the next commit.
1208
1211
1209 This only removes files from the current branch, not from the
1212 This only removes files from the current branch, not from the
1210 entire project history, and it does not delete them from the
1213 entire project history, and it does not delete them from the
1211 working directory.
1214 working directory.
1212
1215
1213 To undo a forget before the next commit, see hg add.
1216 To undo a forget before the next commit, see hg add.
1214 """
1217 """
1215
1218
1216 if not pats:
1219 if not pats:
1217 raise util.Abort(_('no files specified'))
1220 raise util.Abort(_('no files specified'))
1218
1221
1219 m = cmdutil.match(repo, pats, opts)
1222 m = cmdutil.match(repo, pats, opts)
1220 s = repo.status(match=m, clean=True)
1223 s = repo.status(match=m, clean=True)
1221 forget = sorted(s[0] + s[1] + s[3] + s[6])
1224 forget = sorted(s[0] + s[1] + s[3] + s[6])
1222
1225
1223 for f in m.files():
1226 for f in m.files():
1224 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)):
1225 ui.warn(_('not removing %s: file is already untracked\n')
1228 ui.warn(_('not removing %s: file is already untracked\n')
1226 % m.rel(f))
1229 % m.rel(f))
1227
1230
1228 for f in forget:
1231 for f in forget:
1229 if ui.verbose or not m.exact(f):
1232 if ui.verbose or not m.exact(f):
1230 ui.status(_('removing %s\n') % m.rel(f))
1233 ui.status(_('removing %s\n') % m.rel(f))
1231
1234
1232 repo.remove(forget, unlink=False)
1235 repo.remove(forget, unlink=False)
1233
1236
1234 def grep(ui, repo, pattern, *pats, **opts):
1237 def grep(ui, repo, pattern, *pats, **opts):
1235 """search for a pattern in specified files and revisions
1238 """search for a pattern in specified files and revisions
1236
1239
1237 Search revisions of files for a regular expression.
1240 Search revisions of files for a regular expression.
1238
1241
1239 This command behaves differently than Unix grep. It only accepts
1242 This command behaves differently than Unix grep. It only accepts
1240 Python/Perl regexps. It searches repository history, not the
1243 Python/Perl regexps. It searches repository history, not the
1241 working directory. It always prints the revision number in which a
1244 working directory. It always prints the revision number in which a
1242 match appears.
1245 match appears.
1243
1246
1244 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
1245 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
1246 that contains a change in match status ("-" for a match that
1249 that contains a change in match status ("-" for a match that
1247 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),
1248 use the --all flag.
1251 use the --all flag.
1249 """
1252 """
1250 reflags = 0
1253 reflags = 0
1251 if opts.get('ignore_case'):
1254 if opts.get('ignore_case'):
1252 reflags |= re.I
1255 reflags |= re.I
1253 try:
1256 try:
1254 regexp = re.compile(pattern, reflags)
1257 regexp = re.compile(pattern, reflags)
1255 except Exception, inst:
1258 except Exception, inst:
1256 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1259 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1257 return None
1260 return None
1258 sep, eol = ':', '\n'
1261 sep, eol = ':', '\n'
1259 if opts.get('print0'):
1262 if opts.get('print0'):
1260 sep = eol = '\0'
1263 sep = eol = '\0'
1261
1264
1262 getfile = util.lrucachefunc(repo.file)
1265 getfile = util.lrucachefunc(repo.file)
1263
1266
1264 def matchlines(body):
1267 def matchlines(body):
1265 begin = 0
1268 begin = 0
1266 linenum = 0
1269 linenum = 0
1267 while True:
1270 while True:
1268 match = regexp.search(body, begin)
1271 match = regexp.search(body, begin)
1269 if not match:
1272 if not match:
1270 break
1273 break
1271 mstart, mend = match.span()
1274 mstart, mend = match.span()
1272 linenum += body.count('\n', begin, mstart) + 1
1275 linenum += body.count('\n', begin, mstart) + 1
1273 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1276 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1274 begin = body.find('\n', mend) + 1 or len(body)
1277 begin = body.find('\n', mend) + 1 or len(body)
1275 lend = begin - 1
1278 lend = begin - 1
1276 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1279 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1277
1280
1278 class linestate(object):
1281 class linestate(object):
1279 def __init__(self, line, linenum, colstart, colend):
1282 def __init__(self, line, linenum, colstart, colend):
1280 self.line = line
1283 self.line = line
1281 self.linenum = linenum
1284 self.linenum = linenum
1282 self.colstart = colstart
1285 self.colstart = colstart
1283 self.colend = colend
1286 self.colend = colend
1284
1287
1285 def __hash__(self):
1288 def __hash__(self):
1286 return hash((self.linenum, self.line))
1289 return hash((self.linenum, self.line))
1287
1290
1288 def __eq__(self, other):
1291 def __eq__(self, other):
1289 return self.line == other.line
1292 return self.line == other.line
1290
1293
1291 matches = {}
1294 matches = {}
1292 copies = {}
1295 copies = {}
1293 def grepbody(fn, rev, body):
1296 def grepbody(fn, rev, body):
1294 matches[rev].setdefault(fn, [])
1297 matches[rev].setdefault(fn, [])
1295 m = matches[rev][fn]
1298 m = matches[rev][fn]
1296 for lnum, cstart, cend, line in matchlines(body):
1299 for lnum, cstart, cend, line in matchlines(body):
1297 s = linestate(line, lnum, cstart, cend)
1300 s = linestate(line, lnum, cstart, cend)
1298 m.append(s)
1301 m.append(s)
1299
1302
1300 def difflinestates(a, b):
1303 def difflinestates(a, b):
1301 sm = difflib.SequenceMatcher(None, a, b)
1304 sm = difflib.SequenceMatcher(None, a, b)
1302 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1305 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1303 if tag == 'insert':
1306 if tag == 'insert':
1304 for i in xrange(blo, bhi):
1307 for i in xrange(blo, bhi):
1305 yield ('+', b[i])
1308 yield ('+', b[i])
1306 elif tag == 'delete':
1309 elif tag == 'delete':
1307 for i in xrange(alo, ahi):
1310 for i in xrange(alo, ahi):
1308 yield ('-', a[i])
1311 yield ('-', a[i])
1309 elif tag == 'replace':
1312 elif tag == 'replace':
1310 for i in xrange(alo, ahi):
1313 for i in xrange(alo, ahi):
1311 yield ('-', a[i])
1314 yield ('-', a[i])
1312 for i in xrange(blo, bhi):
1315 for i in xrange(blo, bhi):
1313 yield ('+', b[i])
1316 yield ('+', b[i])
1314
1317
1315 def display(fn, ctx, pstates, states):
1318 def display(fn, ctx, pstates, states):
1316 rev = ctx.rev()
1319 rev = ctx.rev()
1317 datefunc = ui.quiet and util.shortdate or util.datestr
1320 datefunc = ui.quiet and util.shortdate or util.datestr
1318 found = False
1321 found = False
1319 filerevmatches = {}
1322 filerevmatches = {}
1320 if opts.get('all'):
1323 if opts.get('all'):
1321 iter = difflinestates(pstates, states)
1324 iter = difflinestates(pstates, states)
1322 else:
1325 else:
1323 iter = [('', l) for l in states]
1326 iter = [('', l) for l in states]
1324 for change, l in iter:
1327 for change, l in iter:
1325 cols = [fn, str(rev)]
1328 cols = [fn, str(rev)]
1326 if opts.get('line_number'):
1329 if opts.get('line_number'):
1327 cols.append(str(l.linenum))
1330 cols.append(str(l.linenum))
1328 if opts.get('all'):
1331 if opts.get('all'):
1329 cols.append(change)
1332 cols.append(change)
1330 if opts.get('user'):
1333 if opts.get('user'):
1331 cols.append(ui.shortuser(ctx.user()))
1334 cols.append(ui.shortuser(ctx.user()))
1332 if opts.get('date'):
1335 if opts.get('date'):
1333 cols.append(datefunc(ctx.date()))
1336 cols.append(datefunc(ctx.date()))
1334 if opts.get('files_with_matches'):
1337 if opts.get('files_with_matches'):
1335 c = (fn, rev)
1338 c = (fn, rev)
1336 if c in filerevmatches:
1339 if c in filerevmatches:
1337 continue
1340 continue
1338 filerevmatches[c] = 1
1341 filerevmatches[c] = 1
1339 else:
1342 else:
1340 cols.append(l.line)
1343 cols.append(l.line)
1341 ui.write(sep.join(cols), eol)
1344 ui.write(sep.join(cols), eol)
1342 found = True
1345 found = True
1343 return found
1346 return found
1344
1347
1345 skip = {}
1348 skip = {}
1346 revfiles = {}
1349 revfiles = {}
1347 matchfn = cmdutil.match(repo, pats, opts)
1350 matchfn = cmdutil.match(repo, pats, opts)
1348 found = False
1351 found = False
1349 follow = opts.get('follow')
1352 follow = opts.get('follow')
1350
1353
1351 def prep(ctx, fns):
1354 def prep(ctx, fns):
1352 rev = ctx.rev()
1355 rev = ctx.rev()
1353 pctx = ctx.parents()[0]
1356 pctx = ctx.parents()[0]
1354 parent = pctx.rev()
1357 parent = pctx.rev()
1355 matches.setdefault(rev, {})
1358 matches.setdefault(rev, {})
1356 matches.setdefault(parent, {})
1359 matches.setdefault(parent, {})
1357 files = revfiles.setdefault(rev, [])
1360 files = revfiles.setdefault(rev, [])
1358 for fn in fns:
1361 for fn in fns:
1359 flog = getfile(fn)
1362 flog = getfile(fn)
1360 try:
1363 try:
1361 fnode = ctx.filenode(fn)
1364 fnode = ctx.filenode(fn)
1362 except error.LookupError:
1365 except error.LookupError:
1363 continue
1366 continue
1364
1367
1365 copied = flog.renamed(fnode)
1368 copied = flog.renamed(fnode)
1366 copy = follow and copied and copied[0]
1369 copy = follow and copied and copied[0]
1367 if copy:
1370 if copy:
1368 copies.setdefault(rev, {})[fn] = copy
1371 copies.setdefault(rev, {})[fn] = copy
1369 if fn in skip:
1372 if fn in skip:
1370 if copy:
1373 if copy:
1371 skip[copy] = True
1374 skip[copy] = True
1372 continue
1375 continue
1373 files.append(fn)
1376 files.append(fn)
1374
1377
1375 if fn not in matches[rev]:
1378 if fn not in matches[rev]:
1376 grepbody(fn, rev, flog.read(fnode))
1379 grepbody(fn, rev, flog.read(fnode))
1377
1380
1378 pfn = copy or fn
1381 pfn = copy or fn
1379 if pfn not in matches[parent]:
1382 if pfn not in matches[parent]:
1380 try:
1383 try:
1381 fnode = pctx.filenode(pfn)
1384 fnode = pctx.filenode(pfn)
1382 grepbody(pfn, parent, flog.read(fnode))
1385 grepbody(pfn, parent, flog.read(fnode))
1383 except error.LookupError:
1386 except error.LookupError:
1384 pass
1387 pass
1385
1388
1386 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1389 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1387 rev = ctx.rev()
1390 rev = ctx.rev()
1388 parent = ctx.parents()[0].rev()
1391 parent = ctx.parents()[0].rev()
1389 for fn in sorted(revfiles.get(rev, [])):
1392 for fn in sorted(revfiles.get(rev, [])):
1390 states = matches[rev][fn]
1393 states = matches[rev][fn]
1391 copy = copies.get(rev, {}).get(fn)
1394 copy = copies.get(rev, {}).get(fn)
1392 if fn in skip:
1395 if fn in skip:
1393 if copy:
1396 if copy:
1394 skip[copy] = True
1397 skip[copy] = True
1395 continue
1398 continue
1396 pstates = matches.get(parent, {}).get(copy or fn, [])
1399 pstates = matches.get(parent, {}).get(copy or fn, [])
1397 if pstates or states:
1400 if pstates or states:
1398 r = display(fn, ctx, pstates, states)
1401 r = display(fn, ctx, pstates, states)
1399 found = found or r
1402 found = found or r
1400 if r and not opts.get('all'):
1403 if r and not opts.get('all'):
1401 skip[fn] = True
1404 skip[fn] = True
1402 if copy:
1405 if copy:
1403 skip[copy] = True
1406 skip[copy] = True
1404 del matches[rev]
1407 del matches[rev]
1405 del revfiles[rev]
1408 del revfiles[rev]
1406
1409
1407 def heads(ui, repo, *branchrevs, **opts):
1410 def heads(ui, repo, *branchrevs, **opts):
1408 """show current repository heads or show branch heads
1411 """show current repository heads or show branch heads
1409
1412
1410 With no arguments, show all repository branch heads.
1413 With no arguments, show all repository branch heads.
1411
1414
1412 Repository "heads" are changesets with no child changesets. They are
1415 Repository "heads" are changesets with no child changesets. They are
1413 where development generally takes place and are the usual targets
1416 where development generally takes place and are the usual targets
1414 for update and merge operations. Branch heads are changesets that have
1417 for update and merge operations. Branch heads are changesets that have
1415 no child changeset on the same branch.
1418 no child changeset on the same branch.
1416
1419
1417 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
1418 associated with the specified changesets are shown.
1421 associated with the specified changesets are shown.
1419
1422
1420 If -c/--closed is specified, also show branch heads marked closed
1423 If -c/--closed is specified, also show branch heads marked closed
1421 (see hg commit --close-branch).
1424 (see hg commit --close-branch).
1422
1425
1423 If STARTREV is specified, only those heads that are descendants of
1426 If STARTREV is specified, only those heads that are descendants of
1424 STARTREV will be displayed.
1427 STARTREV will be displayed.
1425
1428
1426 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
1427 changesets without children will be shown.
1430 changesets without children will be shown.
1428 """
1431 """
1429
1432
1430 if opts.get('rev'):
1433 if opts.get('rev'):
1431 start = repo.lookup(opts['rev'])
1434 start = repo.lookup(opts['rev'])
1432 else:
1435 else:
1433 start = None
1436 start = None
1434
1437
1435 if opts.get('topo'):
1438 if opts.get('topo'):
1436 heads = [repo[h] for h in repo.heads(start)]
1439 heads = [repo[h] for h in repo.heads(start)]
1437 else:
1440 else:
1438 heads = []
1441 heads = []
1439 for b, ls in repo.branchmap().iteritems():
1442 for b, ls in repo.branchmap().iteritems():
1440 if start is None:
1443 if start is None:
1441 heads += [repo[h] for h in ls]
1444 heads += [repo[h] for h in ls]
1442 continue
1445 continue
1443 startrev = repo.changelog.rev(start)
1446 startrev = repo.changelog.rev(start)
1444 descendants = set(repo.changelog.descendants(startrev))
1447 descendants = set(repo.changelog.descendants(startrev))
1445 descendants.add(startrev)
1448 descendants.add(startrev)
1446 rev = repo.changelog.rev
1449 rev = repo.changelog.rev
1447 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]
1448
1451
1449 if branchrevs:
1452 if branchrevs:
1450 decode, encode = encoding.fromlocal, encoding.tolocal
1453 decode, encode = encoding.fromlocal, encoding.tolocal
1451 branches = set(repo[decode(br)].branch() for br in branchrevs)
1454 branches = set(repo[decode(br)].branch() for br in branchrevs)
1452 heads = [h for h in heads if h.branch() in branches]
1455 heads = [h for h in heads if h.branch() in branches]
1453
1456
1454 if not opts.get('closed'):
1457 if not opts.get('closed'):
1455 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')]
1456
1459
1457 if opts.get('active') and branchrevs:
1460 if opts.get('active') and branchrevs:
1458 dagheads = repo.heads(start)
1461 dagheads = repo.heads(start)
1459 heads = [h for h in heads if h.node() in dagheads]
1462 heads = [h for h in heads if h.node() in dagheads]
1460
1463
1461 if branchrevs:
1464 if branchrevs:
1462 haveheads = set(h.branch() for h in heads)
1465 haveheads = set(h.branch() for h in heads)
1463 if branches - haveheads:
1466 if branches - haveheads:
1464 headless = ', '.join(encode(b) for b in branches - haveheads)
1467 headless = ', '.join(encode(b) for b in branches - haveheads)
1465 msg = _('no open branch heads found on branches %s')
1468 msg = _('no open branch heads found on branches %s')
1466 if opts.get('rev'):
1469 if opts.get('rev'):
1467 msg += _(' (started at %s)' % opts['rev'])
1470 msg += _(' (started at %s)' % opts['rev'])
1468 ui.warn((msg + '\n') % headless)
1471 ui.warn((msg + '\n') % headless)
1469
1472
1470 if not heads:
1473 if not heads:
1471 return 1
1474 return 1
1472
1475
1473 heads = sorted(heads, key=lambda x: -x.rev())
1476 heads = sorted(heads, key=lambda x: -x.rev())
1474 displayer = cmdutil.show_changeset(ui, repo, opts)
1477 displayer = cmdutil.show_changeset(ui, repo, opts)
1475 for ctx in heads:
1478 for ctx in heads:
1476 displayer.show(ctx)
1479 displayer.show(ctx)
1477 displayer.close()
1480 displayer.close()
1478
1481
1479 def help_(ui, name=None, with_version=False, unknowncmd=False):
1482 def help_(ui, name=None, with_version=False, unknowncmd=False):
1480 """show help for a given topic or a help overview
1483 """show help for a given topic or a help overview
1481
1484
1482 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.
1483
1486
1484 Given a topic, extension, or command name, print help for that
1487 Given a topic, extension, or command name, print help for that
1485 topic."""
1488 topic."""
1486 option_lists = []
1489 option_lists = []
1487 textwidth = util.termwidth() - 2
1490 textwidth = util.termwidth() - 2
1488
1491
1489 def addglobalopts(aliases):
1492 def addglobalopts(aliases):
1490 if ui.verbose:
1493 if ui.verbose:
1491 option_lists.append((_("global options:"), globalopts))
1494 option_lists.append((_("global options:"), globalopts))
1492 if name == 'shortlist':
1495 if name == 'shortlist':
1493 option_lists.append((_('use "hg help" for the full list '
1496 option_lists.append((_('use "hg help" for the full list '
1494 'of commands'), ()))
1497 'of commands'), ()))
1495 else:
1498 else:
1496 if name == 'shortlist':
1499 if name == 'shortlist':
1497 msg = _('use "hg help" for the full list of commands '
1500 msg = _('use "hg help" for the full list of commands '
1498 'or "hg -v" for details')
1501 'or "hg -v" for details')
1499 elif aliases:
1502 elif aliases:
1500 msg = _('use "hg -v help%s" to show aliases and '
1503 msg = _('use "hg -v help%s" to show aliases and '
1501 'global options') % (name and " " + name or "")
1504 'global options') % (name and " " + name or "")
1502 else:
1505 else:
1503 msg = _('use "hg -v help %s" to show global options') % name
1506 msg = _('use "hg -v help %s" to show global options') % name
1504 option_lists.append((msg, ()))
1507 option_lists.append((msg, ()))
1505
1508
1506 def helpcmd(name):
1509 def helpcmd(name):
1507 if with_version:
1510 if with_version:
1508 version_(ui)
1511 version_(ui)
1509 ui.write('\n')
1512 ui.write('\n')
1510
1513
1511 try:
1514 try:
1512 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1515 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1513 except error.AmbiguousCommand, inst:
1516 except error.AmbiguousCommand, inst:
1514 # 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
1515 # except block, nor can be used inside a lambda. python issue4617
1518 # except block, nor can be used inside a lambda. python issue4617
1516 prefix = inst.args[0]
1519 prefix = inst.args[0]
1517 select = lambda c: c.lstrip('^').startswith(prefix)
1520 select = lambda c: c.lstrip('^').startswith(prefix)
1518 helplist(_('list of commands:\n\n'), select)
1521 helplist(_('list of commands:\n\n'), select)
1519 return
1522 return
1520
1523
1521 # 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
1522 if getattr(entry[0], 'badalias', False):
1525 if getattr(entry[0], 'badalias', False):
1523 if not unknowncmd:
1526 if not unknowncmd:
1524 entry[0](ui)
1527 entry[0](ui)
1525 return
1528 return
1526
1529
1527 # synopsis
1530 # synopsis
1528 if len(entry) > 2:
1531 if len(entry) > 2:
1529 if entry[2].startswith('hg'):
1532 if entry[2].startswith('hg'):
1530 ui.write("%s\n" % entry[2])
1533 ui.write("%s\n" % entry[2])
1531 else:
1534 else:
1532 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1535 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1533 else:
1536 else:
1534 ui.write('hg %s\n' % aliases[0])
1537 ui.write('hg %s\n' % aliases[0])
1535
1538
1536 # aliases
1539 # aliases
1537 if not ui.quiet and len(aliases) > 1:
1540 if not ui.quiet and len(aliases) > 1:
1538 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1541 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1539
1542
1540 # description
1543 # description
1541 doc = gettext(entry[0].__doc__)
1544 doc = gettext(entry[0].__doc__)
1542 if not doc:
1545 if not doc:
1543 doc = _("(no help text available)")
1546 doc = _("(no help text available)")
1544 if ui.quiet:
1547 if ui.quiet:
1545 doc = doc.splitlines()[0]
1548 doc = doc.splitlines()[0]
1546 keep = ui.verbose and ['verbose'] or []
1549 keep = ui.verbose and ['verbose'] or []
1547 formatted, pruned = minirst.format(doc, textwidth, keep=keep)
1550 formatted, pruned = minirst.format(doc, textwidth, keep=keep)
1548 ui.write("\n%s\n" % formatted)
1551 ui.write("\n%s\n" % formatted)
1549 if pruned:
1552 if pruned:
1550 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)
1551
1554
1552 if not ui.quiet:
1555 if not ui.quiet:
1553 # options
1556 # options
1554 if entry[1]:
1557 if entry[1]:
1555 option_lists.append((_("options:\n"), entry[1]))
1558 option_lists.append((_("options:\n"), entry[1]))
1556
1559
1557 addglobalopts(False)
1560 addglobalopts(False)
1558
1561
1559 def helplist(header, select=None):
1562 def helplist(header, select=None):
1560 h = {}
1563 h = {}
1561 cmds = {}
1564 cmds = {}
1562 for c, e in table.iteritems():
1565 for c, e in table.iteritems():
1563 f = c.split("|", 1)[0]
1566 f = c.split("|", 1)[0]
1564 if select and not select(f):
1567 if select and not select(f):
1565 continue
1568 continue
1566 if (not select and name != 'shortlist' and
1569 if (not select and name != 'shortlist' and
1567 e[0].__module__ != __name__):
1570 e[0].__module__ != __name__):
1568 continue
1571 continue
1569 if name == "shortlist" and not f.startswith("^"):
1572 if name == "shortlist" and not f.startswith("^"):
1570 continue
1573 continue
1571 f = f.lstrip("^")
1574 f = f.lstrip("^")
1572 if not ui.debugflag and f.startswith("debug"):
1575 if not ui.debugflag and f.startswith("debug"):
1573 continue
1576 continue
1574 doc = e[0].__doc__
1577 doc = e[0].__doc__
1575 if doc and 'DEPRECATED' in doc and not ui.verbose:
1578 if doc and 'DEPRECATED' in doc and not ui.verbose:
1576 continue
1579 continue
1577 doc = gettext(doc)
1580 doc = gettext(doc)
1578 if not doc:
1581 if not doc:
1579 doc = _("(no help text available)")
1582 doc = _("(no help text available)")
1580 h[f] = doc.splitlines()[0].rstrip()
1583 h[f] = doc.splitlines()[0].rstrip()
1581 cmds[f] = c.lstrip("^")
1584 cmds[f] = c.lstrip("^")
1582
1585
1583 if not h:
1586 if not h:
1584 ui.status(_('no commands defined\n'))
1587 ui.status(_('no commands defined\n'))
1585 return
1588 return
1586
1589
1587 ui.status(header)
1590 ui.status(header)
1588 fns = sorted(h)
1591 fns = sorted(h)
1589 m = max(map(len, fns))
1592 m = max(map(len, fns))
1590 for f in fns:
1593 for f in fns:
1591 if ui.verbose:
1594 if ui.verbose:
1592 commands = cmds[f].replace("|",", ")
1595 commands = cmds[f].replace("|",", ")
1593 ui.write(" %s:\n %s\n"%(commands, h[f]))
1596 ui.write(" %s:\n %s\n"%(commands, h[f]))
1594 else:
1597 else:
1595 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)))
1596
1599
1597 if not ui.quiet:
1600 if not ui.quiet:
1598 addglobalopts(True)
1601 addglobalopts(True)
1599
1602
1600 def helptopic(name):
1603 def helptopic(name):
1601 for names, header, doc in help.helptable:
1604 for names, header, doc in help.helptable:
1602 if name in names:
1605 if name in names:
1603 break
1606 break
1604 else:
1607 else:
1605 raise error.UnknownCommand(name)
1608 raise error.UnknownCommand(name)
1606
1609
1607 # description
1610 # description
1608 if not doc:
1611 if not doc:
1609 doc = _("(no help text available)")
1612 doc = _("(no help text available)")
1610 if hasattr(doc, '__call__'):
1613 if hasattr(doc, '__call__'):
1611 doc = doc()
1614 doc = doc()
1612
1615
1613 ui.write("%s\n\n" % header)
1616 ui.write("%s\n\n" % header)
1614 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1617 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1615
1618
1616 def helpext(name):
1619 def helpext(name):
1617 try:
1620 try:
1618 mod = extensions.find(name)
1621 mod = extensions.find(name)
1619 doc = gettext(mod.__doc__) or _('no help text available')
1622 doc = gettext(mod.__doc__) or _('no help text available')
1620 except KeyError:
1623 except KeyError:
1621 mod = None
1624 mod = None
1622 doc = extensions.disabledext(name)
1625 doc = extensions.disabledext(name)
1623 if not doc:
1626 if not doc:
1624 raise error.UnknownCommand(name)
1627 raise error.UnknownCommand(name)
1625
1628
1626 if '\n' not in doc:
1629 if '\n' not in doc:
1627 head, tail = doc, ""
1630 head, tail = doc, ""
1628 else:
1631 else:
1629 head, tail = doc.split('\n', 1)
1632 head, tail = doc.split('\n', 1)
1630 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1633 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1631 if tail:
1634 if tail:
1632 ui.write(minirst.format(tail, textwidth))
1635 ui.write(minirst.format(tail, textwidth))
1633 ui.status('\n\n')
1636 ui.status('\n\n')
1634
1637
1635 if mod:
1638 if mod:
1636 try:
1639 try:
1637 ct = mod.cmdtable
1640 ct = mod.cmdtable
1638 except AttributeError:
1641 except AttributeError:
1639 ct = {}
1642 ct = {}
1640 modcmds = set([c.split('|', 1)[0] for c in ct])
1643 modcmds = set([c.split('|', 1)[0] for c in ct])
1641 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1644 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1642 else:
1645 else:
1643 ui.write(_('use "hg help extensions" for information on enabling '
1646 ui.write(_('use "hg help extensions" for information on enabling '
1644 'extensions\n'))
1647 'extensions\n'))
1645
1648
1646 def helpextcmd(name):
1649 def helpextcmd(name):
1647 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1650 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1648 doc = gettext(mod.__doc__).splitlines()[0]
1651 doc = gettext(mod.__doc__).splitlines()[0]
1649
1652
1650 msg = help.listexts(_("'%s' is provided by the following "
1653 msg = help.listexts(_("'%s' is provided by the following "
1651 "extension:") % cmd, {ext: doc}, len(ext),
1654 "extension:") % cmd, {ext: doc}, len(ext),
1652 indent=4)
1655 indent=4)
1653 ui.write(minirst.format(msg, textwidth))
1656 ui.write(minirst.format(msg, textwidth))
1654 ui.write('\n\n')
1657 ui.write('\n\n')
1655 ui.write(_('use "hg help extensions" for information on enabling '
1658 ui.write(_('use "hg help extensions" for information on enabling '
1656 'extensions\n'))
1659 'extensions\n'))
1657
1660
1658 if name and name != 'shortlist':
1661 if name and name != 'shortlist':
1659 i = None
1662 i = None
1660 if unknowncmd:
1663 if unknowncmd:
1661 queries = (helpextcmd,)
1664 queries = (helpextcmd,)
1662 else:
1665 else:
1663 queries = (helptopic, helpcmd, helpext, helpextcmd)
1666 queries = (helptopic, helpcmd, helpext, helpextcmd)
1664 for f in queries:
1667 for f in queries:
1665 try:
1668 try:
1666 f(name)
1669 f(name)
1667 i = None
1670 i = None
1668 break
1671 break
1669 except error.UnknownCommand, inst:
1672 except error.UnknownCommand, inst:
1670 i = inst
1673 i = inst
1671 if i:
1674 if i:
1672 raise i
1675 raise i
1673
1676
1674 else:
1677 else:
1675 # program name
1678 # program name
1676 if ui.verbose or with_version:
1679 if ui.verbose or with_version:
1677 version_(ui)
1680 version_(ui)
1678 else:
1681 else:
1679 ui.status(_("Mercurial Distributed SCM\n"))
1682 ui.status(_("Mercurial Distributed SCM\n"))
1680 ui.status('\n')
1683 ui.status('\n')
1681
1684
1682 # list of commands
1685 # list of commands
1683 if name == "shortlist":
1686 if name == "shortlist":
1684 header = _('basic commands:\n\n')
1687 header = _('basic commands:\n\n')
1685 else:
1688 else:
1686 header = _('list of commands:\n\n')
1689 header = _('list of commands:\n\n')
1687
1690
1688 helplist(header)
1691 helplist(header)
1689 if name != 'shortlist':
1692 if name != 'shortlist':
1690 exts, maxlength = extensions.enabled()
1693 exts, maxlength = extensions.enabled()
1691 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1694 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1692 if text:
1695 if text:
1693 ui.write("\n%s\n" % minirst.format(text, textwidth))
1696 ui.write("\n%s\n" % minirst.format(text, textwidth))
1694
1697
1695 # list all option lists
1698 # list all option lists
1696 opt_output = []
1699 opt_output = []
1697 for title, options in option_lists:
1700 for title, options in option_lists:
1698 opt_output.append(("\n%s" % title, None))
1701 opt_output.append(("\n%s" % title, None))
1699 for shortopt, longopt, default, desc in options:
1702 for shortopt, longopt, default, desc in options:
1700 if _("DEPRECATED") in desc and not ui.verbose:
1703 if _("DEPRECATED") in desc and not ui.verbose:
1701 continue
1704 continue
1702 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1705 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1703 longopt and " --%s" % longopt),
1706 longopt and " --%s" % longopt),
1704 "%s%s" % (desc,
1707 "%s%s" % (desc,
1705 default
1708 default
1706 and _(" (default: %s)") % default
1709 and _(" (default: %s)") % default
1707 or "")))
1710 or "")))
1708
1711
1709 if not name:
1712 if not name:
1710 ui.write(_("\nadditional help topics:\n\n"))
1713 ui.write(_("\nadditional help topics:\n\n"))
1711 topics = []
1714 topics = []
1712 for names, header, doc in help.helptable:
1715 for names, header, doc in help.helptable:
1713 topics.append((sorted(names, key=len, reverse=True)[0], header))
1716 topics.append((sorted(names, key=len, reverse=True)[0], header))
1714 topics_len = max([len(s[0]) for s in topics])
1717 topics_len = max([len(s[0]) for s in topics])
1715 for t, desc in topics:
1718 for t, desc in topics:
1716 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1719 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1717
1720
1718 if opt_output:
1721 if opt_output:
1719 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])
1720 for first, second in opt_output:
1723 for first, second in opt_output:
1721 if second:
1724 if second:
1722 second = util.wrap(second, opts_len + 3)
1725 second = util.wrap(second, opts_len + 3)
1723 ui.write(" %-*s %s\n" % (opts_len, first, second))
1726 ui.write(" %-*s %s\n" % (opts_len, first, second))
1724 else:
1727 else:
1725 ui.write("%s\n" % first)
1728 ui.write("%s\n" % first)
1726
1729
1727 def identify(ui, repo, source=None,
1730 def identify(ui, repo, source=None,
1728 rev=None, num=None, id=None, branch=None, tags=None):
1731 rev=None, num=None, id=None, branch=None, tags=None):
1729 """identify the working copy or specified revision
1732 """identify the working copy or specified revision
1730
1733
1731 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
1732 repository.
1735 repository.
1733
1736
1734 Specifying a path to a repository root or Mercurial bundle will
1737 Specifying a path to a repository root or Mercurial bundle will
1735 cause lookup to operate on that repository/bundle.
1738 cause lookup to operate on that repository/bundle.
1736
1739
1737 This summary identifies the repository state using one or two
1740 This summary identifies the repository state using one or two
1738 parent hash identifiers, followed by a "+" if there are
1741 parent hash identifiers, followed by a "+" if there are
1739 uncommitted changes in the working directory, a list of tags for
1742 uncommitted changes in the working directory, a list of tags for
1740 this revision and a branch name for non-default branches.
1743 this revision and a branch name for non-default branches.
1741 """
1744 """
1742
1745
1743 if not repo and not source:
1746 if not repo and not source:
1744 raise util.Abort(_("There is no Mercurial repository here "
1747 raise util.Abort(_("There is no Mercurial repository here "
1745 "(.hg not found)"))
1748 "(.hg not found)"))
1746
1749
1747 hexfunc = ui.debugflag and hex or short
1750 hexfunc = ui.debugflag and hex or short
1748 default = not (num or id or branch or tags)
1751 default = not (num or id or branch or tags)
1749 output = []
1752 output = []
1750
1753
1751 revs = []
1754 revs = []
1752 if source:
1755 if source:
1753 source, branches = hg.parseurl(ui.expandpath(source))
1756 source, branches = hg.parseurl(ui.expandpath(source))
1754 repo = hg.repository(ui, source)
1757 repo = hg.repository(ui, source)
1755 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1758 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1756
1759
1757 if not repo.local():
1760 if not repo.local():
1758 if not rev and revs:
1761 if not rev and revs:
1759 rev = revs[0]
1762 rev = revs[0]
1760 if not rev:
1763 if not rev:
1761 rev = "tip"
1764 rev = "tip"
1762 if num or branch or tags:
1765 if num or branch or tags:
1763 raise util.Abort(
1766 raise util.Abort(
1764 "can't query remote revision number, branch, or tags")
1767 "can't query remote revision number, branch, or tags")
1765 output = [hexfunc(repo.lookup(rev))]
1768 output = [hexfunc(repo.lookup(rev))]
1766 elif not rev:
1769 elif not rev:
1767 ctx = repo[None]
1770 ctx = repo[None]
1768 parents = ctx.parents()
1771 parents = ctx.parents()
1769 changed = False
1772 changed = False
1770 if default or id or num:
1773 if default or id or num:
1771 changed = util.any(repo.status())
1774 changed = util.any(repo.status())
1772 if default or id:
1775 if default or id:
1773 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1776 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1774 (changed) and "+" or "")]
1777 (changed) and "+" or "")]
1775 if num:
1778 if num:
1776 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]),
1777 (changed) and "+" or ""))
1780 (changed) and "+" or ""))
1778 else:
1781 else:
1779 ctx = repo[rev]
1782 ctx = repo[rev]
1780 if default or id:
1783 if default or id:
1781 output = [hexfunc(ctx.node())]
1784 output = [hexfunc(ctx.node())]
1782 if num:
1785 if num:
1783 output.append(str(ctx.rev()))
1786 output.append(str(ctx.rev()))
1784
1787
1785 if repo.local() and default and not ui.quiet:
1788 if repo.local() and default and not ui.quiet:
1786 b = encoding.tolocal(ctx.branch())
1789 b = encoding.tolocal(ctx.branch())
1787 if b != 'default':
1790 if b != 'default':
1788 output.append("(%s)" % b)
1791 output.append("(%s)" % b)
1789
1792
1790 # multiple tags for a single parent separated by '/'
1793 # multiple tags for a single parent separated by '/'
1791 t = "/".join(ctx.tags())
1794 t = "/".join(ctx.tags())
1792 if t:
1795 if t:
1793 output.append(t)
1796 output.append(t)
1794
1797
1795 if branch:
1798 if branch:
1796 output.append(encoding.tolocal(ctx.branch()))
1799 output.append(encoding.tolocal(ctx.branch()))
1797
1800
1798 if tags:
1801 if tags:
1799 output.extend(ctx.tags())
1802 output.extend(ctx.tags())
1800
1803
1801 ui.write("%s\n" % ' '.join(output))
1804 ui.write("%s\n" % ' '.join(output))
1802
1805
1803 def import_(ui, repo, patch1, *patches, **opts):
1806 def import_(ui, repo, patch1, *patches, **opts):
1804 """import an ordered set of patches
1807 """import an ordered set of patches
1805
1808
1806 Import a list of patches and commit them individually (unless
1809 Import a list of patches and commit them individually (unless
1807 --no-commit is specified).
1810 --no-commit is specified).
1808
1811
1809 If there are outstanding changes in the working directory, import
1812 If there are outstanding changes in the working directory, import
1810 will abort unless given the -f/--force flag.
1813 will abort unless given the -f/--force flag.
1811
1814
1812 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
1813 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
1814 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
1815 message are used as default committer and commit message. All
1818 message are used as default committer and commit message. All
1816 text/plain body parts before first diff are added to commit
1819 text/plain body parts before first diff are added to commit
1817 message.
1820 message.
1818
1821
1819 If the imported patch was generated by hg export, user and
1822 If the imported patch was generated by hg export, user and
1820 description from patch override values from message headers and
1823 description from patch override values from message headers and
1821 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
1822 override these.
1825 override these.
1823
1826
1824 If --exact is specified, import will set the working directory to
1827 If --exact is specified, import will set the working directory to
1825 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
1826 resulting changeset has a different ID than the one recorded in
1829 resulting changeset has a different ID than the one recorded in
1827 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
1828 deficiencies in the text patch format.
1831 deficiencies in the text patch format.
1829
1832
1830 With -s/--similarity, hg will attempt to discover renames and
1833 With -s/--similarity, hg will attempt to discover renames and
1831 copies in the patch in the same way as 'addremove'.
1834 copies in the patch in the same way as 'addremove'.
1832
1835
1833 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
1834 a URL is specified, the patch will be downloaded from it.
1837 a URL is specified, the patch will be downloaded from it.
1835 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.
1836 """
1839 """
1837 patches = (patch1,) + patches
1840 patches = (patch1,) + patches
1838
1841
1839 date = opts.get('date')
1842 date = opts.get('date')
1840 if date:
1843 if date:
1841 opts['date'] = util.parsedate(date)
1844 opts['date'] = util.parsedate(date)
1842
1845
1843 try:
1846 try:
1844 sim = float(opts.get('similarity') or 0)
1847 sim = float(opts.get('similarity') or 0)
1845 except ValueError:
1848 except ValueError:
1846 raise util.Abort(_('similarity must be a number'))
1849 raise util.Abort(_('similarity must be a number'))
1847 if sim < 0 or sim > 100:
1850 if sim < 0 or sim > 100:
1848 raise util.Abort(_('similarity must be between 0 and 100'))
1851 raise util.Abort(_('similarity must be between 0 and 100'))
1849
1852
1850 if opts.get('exact') or not opts.get('force'):
1853 if opts.get('exact') or not opts.get('force'):
1851 cmdutil.bail_if_changed(repo)
1854 cmdutil.bail_if_changed(repo)
1852
1855
1853 d = opts["base"]
1856 d = opts["base"]
1854 strip = opts["strip"]
1857 strip = opts["strip"]
1855 wlock = lock = None
1858 wlock = lock = None
1856
1859
1857 def tryone(ui, hunk):
1860 def tryone(ui, hunk):
1858 tmpname, message, user, date, branch, nodeid, p1, p2 = \
1861 tmpname, message, user, date, branch, nodeid, p1, p2 = \
1859 patch.extract(ui, hunk)
1862 patch.extract(ui, hunk)
1860
1863
1861 if not tmpname:
1864 if not tmpname:
1862 return None
1865 return None
1863 commitid = _('to working directory')
1866 commitid = _('to working directory')
1864
1867
1865 try:
1868 try:
1866 cmdline_message = cmdutil.logmessage(opts)
1869 cmdline_message = cmdutil.logmessage(opts)
1867 if cmdline_message:
1870 if cmdline_message:
1868 # pickup the cmdline msg
1871 # pickup the cmdline msg
1869 message = cmdline_message
1872 message = cmdline_message
1870 elif message:
1873 elif message:
1871 # pickup the patch msg
1874 # pickup the patch msg
1872 message = message.strip()
1875 message = message.strip()
1873 else:
1876 else:
1874 # launch the editor
1877 # launch the editor
1875 message = None
1878 message = None
1876 ui.debug('message:\n%s\n' % message)
1879 ui.debug('message:\n%s\n' % message)
1877
1880
1878 wp = repo.parents()
1881 wp = repo.parents()
1879 if opts.get('exact'):
1882 if opts.get('exact'):
1880 if not nodeid or not p1:
1883 if not nodeid or not p1:
1881 raise util.Abort(_('not a Mercurial patch'))
1884 raise util.Abort(_('not a Mercurial patch'))
1882 p1 = repo.lookup(p1)
1885 p1 = repo.lookup(p1)
1883 p2 = repo.lookup(p2 or hex(nullid))
1886 p2 = repo.lookup(p2 or hex(nullid))
1884
1887
1885 if p1 != wp[0].node():
1888 if p1 != wp[0].node():
1886 hg.clean(repo, p1)
1889 hg.clean(repo, p1)
1887 repo.dirstate.setparents(p1, p2)
1890 repo.dirstate.setparents(p1, p2)
1888 elif p2:
1891 elif p2:
1889 try:
1892 try:
1890 p1 = repo.lookup(p1)
1893 p1 = repo.lookup(p1)
1891 p2 = repo.lookup(p2)
1894 p2 = repo.lookup(p2)
1892 if p1 == wp[0].node():
1895 if p1 == wp[0].node():
1893 repo.dirstate.setparents(p1, p2)
1896 repo.dirstate.setparents(p1, p2)
1894 except error.RepoError:
1897 except error.RepoError:
1895 pass
1898 pass
1896 if opts.get('exact') or opts.get('import_branch'):
1899 if opts.get('exact') or opts.get('import_branch'):
1897 repo.dirstate.setbranch(branch or 'default')
1900 repo.dirstate.setbranch(branch or 'default')
1898
1901
1899 files = {}
1902 files = {}
1900 try:
1903 try:
1901 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1904 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1902 files=files, eolmode=None)
1905 files=files, eolmode=None)
1903 finally:
1906 finally:
1904 files = patch.updatedir(ui, repo, files,
1907 files = patch.updatedir(ui, repo, files,
1905 similarity=sim / 100.0)
1908 similarity=sim / 100.0)
1906 if not opts.get('no_commit'):
1909 if not opts.get('no_commit'):
1907 if opts.get('exact'):
1910 if opts.get('exact'):
1908 m = None
1911 m = None
1909 else:
1912 else:
1910 m = cmdutil.matchfiles(repo, files or [])
1913 m = cmdutil.matchfiles(repo, files or [])
1911 n = repo.commit(message, opts.get('user') or user,
1914 n = repo.commit(message, opts.get('user') or user,
1912 opts.get('date') or date, match=m,
1915 opts.get('date') or date, match=m,
1913 editor=cmdutil.commiteditor)
1916 editor=cmdutil.commiteditor)
1914 if opts.get('exact'):
1917 if opts.get('exact'):
1915 if hex(n) != nodeid:
1918 if hex(n) != nodeid:
1916 repo.rollback()
1919 repo.rollback()
1917 raise util.Abort(_('patch is damaged'
1920 raise util.Abort(_('patch is damaged'
1918 ' or loses information'))
1921 ' or loses information'))
1919 # Force a dirstate write so that the next transaction
1922 # Force a dirstate write so that the next transaction
1920 # backups an up-do-date file.
1923 # backups an up-do-date file.
1921 repo.dirstate.write()
1924 repo.dirstate.write()
1922 if n:
1925 if n:
1923 commitid = short(n)
1926 commitid = short(n)
1924
1927
1925 return commitid
1928 return commitid
1926 finally:
1929 finally:
1927 os.unlink(tmpname)
1930 os.unlink(tmpname)
1928
1931
1929 try:
1932 try:
1930 wlock = repo.wlock()
1933 wlock = repo.wlock()
1931 lock = repo.lock()
1934 lock = repo.lock()
1932 lastcommit = None
1935 lastcommit = None
1933 for p in patches:
1936 for p in patches:
1934 pf = os.path.join(d, p)
1937 pf = os.path.join(d, p)
1935
1938
1936 if pf == '-':
1939 if pf == '-':
1937 ui.status(_("applying patch from stdin\n"))
1940 ui.status(_("applying patch from stdin\n"))
1938 pf = sys.stdin
1941 pf = sys.stdin
1939 else:
1942 else:
1940 ui.status(_("applying %s\n") % p)
1943 ui.status(_("applying %s\n") % p)
1941 pf = url.open(ui, pf)
1944 pf = url.open(ui, pf)
1942
1945
1943 haspatch = False
1946 haspatch = False
1944 for hunk in patch.split(pf):
1947 for hunk in patch.split(pf):
1945 commitid = tryone(ui, hunk)
1948 commitid = tryone(ui, hunk)
1946 if commitid:
1949 if commitid:
1947 haspatch = True
1950 haspatch = True
1948 if lastcommit:
1951 if lastcommit:
1949 ui.status(_('applied %s\n') % lastcommit)
1952 ui.status(_('applied %s\n') % lastcommit)
1950 lastcommit = commitid
1953 lastcommit = commitid
1951
1954
1952 if not haspatch:
1955 if not haspatch:
1953 raise util.Abort(_('no diffs found'))
1956 raise util.Abort(_('no diffs found'))
1954
1957
1955 finally:
1958 finally:
1956 release(lock, wlock)
1959 release(lock, wlock)
1957
1960
1958 def incoming(ui, repo, source="default", **opts):
1961 def incoming(ui, repo, source="default", **opts):
1959 """show new changesets found in source
1962 """show new changesets found in source
1960
1963
1961 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
1962 pull location. These are the changesets that would have been pulled
1965 pull location. These are the changesets that would have been pulled
1963 if a pull at the time you issued this command.
1966 if a pull at the time you issued this command.
1964
1967
1965 For remote repository, using --bundle avoids downloading the
1968 For remote repository, using --bundle avoids downloading the
1966 changesets twice if the incoming is followed by a pull.
1969 changesets twice if the incoming is followed by a pull.
1967
1970
1968 See pull for valid source format details.
1971 See pull for valid source format details.
1969 """
1972 """
1970 limit = cmdutil.loglimit(opts)
1973 limit = cmdutil.loglimit(opts)
1971 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
1974 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
1972 other = hg.repository(cmdutil.remoteui(repo, opts), source)
1975 other = hg.repository(cmdutil.remoteui(repo, opts), source)
1973 ui.status(_('comparing with %s\n') % url.hidepassword(source))
1976 ui.status(_('comparing with %s\n') % url.hidepassword(source))
1974 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
1977 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
1975 if revs:
1978 if revs:
1976 revs = [other.lookup(rev) for rev in revs]
1979 revs = [other.lookup(rev) for rev in revs]
1977 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
1980 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
1978 force=opts["force"])
1981 force=opts["force"])
1979 if not incoming:
1982 if not incoming:
1980 try:
1983 try:
1981 os.unlink(opts["bundle"])
1984 os.unlink(opts["bundle"])
1982 except:
1985 except:
1983 pass
1986 pass
1984 ui.status(_("no changes found\n"))
1987 ui.status(_("no changes found\n"))
1985 return 1
1988 return 1
1986
1989
1987 cleanup = None
1990 cleanup = None
1988 try:
1991 try:
1989 fname = opts["bundle"]
1992 fname = opts["bundle"]
1990 if fname or not other.local():
1993 if fname or not other.local():
1991 # create a bundle (uncompressed if other repo is not local)
1994 # create a bundle (uncompressed if other repo is not local)
1992
1995
1993 if revs is None and other.capable('changegroupsubset'):
1996 if revs is None and other.capable('changegroupsubset'):
1994 revs = rheads
1997 revs = rheads
1995
1998
1996 if revs is None:
1999 if revs is None:
1997 cg = other.changegroup(incoming, "incoming")
2000 cg = other.changegroup(incoming, "incoming")
1998 else:
2001 else:
1999 cg = other.changegroupsubset(incoming, revs, 'incoming')
2002 cg = other.changegroupsubset(incoming, revs, 'incoming')
2000 bundletype = other.local() and "HG10BZ" or "HG10UN"
2003 bundletype = other.local() and "HG10BZ" or "HG10UN"
2001 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
2004 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
2002 # keep written bundle?
2005 # keep written bundle?
2003 if opts["bundle"]:
2006 if opts["bundle"]:
2004 cleanup = None
2007 cleanup = None
2005 if not other.local():
2008 if not other.local():
2006 # use the created uncompressed bundlerepo
2009 # use the created uncompressed bundlerepo
2007 other = bundlerepo.bundlerepository(ui, repo.root, fname)
2010 other = bundlerepo.bundlerepository(ui, repo.root, fname)
2008
2011
2009 o = other.changelog.nodesbetween(incoming, revs)[0]
2012 o = other.changelog.nodesbetween(incoming, revs)[0]
2010 if opts.get('newest_first'):
2013 if opts.get('newest_first'):
2011 o.reverse()
2014 o.reverse()
2012 displayer = cmdutil.show_changeset(ui, other, opts)
2015 displayer = cmdutil.show_changeset(ui, other, opts)
2013 count = 0
2016 count = 0
2014 for n in o:
2017 for n in o:
2015 if limit is not None and count >= limit:
2018 if limit is not None and count >= limit:
2016 break
2019 break
2017 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]
2018 if opts.get('no_merges') and len(parents) == 2:
2021 if opts.get('no_merges') and len(parents) == 2:
2019 continue
2022 continue
2020 count += 1
2023 count += 1
2021 displayer.show(other[n])
2024 displayer.show(other[n])
2022 displayer.close()
2025 displayer.close()
2023 finally:
2026 finally:
2024 if hasattr(other, 'close'):
2027 if hasattr(other, 'close'):
2025 other.close()
2028 other.close()
2026 if cleanup:
2029 if cleanup:
2027 os.unlink(cleanup)
2030 os.unlink(cleanup)
2028
2031
2029 def init(ui, dest=".", **opts):
2032 def init(ui, dest=".", **opts):
2030 """create a new repository in the given directory
2033 """create a new repository in the given directory
2031
2034
2032 Initialize a new repository in the given directory. If the given
2035 Initialize a new repository in the given directory. If the given
2033 directory does not exist, it will be created.
2036 directory does not exist, it will be created.
2034
2037
2035 If no directory is given, the current directory is used.
2038 If no directory is given, the current directory is used.
2036
2039
2037 It is possible to specify an ``ssh://`` URL as the destination.
2040 It is possible to specify an ``ssh://`` URL as the destination.
2038 See 'hg help urls' for more information.
2041 See 'hg help urls' for more information.
2039 """
2042 """
2040 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
2043 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
2041
2044
2042 def locate(ui, repo, *pats, **opts):
2045 def locate(ui, repo, *pats, **opts):
2043 """locate files matching specific patterns
2046 """locate files matching specific patterns
2044
2047
2045 Print files under Mercurial control in the working directory whose
2048 Print files under Mercurial control in the working directory whose
2046 names match the given patterns.
2049 names match the given patterns.
2047
2050
2048 By default, this command searches all directories in the working
2051 By default, this command searches all directories in the working
2049 directory. To search just the current directory and its
2052 directory. To search just the current directory and its
2050 subdirectories, use "--include .".
2053 subdirectories, use "--include .".
2051
2054
2052 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
2053 of all files under Mercurial control in the working directory.
2056 of all files under Mercurial control in the working directory.
2054
2057
2055 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"
2056 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
2057 will avoid the problem of "xargs" treating single filenames that
2060 will avoid the problem of "xargs" treating single filenames that
2058 contain whitespace as multiple filenames.
2061 contain whitespace as multiple filenames.
2059 """
2062 """
2060 end = opts.get('print0') and '\0' or '\n'
2063 end = opts.get('print0') and '\0' or '\n'
2061 rev = opts.get('rev') or None
2064 rev = opts.get('rev') or None
2062
2065
2063 ret = 1
2066 ret = 1
2064 m = cmdutil.match(repo, pats, opts, default='relglob')
2067 m = cmdutil.match(repo, pats, opts, default='relglob')
2065 m.bad = lambda x, y: False
2068 m.bad = lambda x, y: False
2066 for abs in repo[rev].walk(m):
2069 for abs in repo[rev].walk(m):
2067 if not rev and abs not in repo.dirstate:
2070 if not rev and abs not in repo.dirstate:
2068 continue
2071 continue
2069 if opts.get('fullpath'):
2072 if opts.get('fullpath'):
2070 ui.write(repo.wjoin(abs), end)
2073 ui.write(repo.wjoin(abs), end)
2071 else:
2074 else:
2072 ui.write(((pats and m.rel(abs)) or abs), end)
2075 ui.write(((pats and m.rel(abs)) or abs), end)
2073 ret = 0
2076 ret = 0
2074
2077
2075 return ret
2078 return ret
2076
2079
2077 def log(ui, repo, *pats, **opts):
2080 def log(ui, repo, *pats, **opts):
2078 """show revision history of entire repository or files
2081 """show revision history of entire repository or files
2079
2082
2080 Print the revision history of the specified files or the entire
2083 Print the revision history of the specified files or the entire
2081 project.
2084 project.
2082
2085
2083 File history is shown without following rename or copy history of
2086 File history is shown without following rename or copy history of
2084 files. Use -f/--follow with a filename to follow history across
2087 files. Use -f/--follow with a filename to follow history across
2085 renames and copies. --follow without a filename will only show
2088 renames and copies. --follow without a filename will only show
2086 ancestors or descendants of the starting revision. --follow-first
2089 ancestors or descendants of the starting revision. --follow-first
2087 only follows the first parent of merge revisions.
2090 only follows the first parent of merge revisions.
2088
2091
2089 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
2090 --follow is set, in which case the working directory parent is
2093 --follow is set, in which case the working directory parent is
2091 used as the starting revision.
2094 used as the starting revision.
2092
2095
2093 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.
2094
2097
2095 By default this command prints revision number and changeset id,
2098 By default this command prints revision number and changeset id,
2096 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
2097 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
2098 changed files and full commit message are shown.
2101 changed files and full commit message are shown.
2099
2102
2100 NOTE: log -p/--patch may generate unexpected diff output for merge
2103 NOTE: log -p/--patch may generate unexpected diff output for merge
2101 changesets, as it will only compare the merge changeset against
2104 changesets, as it will only compare the merge changeset against
2102 its first parent. Also, only files different from BOTH parents
2105 its first parent. Also, only files different from BOTH parents
2103 will appear in files:.
2106 will appear in files:.
2104 """
2107 """
2105
2108
2106 matchfn = cmdutil.match(repo, pats, opts)
2109 matchfn = cmdutil.match(repo, pats, opts)
2107 limit = cmdutil.loglimit(opts)
2110 limit = cmdutil.loglimit(opts)
2108 count = 0
2111 count = 0
2109
2112
2110 endrev = None
2113 endrev = None
2111 if opts.get('copies') and opts.get('rev'):
2114 if opts.get('copies') and opts.get('rev'):
2112 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2115 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2113
2116
2114 df = False
2117 df = False
2115 if opts["date"]:
2118 if opts["date"]:
2116 df = util.matchdate(opts["date"])
2119 df = util.matchdate(opts["date"])
2117
2120
2118 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2121 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2119 def prep(ctx, fns):
2122 def prep(ctx, fns):
2120 rev = ctx.rev()
2123 rev = ctx.rev()
2121 parents = [p for p in repo.changelog.parentrevs(rev)
2124 parents = [p for p in repo.changelog.parentrevs(rev)
2122 if p != nullrev]
2125 if p != nullrev]
2123 if opts.get('no_merges') and len(parents) == 2:
2126 if opts.get('no_merges') and len(parents) == 2:
2124 return
2127 return
2125 if opts.get('only_merges') and len(parents) != 2:
2128 if opts.get('only_merges') and len(parents) != 2:
2126 return
2129 return
2127 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']:
2128 return
2131 return
2129 if df and not df(ctx.date()[0]):
2132 if df and not df(ctx.date()[0]):
2130 return
2133 return
2131 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()]:
2132 return
2135 return
2133 if opts.get('keyword'):
2136 if opts.get('keyword'):
2134 for k in [kw.lower() for kw in opts['keyword']]:
2137 for k in [kw.lower() for kw in opts['keyword']]:
2135 if (k in ctx.user().lower() or
2138 if (k in ctx.user().lower() or
2136 k in ctx.description().lower() or
2139 k in ctx.description().lower() or
2137 k in " ".join(ctx.files()).lower()):
2140 k in " ".join(ctx.files()).lower()):
2138 break
2141 break
2139 else:
2142 else:
2140 return
2143 return
2141
2144
2142 copies = None
2145 copies = None
2143 if opts.get('copies') and rev:
2146 if opts.get('copies') and rev:
2144 copies = []
2147 copies = []
2145 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2148 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2146 for fn in ctx.files():
2149 for fn in ctx.files():
2147 rename = getrenamed(fn, rev)
2150 rename = getrenamed(fn, rev)
2148 if rename:
2151 if rename:
2149 copies.append((fn, rename[0]))
2152 copies.append((fn, rename[0]))
2150
2153
2151 displayer.show(ctx, copies=copies)
2154 displayer.show(ctx, copies=copies)
2152
2155
2153 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2156 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2154 if count == limit:
2157 if count == limit:
2155 break
2158 break
2156 if displayer.flush(ctx.rev()):
2159 if displayer.flush(ctx.rev()):
2157 count += 1
2160 count += 1
2158 displayer.close()
2161 displayer.close()
2159
2162
2160 def manifest(ui, repo, node=None, rev=None):
2163 def manifest(ui, repo, node=None, rev=None):
2161 """output the current or given revision of the project manifest
2164 """output the current or given revision of the project manifest
2162
2165
2163 Print a list of version controlled files for the given revision.
2166 Print a list of version controlled files for the given revision.
2164 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
2165 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.
2166
2169
2167 With -v, print file permissions, symlink and executable bits.
2170 With -v, print file permissions, symlink and executable bits.
2168 With --debug, print file revision hashes.
2171 With --debug, print file revision hashes.
2169 """
2172 """
2170
2173
2171 if rev and node:
2174 if rev and node:
2172 raise util.Abort(_("please specify just one revision"))
2175 raise util.Abort(_("please specify just one revision"))
2173
2176
2174 if not node:
2177 if not node:
2175 node = rev
2178 node = rev
2176
2179
2177 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2180 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2178 ctx = repo[node]
2181 ctx = repo[node]
2179 for f in ctx:
2182 for f in ctx:
2180 if ui.debugflag:
2183 if ui.debugflag:
2181 ui.write("%40s " % hex(ctx.manifest()[f]))
2184 ui.write("%40s " % hex(ctx.manifest()[f]))
2182 if ui.verbose:
2185 if ui.verbose:
2183 ui.write(decor[ctx.flags(f)])
2186 ui.write(decor[ctx.flags(f)])
2184 ui.write("%s\n" % f)
2187 ui.write("%s\n" % f)
2185
2188
2186 def merge(ui, repo, node=None, **opts):
2189 def merge(ui, repo, node=None, **opts):
2187 """merge working directory with another revision
2190 """merge working directory with another revision
2188
2191
2189 The current working directory is updated with all changes made in
2192 The current working directory is updated with all changes made in
2190 the requested revision since the last common predecessor revision.
2193 the requested revision since the last common predecessor revision.
2191
2194
2192 Files that changed between either parent are marked as changed for
2195 Files that changed between either parent are marked as changed for
2193 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
2194 updates to the repository are allowed. The next commit will have
2197 updates to the repository are allowed. The next commit will have
2195 two parents.
2198 two parents.
2196
2199
2197 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
2198 head revision, and the current branch contains exactly one other
2201 head revision, and the current branch contains exactly one other
2199 head, the other head is merged with by default. Otherwise, an
2202 head, the other head is merged with by default. Otherwise, an
2200 explicit revision with which to merge with must be provided.
2203 explicit revision with which to merge with must be provided.
2201 """
2204 """
2202
2205
2203 if opts.get('rev') and node:
2206 if opts.get('rev') and node:
2204 raise util.Abort(_("please specify just one revision"))
2207 raise util.Abort(_("please specify just one revision"))
2205 if not node:
2208 if not node:
2206 node = opts.get('rev')
2209 node = opts.get('rev')
2207
2210
2208 if not node:
2211 if not node:
2209 branch = repo.changectx(None).branch()
2212 branch = repo.changectx(None).branch()
2210 bheads = repo.branchheads(branch)
2213 bheads = repo.branchheads(branch)
2211 if len(bheads) > 2:
2214 if len(bheads) > 2:
2212 ui.warn(_("abort: branch '%s' has %d heads - "
2215 ui.warn(_("abort: branch '%s' has %d heads - "
2213 "please merge with an explicit rev\n")
2216 "please merge with an explicit rev\n")
2214 % (branch, len(bheads)))
2217 % (branch, len(bheads)))
2215 ui.status(_("(run 'hg heads .' to see heads)\n"))
2218 ui.status(_("(run 'hg heads .' to see heads)\n"))
2216 return False
2219 return False
2217
2220
2218 parent = repo.dirstate.parents()[0]
2221 parent = repo.dirstate.parents()[0]
2219 if len(bheads) == 1:
2222 if len(bheads) == 1:
2220 if len(repo.heads()) > 1:
2223 if len(repo.heads()) > 1:
2221 ui.warn(_("abort: branch '%s' has one head - "
2224 ui.warn(_("abort: branch '%s' has one head - "
2222 "please merge with an explicit rev\n" % branch))
2225 "please merge with an explicit rev\n" % branch))
2223 ui.status(_("(run 'hg heads' to see all heads)\n"))
2226 ui.status(_("(run 'hg heads' to see all heads)\n"))
2224 return False
2227 return False
2225 msg = _('there is nothing to merge')
2228 msg = _('there is nothing to merge')
2226 if parent != repo.lookup(repo[None].branch()):
2229 if parent != repo.lookup(repo[None].branch()):
2227 msg = _('%s - use "hg update" instead') % msg
2230 msg = _('%s - use "hg update" instead') % msg
2228 raise util.Abort(msg)
2231 raise util.Abort(msg)
2229
2232
2230 if parent not in bheads:
2233 if parent not in bheads:
2231 raise util.Abort(_('working dir not at a head rev - '
2234 raise util.Abort(_('working dir not at a head rev - '
2232 'use "hg update" or merge with an explicit rev'))
2235 'use "hg update" or merge with an explicit rev'))
2233 node = parent == bheads[0] and bheads[-1] or bheads[0]
2236 node = parent == bheads[0] and bheads[-1] or bheads[0]
2234
2237
2235 if opts.get('preview'):
2238 if opts.get('preview'):
2236 # find nodes that are ancestors of p2 but not of p1
2239 # find nodes that are ancestors of p2 but not of p1
2237 p1 = repo.lookup('.')
2240 p1 = repo.lookup('.')
2238 p2 = repo.lookup(node)
2241 p2 = repo.lookup(node)
2239 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
2242 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
2240
2243
2241 displayer = cmdutil.show_changeset(ui, repo, opts)
2244 displayer = cmdutil.show_changeset(ui, repo, opts)
2242 for node in nodes:
2245 for node in nodes:
2243 displayer.show(repo[node])
2246 displayer.show(repo[node])
2244 displayer.close()
2247 displayer.close()
2245 return 0
2248 return 0
2246
2249
2247 return hg.merge(repo, node, force=opts.get('force'))
2250 return hg.merge(repo, node, force=opts.get('force'))
2248
2251
2249 def outgoing(ui, repo, dest=None, **opts):
2252 def outgoing(ui, repo, dest=None, **opts):
2250 """show changesets not found in the destination
2253 """show changesets not found in the destination
2251
2254
2252 Show changesets not found in the specified destination repository
2255 Show changesets not found in the specified destination repository
2253 or the default push location. These are the changesets that would
2256 or the default push location. These are the changesets that would
2254 be pushed if a push was requested.
2257 be pushed if a push was requested.
2255
2258
2256 See pull for details of valid destination formats.
2259 See pull for details of valid destination formats.
2257 """
2260 """
2258 limit = cmdutil.loglimit(opts)
2261 limit = cmdutil.loglimit(opts)
2259 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2262 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2260 dest, branches = hg.parseurl(dest, opts.get('branch'))
2263 dest, branches = hg.parseurl(dest, opts.get('branch'))
2261 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2264 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2262 if revs:
2265 if revs:
2263 revs = [repo.lookup(rev) for rev in revs]
2266 revs = [repo.lookup(rev) for rev in revs]
2264
2267
2265 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2268 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2266 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2269 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2267 o = repo.findoutgoing(other, force=opts.get('force'))
2270 o = repo.findoutgoing(other, force=opts.get('force'))
2268 if not o:
2271 if not o:
2269 ui.status(_("no changes found\n"))
2272 ui.status(_("no changes found\n"))
2270 return 1
2273 return 1
2271 o = repo.changelog.nodesbetween(o, revs)[0]
2274 o = repo.changelog.nodesbetween(o, revs)[0]
2272 if opts.get('newest_first'):
2275 if opts.get('newest_first'):
2273 o.reverse()
2276 o.reverse()
2274 displayer = cmdutil.show_changeset(ui, repo, opts)
2277 displayer = cmdutil.show_changeset(ui, repo, opts)
2275 count = 0
2278 count = 0
2276 for n in o:
2279 for n in o:
2277 if limit is not None and count >= limit:
2280 if limit is not None and count >= limit:
2278 break
2281 break
2279 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]
2280 if opts.get('no_merges') and len(parents) == 2:
2283 if opts.get('no_merges') and len(parents) == 2:
2281 continue
2284 continue
2282 count += 1
2285 count += 1
2283 displayer.show(repo[n])
2286 displayer.show(repo[n])
2284 displayer.close()
2287 displayer.close()
2285
2288
2286 def parents(ui, repo, file_=None, **opts):
2289 def parents(ui, repo, file_=None, **opts):
2287 """show the parents of the working directory or revision
2290 """show the parents of the working directory or revision
2288
2291
2289 Print the working directory's parent revisions. If a revision is
2292 Print the working directory's parent revisions. If a revision is
2290 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.
2291 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
2292 last changed (before the working directory revision or the
2295 last changed (before the working directory revision or the
2293 argument to --rev if given) is printed.
2296 argument to --rev if given) is printed.
2294 """
2297 """
2295 rev = opts.get('rev')
2298 rev = opts.get('rev')
2296 if rev:
2299 if rev:
2297 ctx = repo[rev]
2300 ctx = repo[rev]
2298 else:
2301 else:
2299 ctx = repo[None]
2302 ctx = repo[None]
2300
2303
2301 if file_:
2304 if file_:
2302 m = cmdutil.match(repo, (file_,), opts)
2305 m = cmdutil.match(repo, (file_,), opts)
2303 if m.anypats() or len(m.files()) != 1:
2306 if m.anypats() or len(m.files()) != 1:
2304 raise util.Abort(_('can only specify an explicit filename'))
2307 raise util.Abort(_('can only specify an explicit filename'))
2305 file_ = m.files()[0]
2308 file_ = m.files()[0]
2306 filenodes = []
2309 filenodes = []
2307 for cp in ctx.parents():
2310 for cp in ctx.parents():
2308 if not cp:
2311 if not cp:
2309 continue
2312 continue
2310 try:
2313 try:
2311 filenodes.append(cp.filenode(file_))
2314 filenodes.append(cp.filenode(file_))
2312 except error.LookupError:
2315 except error.LookupError:
2313 pass
2316 pass
2314 if not filenodes:
2317 if not filenodes:
2315 raise util.Abort(_("'%s' not found in manifest!") % file_)
2318 raise util.Abort(_("'%s' not found in manifest!") % file_)
2316 fl = repo.file(file_)
2319 fl = repo.file(file_)
2317 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]
2318 else:
2321 else:
2319 p = [cp.node() for cp in ctx.parents()]
2322 p = [cp.node() for cp in ctx.parents()]
2320
2323
2321 displayer = cmdutil.show_changeset(ui, repo, opts)
2324 displayer = cmdutil.show_changeset(ui, repo, opts)
2322 for n in p:
2325 for n in p:
2323 if n != nullid:
2326 if n != nullid:
2324 displayer.show(repo[n])
2327 displayer.show(repo[n])
2325 displayer.close()
2328 displayer.close()
2326
2329
2327 def paths(ui, repo, search=None):
2330 def paths(ui, repo, search=None):
2328 """show aliases for remote repositories
2331 """show aliases for remote repositories
2329
2332
2330 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,
2331 show definition of all available names.
2334 show definition of all available names.
2332
2335
2333 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
2334 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.
2335
2338
2336 See 'hg help urls' for more information.
2339 See 'hg help urls' for more information.
2337 """
2340 """
2338 if search:
2341 if search:
2339 for name, path in ui.configitems("paths"):
2342 for name, path in ui.configitems("paths"):
2340 if name == search:
2343 if name == search:
2341 ui.write("%s\n" % url.hidepassword(path))
2344 ui.write("%s\n" % url.hidepassword(path))
2342 return
2345 return
2343 ui.warn(_("not found!\n"))
2346 ui.warn(_("not found!\n"))
2344 return 1
2347 return 1
2345 else:
2348 else:
2346 for name, path in ui.configitems("paths"):
2349 for name, path in ui.configitems("paths"):
2347 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2350 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2348
2351
2349 def postincoming(ui, repo, modheads, optupdate, checkout):
2352 def postincoming(ui, repo, modheads, optupdate, checkout):
2350 if modheads == 0:
2353 if modheads == 0:
2351 return
2354 return
2352 if optupdate:
2355 if optupdate:
2353 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2356 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2354 return hg.update(repo, checkout)
2357 return hg.update(repo, checkout)
2355 else:
2358 else:
2356 ui.status(_("not updating, since new heads added\n"))
2359 ui.status(_("not updating, since new heads added\n"))
2357 if modheads > 1:
2360 if modheads > 1:
2358 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"))
2359 else:
2362 else:
2360 ui.status(_("(run 'hg update' to get a working copy)\n"))
2363 ui.status(_("(run 'hg update' to get a working copy)\n"))
2361
2364
2362 def pull(ui, repo, source="default", **opts):
2365 def pull(ui, repo, source="default", **opts):
2363 """pull changes from the specified source
2366 """pull changes from the specified source
2364
2367
2365 Pull changes from a remote repository to a local one.
2368 Pull changes from a remote repository to a local one.
2366
2369
2367 This finds all changes from the repository at the specified path
2370 This finds all changes from the repository at the specified path
2368 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
2369 -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
2370 project in the working directory.
2373 project in the working directory.
2371
2374
2372 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
2373 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
2374 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
2375 where X is the last changeset listed by hg incoming.
2378 where X is the last changeset listed by hg incoming.
2376
2379
2377 If SOURCE is omitted, the 'default' path will be used.
2380 If SOURCE is omitted, the 'default' path will be used.
2378 See 'hg help urls' for more information.
2381 See 'hg help urls' for more information.
2379 """
2382 """
2380 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2383 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2381 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2384 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2382 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2385 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2383 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2386 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2384 if revs:
2387 if revs:
2385 try:
2388 try:
2386 revs = [other.lookup(rev) for rev in revs]
2389 revs = [other.lookup(rev) for rev in revs]
2387 except error.CapabilityError:
2390 except error.CapabilityError:
2388 err = _("Other repository doesn't support revision lookup, "
2391 err = _("Other repository doesn't support revision lookup, "
2389 "so a rev cannot be specified.")
2392 "so a rev cannot be specified.")
2390 raise util.Abort(err)
2393 raise util.Abort(err)
2391
2394
2392 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2395 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2393 if checkout:
2396 if checkout:
2394 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2397 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2395 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2398 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2396
2399
2397 def push(ui, repo, dest=None, **opts):
2400 def push(ui, repo, dest=None, **opts):
2398 """push changes to the specified destination
2401 """push changes to the specified destination
2399
2402
2400 Push changes from the local repository to the specified destination.
2403 Push changes from the local repository to the specified destination.
2401
2404
2402 This is the symmetrical operation for pull. It moves changes from
2405 This is the symmetrical operation for pull. It moves changes from
2403 the current repository to a different one. If the destination is
2406 the current repository to a different one. If the destination is
2404 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
2405 current one.
2408 current one.
2406
2409
2407 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
2408 increase the number of remote heads. This generally indicates the
2411 increase the number of remote heads. This generally indicates the
2409 user forgot to pull and merge before pushing.
2412 user forgot to pull and merge before pushing.
2410
2413
2411 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
2412 be pushed to the remote repository.
2415 be pushed to the remote repository.
2413
2416
2414 Please see 'hg help urls' for important details about ``ssh://``
2417 Please see 'hg help urls' for important details about ``ssh://``
2415 URLs. If DESTINATION is omitted, a default path will be used.
2418 URLs. If DESTINATION is omitted, a default path will be used.
2416 """
2419 """
2417 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2420 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2418 dest, branches = hg.parseurl(dest, opts.get('branch'))
2421 dest, branches = hg.parseurl(dest, opts.get('branch'))
2419 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2422 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2420 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2423 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2421 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2424 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2422 if revs:
2425 if revs:
2423 revs = [repo.lookup(rev) for rev in revs]
2426 revs = [repo.lookup(rev) for rev in revs]
2424
2427
2425 # push subrepos depth-first for coherent ordering
2428 # push subrepos depth-first for coherent ordering
2426 c = repo['']
2429 c = repo['']
2427 subs = c.substate # only repos that are committed
2430 subs = c.substate # only repos that are committed
2428 for s in sorted(subs):
2431 for s in sorted(subs):
2429 c.sub(s).push(opts.get('force'))
2432 c.sub(s).push(opts.get('force'))
2430
2433
2431 r = repo.push(other, opts.get('force'), revs=revs)
2434 r = repo.push(other, opts.get('force'), revs=revs)
2432 return r == 0
2435 return r == 0
2433
2436
2434 def recover(ui, repo):
2437 def recover(ui, repo):
2435 """roll back an interrupted transaction
2438 """roll back an interrupted transaction
2436
2439
2437 Recover from an interrupted commit or pull.
2440 Recover from an interrupted commit or pull.
2438
2441
2439 This command tries to fix the repository status after an
2442 This command tries to fix the repository status after an
2440 interrupted operation. It should only be necessary when Mercurial
2443 interrupted operation. It should only be necessary when Mercurial
2441 suggests it.
2444 suggests it.
2442 """
2445 """
2443 if repo.recover():
2446 if repo.recover():
2444 return hg.verify(repo)
2447 return hg.verify(repo)
2445 return 1
2448 return 1
2446
2449
2447 def remove(ui, repo, *pats, **opts):
2450 def remove(ui, repo, *pats, **opts):
2448 """remove the specified files on the next commit
2451 """remove the specified files on the next commit
2449
2452
2450 Schedule the indicated files for removal from the repository.
2453 Schedule the indicated files for removal from the repository.
2451
2454
2452 This only removes files from the current branch, not from the
2455 This only removes files from the current branch, not from the
2453 entire project history. -A/--after can be used to remove only
2456 entire project history. -A/--after can be used to remove only
2454 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
2455 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
2456 revision without deleting them from the working directory.
2459 revision without deleting them from the working directory.
2457
2460
2458 The following table details the behavior of remove for different
2461 The following table details the behavior of remove for different
2459 file states (columns) and option combinations (rows). The file
2462 file states (columns) and option combinations (rows). The file
2460 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2463 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2461 reported by hg status). The actions are Warn, Remove (from branch)
2464 reported by hg status). The actions are Warn, Remove (from branch)
2462 and Delete (from disk)::
2465 and Delete (from disk)::
2463
2466
2464 A C M !
2467 A C M !
2465 none W RD W R
2468 none W RD W R
2466 -f R RD RD R
2469 -f R RD RD R
2467 -A W W W R
2470 -A W W W R
2468 -Af R R R R
2471 -Af R R R R
2469
2472
2470 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.
2471 To undo a remove before that, see hg revert.
2474 To undo a remove before that, see hg revert.
2472 """
2475 """
2473
2476
2474 after, force = opts.get('after'), opts.get('force')
2477 after, force = opts.get('after'), opts.get('force')
2475 if not pats and not after:
2478 if not pats and not after:
2476 raise util.Abort(_('no files specified'))
2479 raise util.Abort(_('no files specified'))
2477
2480
2478 m = cmdutil.match(repo, pats, opts)
2481 m = cmdutil.match(repo, pats, opts)
2479 s = repo.status(match=m, clean=True)
2482 s = repo.status(match=m, clean=True)
2480 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]
2481
2484
2482 for f in m.files():
2485 for f in m.files():
2483 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)):
2484 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))
2485
2488
2486 def warn(files, reason):
2489 def warn(files, reason):
2487 for f in files:
2490 for f in files:
2488 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')
2489 % (m.rel(f), reason))
2492 % (m.rel(f), reason))
2490
2493
2491 if force:
2494 if force:
2492 remove, forget = modified + deleted + clean, added
2495 remove, forget = modified + deleted + clean, added
2493 elif after:
2496 elif after:
2494 remove, forget = deleted, []
2497 remove, forget = deleted, []
2495 warn(modified + added + clean, _('still exists'))
2498 warn(modified + added + clean, _('still exists'))
2496 else:
2499 else:
2497 remove, forget = deleted + clean, []
2500 remove, forget = deleted + clean, []
2498 warn(modified, _('is modified'))
2501 warn(modified, _('is modified'))
2499 warn(added, _('has been marked for add'))
2502 warn(added, _('has been marked for add'))
2500
2503
2501 for f in sorted(remove + forget):
2504 for f in sorted(remove + forget):
2502 if ui.verbose or not m.exact(f):
2505 if ui.verbose or not m.exact(f):
2503 ui.status(_('removing %s\n') % m.rel(f))
2506 ui.status(_('removing %s\n') % m.rel(f))
2504
2507
2505 repo.forget(forget)
2508 repo.forget(forget)
2506 repo.remove(remove, unlink=not after)
2509 repo.remove(remove, unlink=not after)
2507
2510
2508 def rename(ui, repo, *pats, **opts):
2511 def rename(ui, repo, *pats, **opts):
2509 """rename files; equivalent of copy + remove
2512 """rename files; equivalent of copy + remove
2510
2513
2511 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
2512 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
2513 file, there can only be one source.
2516 file, there can only be one source.
2514
2517
2515 By default, this command copies the contents of files as they
2518 By default, this command copies the contents of files as they
2516 exist in the working directory. If invoked with -A/--after, the
2519 exist in the working directory. If invoked with -A/--after, the
2517 operation is recorded, but no copying is performed.
2520 operation is recorded, but no copying is performed.
2518
2521
2519 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
2520 before that, see hg revert.
2523 before that, see hg revert.
2521 """
2524 """
2522 wlock = repo.wlock(False)
2525 wlock = repo.wlock(False)
2523 try:
2526 try:
2524 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2527 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2525 finally:
2528 finally:
2526 wlock.release()
2529 wlock.release()
2527
2530
2528 def resolve(ui, repo, *pats, **opts):
2531 def resolve(ui, repo, *pats, **opts):
2529 """retry file merges from a merge or update
2532 """retry file merges from a merge or update
2530
2533
2531 This command can cleanly retry unresolved file merges using file
2534 This command can cleanly retry unresolved file merges using file
2532 revisions preserved from the last update or merge.
2535 revisions preserved from the last update or merge.
2533
2536
2534 If a conflict is resolved manually, please note that the changes
2537 If a conflict is resolved manually, please note that the changes
2535 will be overwritten if the merge is retried with resolve. The
2538 will be overwritten if the merge is retried with resolve. The
2536 -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.
2537
2540
2538 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
2539 switch to select all unresolved files.
2542 switch to select all unresolved files.
2540
2543
2541 This command also allows listing resolved files and manually
2544 This command also allows listing resolved files and manually
2542 indicating whether or not files are resolved. All files must be
2545 indicating whether or not files are resolved. All files must be
2543 marked as resolved before a commit is permitted.
2546 marked as resolved before a commit is permitted.
2544
2547
2545 The codes used to show the status of files are::
2548 The codes used to show the status of files are::
2546
2549
2547 U = unresolved
2550 U = unresolved
2548 R = resolved
2551 R = resolved
2549 """
2552 """
2550
2553
2551 all, mark, unmark, show, nostatus = \
2554 all, mark, unmark, show, nostatus = \
2552 [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()]
2553
2556
2554 if (show and (mark or unmark)) or (mark and unmark):
2557 if (show and (mark or unmark)) or (mark and unmark):
2555 raise util.Abort(_("too many options specified"))
2558 raise util.Abort(_("too many options specified"))
2556 if pats and all:
2559 if pats and all:
2557 raise util.Abort(_("can't specify --all and patterns"))
2560 raise util.Abort(_("can't specify --all and patterns"))
2558 if not (all or pats or show or mark or unmark):
2561 if not (all or pats or show or mark or unmark):
2559 raise util.Abort(_('no files or directories specified; '
2562 raise util.Abort(_('no files or directories specified; '
2560 'use --all to remerge all files'))
2563 'use --all to remerge all files'))
2561
2564
2562 ms = merge_.mergestate(repo)
2565 ms = merge_.mergestate(repo)
2563 m = cmdutil.match(repo, pats, opts)
2566 m = cmdutil.match(repo, pats, opts)
2564
2567
2565 for f in ms:
2568 for f in ms:
2566 if m(f):
2569 if m(f):
2567 if show:
2570 if show:
2568 if nostatus:
2571 if nostatus:
2569 ui.write("%s\n" % f)
2572 ui.write("%s\n" % f)
2570 else:
2573 else:
2571 ui.write("%s %s\n" % (ms[f].upper(), f))
2574 ui.write("%s %s\n" % (ms[f].upper(), f))
2572 elif mark:
2575 elif mark:
2573 ms.mark(f, "r")
2576 ms.mark(f, "r")
2574 elif unmark:
2577 elif unmark:
2575 ms.mark(f, "u")
2578 ms.mark(f, "u")
2576 else:
2579 else:
2577 wctx = repo[None]
2580 wctx = repo[None]
2578 mctx = wctx.parents()[-1]
2581 mctx = wctx.parents()[-1]
2579
2582
2580 # backup pre-resolve (merge uses .orig for its own purposes)
2583 # backup pre-resolve (merge uses .orig for its own purposes)
2581 a = repo.wjoin(f)
2584 a = repo.wjoin(f)
2582 util.copyfile(a, a + ".resolve")
2585 util.copyfile(a, a + ".resolve")
2583
2586
2584 # resolve file
2587 # resolve file
2585 ms.resolve(f, wctx, mctx)
2588 ms.resolve(f, wctx, mctx)
2586
2589
2587 # replace filemerge's .orig file with our resolve file
2590 # replace filemerge's .orig file with our resolve file
2588 util.rename(a + ".resolve", a + ".orig")
2591 util.rename(a + ".resolve", a + ".orig")
2589
2592
2590 def revert(ui, repo, *pats, **opts):
2593 def revert(ui, repo, *pats, **opts):
2591 """restore individual files or directories to an earlier state
2594 """restore individual files or directories to an earlier state
2592
2595
2593 (Use update -r to check out earlier revisions, revert does not
2596 (Use update -r to check out earlier revisions, revert does not
2594 change the working directory parents.)
2597 change the working directory parents.)
2595
2598
2596 With no revision specified, revert the named files or directories
2599 With no revision specified, revert the named files or directories
2597 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.
2598 This restores the contents of the affected files to an unmodified
2601 This restores the contents of the affected files to an unmodified
2599 state and unschedules adds, removes, copies, and renames. If the
2602 state and unschedules adds, removes, copies, and renames. If the
2600 working directory has two parents, you must explicitly specify a
2603 working directory has two parents, you must explicitly specify a
2601 revision.
2604 revision.
2602
2605
2603 Using the -r/--rev option, revert the given files or directories
2606 Using the -r/--rev option, revert the given files or directories
2604 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
2605 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
2606 dates' for a list of formats valid for -d/--date.
2609 dates' for a list of formats valid for -d/--date.
2607
2610
2608 Revert modifies the working directory. It does not commit any
2611 Revert modifies the working directory. It does not commit any
2609 changes, or change the parent of the working directory. If you
2612 changes, or change the parent of the working directory. If you
2610 revert to a revision other than the parent of the working
2613 revert to a revision other than the parent of the working
2611 directory, the reverted files will thus appear modified
2614 directory, the reverted files will thus appear modified
2612 afterwards.
2615 afterwards.
2613
2616
2614 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
2615 of a file was changed, it is reset.
2618 of a file was changed, it is reset.
2616
2619
2617 If names are given, all files matching the names are reverted.
2620 If names are given, all files matching the names are reverted.
2618 If no arguments are given, no files are reverted.
2621 If no arguments are given, no files are reverted.
2619
2622
2620 Modified files are saved with a .orig suffix before reverting.
2623 Modified files are saved with a .orig suffix before reverting.
2621 To disable these backups, use --no-backup.
2624 To disable these backups, use --no-backup.
2622 """
2625 """
2623
2626
2624 if opts["date"]:
2627 if opts["date"]:
2625 if opts["rev"]:
2628 if opts["rev"]:
2626 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"))
2627 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2630 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2628
2631
2629 if not pats and not opts.get('all'):
2632 if not pats and not opts.get('all'):
2630 raise util.Abort(_('no files or directories specified; '
2633 raise util.Abort(_('no files or directories specified; '
2631 'use --all to revert the whole repo'))
2634 'use --all to revert the whole repo'))
2632
2635
2633 parent, p2 = repo.dirstate.parents()
2636 parent, p2 = repo.dirstate.parents()
2634 if not opts.get('rev') and p2 != nullid:
2637 if not opts.get('rev') and p2 != nullid:
2635 raise util.Abort(_('uncommitted merge - please provide a '
2638 raise util.Abort(_('uncommitted merge - please provide a '
2636 'specific revision'))
2639 'specific revision'))
2637 ctx = repo[opts.get('rev')]
2640 ctx = repo[opts.get('rev')]
2638 node = ctx.node()
2641 node = ctx.node()
2639 mf = ctx.manifest()
2642 mf = ctx.manifest()
2640 if node == parent:
2643 if node == parent:
2641 pmf = mf
2644 pmf = mf
2642 else:
2645 else:
2643 pmf = None
2646 pmf = None
2644
2647
2645 # need all matching names in dirstate and manifest of target rev,
2648 # need all matching names in dirstate and manifest of target rev,
2646 # 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
2647 # but not other.
2650 # but not other.
2648
2651
2649 names = {}
2652 names = {}
2650
2653
2651 wlock = repo.wlock()
2654 wlock = repo.wlock()
2652 try:
2655 try:
2653 # walk dirstate.
2656 # walk dirstate.
2654
2657
2655 m = cmdutil.match(repo, pats, opts)
2658 m = cmdutil.match(repo, pats, opts)
2656 m.bad = lambda x, y: False
2659 m.bad = lambda x, y: False
2657 for abs in repo.walk(m):
2660 for abs in repo.walk(m):
2658 names[abs] = m.rel(abs), m.exact(abs)
2661 names[abs] = m.rel(abs), m.exact(abs)
2659
2662
2660 # walk target manifest.
2663 # walk target manifest.
2661
2664
2662 def badfn(path, msg):
2665 def badfn(path, msg):
2663 if path in names:
2666 if path in names:
2664 return
2667 return
2665 path_ = path + '/'
2668 path_ = path + '/'
2666 for f in names:
2669 for f in names:
2667 if f.startswith(path_):
2670 if f.startswith(path_):
2668 return
2671 return
2669 ui.warn("%s: %s\n" % (m.rel(path), msg))
2672 ui.warn("%s: %s\n" % (m.rel(path), msg))
2670
2673
2671 m = cmdutil.match(repo, pats, opts)
2674 m = cmdutil.match(repo, pats, opts)
2672 m.bad = badfn
2675 m.bad = badfn
2673 for abs in repo[node].walk(m):
2676 for abs in repo[node].walk(m):
2674 if abs not in names:
2677 if abs not in names:
2675 names[abs] = m.rel(abs), m.exact(abs)
2678 names[abs] = m.rel(abs), m.exact(abs)
2676
2679
2677 m = cmdutil.matchfiles(repo, names)
2680 m = cmdutil.matchfiles(repo, names)
2678 changes = repo.status(match=m)[:4]
2681 changes = repo.status(match=m)[:4]
2679 modified, added, removed, deleted = map(set, changes)
2682 modified, added, removed, deleted = map(set, changes)
2680
2683
2681 # if f is a rename, also revert the source
2684 # if f is a rename, also revert the source
2682 cwd = repo.getcwd()
2685 cwd = repo.getcwd()
2683 for f in added:
2686 for f in added:
2684 src = repo.dirstate.copied(f)
2687 src = repo.dirstate.copied(f)
2685 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':
2686 removed.add(src)
2689 removed.add(src)
2687 names[src] = (repo.pathto(src, cwd), True)
2690 names[src] = (repo.pathto(src, cwd), True)
2688
2691
2689 def removeforget(abs):
2692 def removeforget(abs):
2690 if repo.dirstate[abs] == 'a':
2693 if repo.dirstate[abs] == 'a':
2691 return _('forgetting %s\n')
2694 return _('forgetting %s\n')
2692 return _('removing %s\n')
2695 return _('removing %s\n')
2693
2696
2694 revert = ([], _('reverting %s\n'))
2697 revert = ([], _('reverting %s\n'))
2695 add = ([], _('adding %s\n'))
2698 add = ([], _('adding %s\n'))
2696 remove = ([], removeforget)
2699 remove = ([], removeforget)
2697 undelete = ([], _('undeleting %s\n'))
2700 undelete = ([], _('undeleting %s\n'))
2698
2701
2699 disptable = (
2702 disptable = (
2700 # dispatch table:
2703 # dispatch table:
2701 # file state
2704 # file state
2702 # action if in target manifest
2705 # action if in target manifest
2703 # action if not in target manifest
2706 # action if not in target manifest
2704 # make backup if in target manifest
2707 # make backup if in target manifest
2705 # make backup if not in target manifest
2708 # make backup if not in target manifest
2706 (modified, revert, remove, True, True),
2709 (modified, revert, remove, True, True),
2707 (added, revert, remove, True, False),
2710 (added, revert, remove, True, False),
2708 (removed, undelete, None, False, False),
2711 (removed, undelete, None, False, False),
2709 (deleted, revert, remove, False, False),
2712 (deleted, revert, remove, False, False),
2710 )
2713 )
2711
2714
2712 for abs, (rel, exact) in sorted(names.items()):
2715 for abs, (rel, exact) in sorted(names.items()):
2713 mfentry = mf.get(abs)
2716 mfentry = mf.get(abs)
2714 target = repo.wjoin(abs)
2717 target = repo.wjoin(abs)
2715 def handle(xlist, dobackup):
2718 def handle(xlist, dobackup):
2716 xlist[0].append(abs)
2719 xlist[0].append(abs)
2717 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):
2718 bakname = "%s.orig" % rel
2721 bakname = "%s.orig" % rel
2719 ui.note(_('saving current version of %s as %s\n') %
2722 ui.note(_('saving current version of %s as %s\n') %
2720 (rel, bakname))
2723 (rel, bakname))
2721 if not opts.get('dry_run'):
2724 if not opts.get('dry_run'):
2722 util.copyfile(target, bakname)
2725 util.copyfile(target, bakname)
2723 if ui.verbose or not exact:
2726 if ui.verbose or not exact:
2724 msg = xlist[1]
2727 msg = xlist[1]
2725 if not isinstance(msg, basestring):
2728 if not isinstance(msg, basestring):
2726 msg = msg(abs)
2729 msg = msg(abs)
2727 ui.status(msg % rel)
2730 ui.status(msg % rel)
2728 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2731 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2729 if abs not in table:
2732 if abs not in table:
2730 continue
2733 continue
2731 # file has changed in dirstate
2734 # file has changed in dirstate
2732 if mfentry:
2735 if mfentry:
2733 handle(hitlist, backuphit)
2736 handle(hitlist, backuphit)
2734 elif misslist is not None:
2737 elif misslist is not None:
2735 handle(misslist, backupmiss)
2738 handle(misslist, backupmiss)
2736 break
2739 break
2737 else:
2740 else:
2738 if abs not in repo.dirstate:
2741 if abs not in repo.dirstate:
2739 if mfentry:
2742 if mfentry:
2740 handle(add, True)
2743 handle(add, True)
2741 elif exact:
2744 elif exact:
2742 ui.warn(_('file not managed: %s\n') % rel)
2745 ui.warn(_('file not managed: %s\n') % rel)
2743 continue
2746 continue
2744 # file has not changed in dirstate
2747 # file has not changed in dirstate
2745 if node == parent:
2748 if node == parent:
2746 if exact:
2749 if exact:
2747 ui.warn(_('no changes needed to %s\n') % rel)
2750 ui.warn(_('no changes needed to %s\n') % rel)
2748 continue
2751 continue
2749 if pmf is None:
2752 if pmf is None:
2750 # only need parent manifest in this unlikely case,
2753 # only need parent manifest in this unlikely case,
2751 # so do not read by default
2754 # so do not read by default
2752 pmf = repo[parent].manifest()
2755 pmf = repo[parent].manifest()
2753 if abs in pmf:
2756 if abs in pmf:
2754 if mfentry:
2757 if mfentry:
2755 # if version of file is same in parent and target
2758 # if version of file is same in parent and target
2756 # manifests, do nothing
2759 # manifests, do nothing
2757 if (pmf[abs] != mfentry or
2760 if (pmf[abs] != mfentry or
2758 pmf.flags(abs) != mf.flags(abs)):
2761 pmf.flags(abs) != mf.flags(abs)):
2759 handle(revert, False)
2762 handle(revert, False)
2760 else:
2763 else:
2761 handle(remove, False)
2764 handle(remove, False)
2762
2765
2763 if not opts.get('dry_run'):
2766 if not opts.get('dry_run'):
2764 def checkout(f):
2767 def checkout(f):
2765 fc = ctx[f]
2768 fc = ctx[f]
2766 repo.wwrite(f, fc.data(), fc.flags())
2769 repo.wwrite(f, fc.data(), fc.flags())
2767
2770
2768 audit_path = util.path_auditor(repo.root)
2771 audit_path = util.path_auditor(repo.root)
2769 for f in remove[0]:
2772 for f in remove[0]:
2770 if repo.dirstate[f] == 'a':
2773 if repo.dirstate[f] == 'a':
2771 repo.dirstate.forget(f)
2774 repo.dirstate.forget(f)
2772 continue
2775 continue
2773 audit_path(f)
2776 audit_path(f)
2774 try:
2777 try:
2775 util.unlink(repo.wjoin(f))
2778 util.unlink(repo.wjoin(f))
2776 except OSError:
2779 except OSError:
2777 pass
2780 pass
2778 repo.dirstate.remove(f)
2781 repo.dirstate.remove(f)
2779
2782
2780 normal = None
2783 normal = None
2781 if node == parent:
2784 if node == parent:
2782 # 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
2783 # 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
2784 # merges to avoid losing information about merged/dirty files.
2787 # merges to avoid losing information about merged/dirty files.
2785 if p2 != nullid:
2788 if p2 != nullid:
2786 normal = repo.dirstate.normallookup
2789 normal = repo.dirstate.normallookup
2787 else:
2790 else:
2788 normal = repo.dirstate.normal
2791 normal = repo.dirstate.normal
2789 for f in revert[0]:
2792 for f in revert[0]:
2790 checkout(f)
2793 checkout(f)
2791 if normal:
2794 if normal:
2792 normal(f)
2795 normal(f)
2793
2796
2794 for f in add[0]:
2797 for f in add[0]:
2795 checkout(f)
2798 checkout(f)
2796 repo.dirstate.add(f)
2799 repo.dirstate.add(f)
2797
2800
2798 normal = repo.dirstate.normallookup
2801 normal = repo.dirstate.normallookup
2799 if node == parent and p2 == nullid:
2802 if node == parent and p2 == nullid:
2800 normal = repo.dirstate.normal
2803 normal = repo.dirstate.normal
2801 for f in undelete[0]:
2804 for f in undelete[0]:
2802 checkout(f)
2805 checkout(f)
2803 normal(f)
2806 normal(f)
2804
2807
2805 finally:
2808 finally:
2806 wlock.release()
2809 wlock.release()
2807
2810
2808 def rollback(ui, repo):
2811 def rollback(ui, repo):
2809 """roll back the last transaction
2812 """roll back the last transaction
2810
2813
2811 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
2812 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
2813 restore the dirstate at the time of the last transaction, losing
2816 restore the dirstate at the time of the last transaction, losing
2814 any dirstate changes since that time. This command does not alter
2817 any dirstate changes since that time. This command does not alter
2815 the working directory.
2818 the working directory.
2816
2819
2817 Transactions are used to encapsulate the effects of all commands
2820 Transactions are used to encapsulate the effects of all commands
2818 that create new changesets or propagate existing changesets into a
2821 that create new changesets or propagate existing changesets into a
2819 repository. For example, the following commands are transactional,
2822 repository. For example, the following commands are transactional,
2820 and their effects can be rolled back:
2823 and their effects can be rolled back:
2821
2824
2822 - commit
2825 - commit
2823 - import
2826 - import
2824 - pull
2827 - pull
2825 - push (with this repository as the destination)
2828 - push (with this repository as the destination)
2826 - unbundle
2829 - unbundle
2827
2830
2828 This command is not intended for use on public repositories. Once
2831 This command is not intended for use on public repositories. Once
2829 changes are visible for pull by other users, rolling a transaction
2832 changes are visible for pull by other users, rolling a transaction
2830 back locally is ineffective (someone else may already have pulled
2833 back locally is ineffective (someone else may already have pulled
2831 the changes). Furthermore, a race is possible with readers of the
2834 the changes). Furthermore, a race is possible with readers of the
2832 repository; for example an in-progress pull from the repository
2835 repository; for example an in-progress pull from the repository
2833 may fail if a rollback is performed.
2836 may fail if a rollback is performed.
2834 """
2837 """
2835 repo.rollback()
2838 repo.rollback()
2836
2839
2837 def root(ui, repo):
2840 def root(ui, repo):
2838 """print the root (top) of the current working directory
2841 """print the root (top) of the current working directory
2839
2842
2840 Print the root directory of the current repository.
2843 Print the root directory of the current repository.
2841 """
2844 """
2842 ui.write(repo.root + "\n")
2845 ui.write(repo.root + "\n")
2843
2846
2844 def serve(ui, repo, **opts):
2847 def serve(ui, repo, **opts):
2845 """export the repository via HTTP
2848 """export the repository via HTTP
2846
2849
2847 Start a local HTTP repository browser and pull server.
2850 Start a local HTTP repository browser and pull server.
2848
2851
2849 By default, the server logs accesses to stdout and errors to
2852 By default, the server logs accesses to stdout and errors to
2850 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
2851 files.
2854 files.
2852 """
2855 """
2853
2856
2854 if opts["stdio"]:
2857 if opts["stdio"]:
2855 if repo is None:
2858 if repo is None:
2856 raise error.RepoError(_("There is no Mercurial repository here"
2859 raise error.RepoError(_("There is no Mercurial repository here"
2857 " (.hg not found)"))
2860 " (.hg not found)"))
2858 s = sshserver.sshserver(ui, repo)
2861 s = sshserver.sshserver(ui, repo)
2859 s.serve_forever()
2862 s.serve_forever()
2860
2863
2861 baseui = repo and repo.baseui or ui
2864 baseui = repo and repo.baseui or ui
2862 optlist = ("name templates style address port prefix ipv6"
2865 optlist = ("name templates style address port prefix ipv6"
2863 " accesslog errorlog webdir_conf certificate encoding")
2866 " accesslog errorlog webdir_conf certificate encoding")
2864 for o in optlist.split():
2867 for o in optlist.split():
2865 if opts.get(o, None):
2868 if opts.get(o, None):
2866 baseui.setconfig("web", o, str(opts[o]))
2869 baseui.setconfig("web", o, str(opts[o]))
2867 if (repo is not None) and (repo.ui != baseui):
2870 if (repo is not None) and (repo.ui != baseui):
2868 repo.ui.setconfig("web", o, str(opts[o]))
2871 repo.ui.setconfig("web", o, str(opts[o]))
2869
2872
2870 if repo is None and not ui.config("web", "webdir_conf"):
2873 if repo is None and not ui.config("web", "webdir_conf"):
2871 raise error.RepoError(_("There is no Mercurial repository here"
2874 raise error.RepoError(_("There is no Mercurial repository here"
2872 " (.hg not found)"))
2875 " (.hg not found)"))
2873
2876
2874 class service(object):
2877 class service(object):
2875 def init(self):
2878 def init(self):
2876 util.set_signal_handler()
2879 util.set_signal_handler()
2877 self.httpd = server.create_server(baseui, repo)
2880 self.httpd = server.create_server(baseui, repo)
2878
2881
2879 if not ui.verbose:
2882 if not ui.verbose:
2880 return
2883 return
2881
2884
2882 if self.httpd.prefix:
2885 if self.httpd.prefix:
2883 prefix = self.httpd.prefix.strip('/') + '/'
2886 prefix = self.httpd.prefix.strip('/') + '/'
2884 else:
2887 else:
2885 prefix = ''
2888 prefix = ''
2886
2889
2887 port = ':%d' % self.httpd.port
2890 port = ':%d' % self.httpd.port
2888 if port == ':80':
2891 if port == ':80':
2889 port = ''
2892 port = ''
2890
2893
2891 bindaddr = self.httpd.addr
2894 bindaddr = self.httpd.addr
2892 if bindaddr == '0.0.0.0':
2895 if bindaddr == '0.0.0.0':
2893 bindaddr = '*'
2896 bindaddr = '*'
2894 elif ':' in bindaddr: # IPv6
2897 elif ':' in bindaddr: # IPv6
2895 bindaddr = '[%s]' % bindaddr
2898 bindaddr = '[%s]' % bindaddr
2896
2899
2897 fqaddr = self.httpd.fqaddr
2900 fqaddr = self.httpd.fqaddr
2898 if ':' in fqaddr:
2901 if ':' in fqaddr:
2899 fqaddr = '[%s]' % fqaddr
2902 fqaddr = '[%s]' % fqaddr
2900 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') %
2901 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2904 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2902
2905
2903 def run(self):
2906 def run(self):
2904 self.httpd.serve_forever()
2907 self.httpd.serve_forever()
2905
2908
2906 service = service()
2909 service = service()
2907
2910
2908 cmdutil.service(opts, initfn=service.init, runfn=service.run)
2911 cmdutil.service(opts, initfn=service.init, runfn=service.run)
2909
2912
2910 def status(ui, repo, *pats, **opts):
2913 def status(ui, repo, *pats, **opts):
2911 """show changed files in the working directory
2914 """show changed files in the working directory
2912
2915
2913 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
2914 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
2915 the source of a copy/move operation, are not listed unless
2918 the source of a copy/move operation, are not listed unless
2916 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
2919 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
2917 Unless options described with "show only ..." are given, the
2920 Unless options described with "show only ..." are given, the
2918 options -mardu are used.
2921 options -mardu are used.
2919
2922
2920 Option -q/--quiet hides untracked (unknown and ignored) files
2923 Option -q/--quiet hides untracked (unknown and ignored) files
2921 unless explicitly requested with -u/--unknown or -i/--ignored.
2924 unless explicitly requested with -u/--unknown or -i/--ignored.
2922
2925
2923 NOTE: status may appear to disagree with diff if permissions have
2926 NOTE: status may appear to disagree with diff if permissions have
2924 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
2925 report permission changes and diff only reports changes relative
2928 report permission changes and diff only reports changes relative
2926 to one merge parent.
2929 to one merge parent.
2927
2930
2928 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.
2929 If two revisions are given, the differences between them are
2932 If two revisions are given, the differences between them are
2930 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
2931 the changed files of a revision from its first parent.
2934 the changed files of a revision from its first parent.
2932
2935
2933 The codes used to show the status of files are::
2936 The codes used to show the status of files are::
2934
2937
2935 M = modified
2938 M = modified
2936 A = added
2939 A = added
2937 R = removed
2940 R = removed
2938 C = clean
2941 C = clean
2939 ! = missing (deleted by non-hg command, but still tracked)
2942 ! = missing (deleted by non-hg command, but still tracked)
2940 ? = not tracked
2943 ? = not tracked
2941 I = ignored
2944 I = ignored
2942 = origin of the previous file listed as A (added)
2945 = origin of the previous file listed as A (added)
2943 """
2946 """
2944
2947
2945 revs = opts.get('rev')
2948 revs = opts.get('rev')
2946 change = opts.get('change')
2949 change = opts.get('change')
2947
2950
2948 if revs and change:
2951 if revs and change:
2949 msg = _('cannot specify --rev and --change at the same time')
2952 msg = _('cannot specify --rev and --change at the same time')
2950 raise util.Abort(msg)
2953 raise util.Abort(msg)
2951 elif change:
2954 elif change:
2952 node2 = repo.lookup(change)
2955 node2 = repo.lookup(change)
2953 node1 = repo[node2].parents()[0].node()
2956 node1 = repo[node2].parents()[0].node()
2954 else:
2957 else:
2955 node1, node2 = cmdutil.revpair(repo, revs)
2958 node1, node2 = cmdutil.revpair(repo, revs)
2956
2959
2957 cwd = (pats and repo.getcwd()) or ''
2960 cwd = (pats and repo.getcwd()) or ''
2958 end = opts.get('print0') and '\0' or '\n'
2961 end = opts.get('print0') and '\0' or '\n'
2959 copy = {}
2962 copy = {}
2960 states = 'modified added removed deleted unknown ignored clean'.split()
2963 states = 'modified added removed deleted unknown ignored clean'.split()
2961 show = [k for k in states if opts.get(k)]
2964 show = [k for k in states if opts.get(k)]
2962 if opts.get('all'):
2965 if opts.get('all'):
2963 show += ui.quiet and (states[:4] + ['clean']) or states
2966 show += ui.quiet and (states[:4] + ['clean']) or states
2964 if not show:
2967 if not show:
2965 show = ui.quiet and states[:4] or states[:5]
2968 show = ui.quiet and states[:4] or states[:5]
2966
2969
2967 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
2970 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
2968 'ignored' in show, 'clean' in show, 'unknown' in show)
2971 'ignored' in show, 'clean' in show, 'unknown' in show)
2969 changestates = zip(states, 'MAR!?IC', stat)
2972 changestates = zip(states, 'MAR!?IC', stat)
2970
2973
2971 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'):
2972 ctxn = repo[nullid]
2975 ctxn = repo[nullid]
2973 ctx1 = repo[node1]
2976 ctx1 = repo[node1]
2974 ctx2 = repo[node2]
2977 ctx2 = repo[node2]
2975 added = stat[1]
2978 added = stat[1]
2976 if node2 is None:
2979 if node2 is None:
2977 added = stat[0] + stat[1] # merged?
2980 added = stat[0] + stat[1] # merged?
2978
2981
2979 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():
2980 if k in added:
2983 if k in added:
2981 copy[k] = v
2984 copy[k] = v
2982 elif v in added:
2985 elif v in added:
2983 copy[v] = k
2986 copy[v] = k
2984
2987
2985 for state, char, files in changestates:
2988 for state, char, files in changestates:
2986 if state in show:
2989 if state in show:
2987 format = "%s %%s%s" % (char, end)
2990 format = "%s %%s%s" % (char, end)
2988 if opts.get('no_status'):
2991 if opts.get('no_status'):
2989 format = "%%s%s" % end
2992 format = "%%s%s" % end
2990
2993
2991 for f in files:
2994 for f in files:
2992 ui.write(format % repo.pathto(f, cwd))
2995 ui.write(format % repo.pathto(f, cwd))
2993 if f in copy:
2996 if f in copy:
2994 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end))
2997 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end))
2995
2998
2996 def summary(ui, repo, **opts):
2999 def summary(ui, repo, **opts):
2997 """summarize working directory state
3000 """summarize working directory state
2998
3001
2999 This generates a brief summary of the working directory state,
3002 This generates a brief summary of the working directory state,
3000 including parents, branch, commit status, and available updates.
3003 including parents, branch, commit status, and available updates.
3001
3004
3002 With the --remote option, this will check the default paths for
3005 With the --remote option, this will check the default paths for
3003 incoming and outgoing changes. This can be time-consuming.
3006 incoming and outgoing changes. This can be time-consuming.
3004 """
3007 """
3005
3008
3006 ctx = repo[None]
3009 ctx = repo[None]
3007 parents = ctx.parents()
3010 parents = ctx.parents()
3008 pnode = parents[0].node()
3011 pnode = parents[0].node()
3009 tags = repo.tags()
3012 tags = repo.tags()
3010
3013
3011 for p in parents:
3014 for p in parents:
3012 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()])
3013 if p.rev() == -1:
3016 if p.rev() == -1:
3014 if not len(repo):
3017 if not len(repo):
3015 t += _(' (empty repository)')
3018 t += _(' (empty repository)')
3016 else:
3019 else:
3017 t += _(' (no revision checked out)')
3020 t += _(' (no revision checked out)')
3018 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))
3019 if p.description():
3022 if p.description():
3020 ui.status(' ' + p.description().splitlines()[0].strip() + '\n')
3023 ui.status(' ' + p.description().splitlines()[0].strip() + '\n')
3021
3024
3022 branch = ctx.branch()
3025 branch = ctx.branch()
3023 bheads = repo.branchheads(branch)
3026 bheads = repo.branchheads(branch)
3024 m = _('branch: %s\n') % branch
3027 m = _('branch: %s\n') % branch
3025 if branch != 'default':
3028 if branch != 'default':
3026 ui.write(m)
3029 ui.write(m)
3027 else:
3030 else:
3028 ui.status(m)
3031 ui.status(m)
3029
3032
3030 st = list(repo.status(unknown=True))[:6]
3033 st = list(repo.status(unknown=True))[:6]
3031 ms = merge_.mergestate(repo)
3034 ms = merge_.mergestate(repo)
3032 st.append([f for f in ms if ms[f] == 'u'])
3035 st.append([f for f in ms if ms[f] == 'u'])
3033 labels = [_('%d modified'), _('%d added'), _('%d removed'),
3036 labels = [_('%d modified'), _('%d added'), _('%d removed'),
3034 _('%d deleted'), _('%d unknown'), _('%d ignored'),
3037 _('%d deleted'), _('%d unknown'), _('%d ignored'),
3035 _('%d unresolved')]
3038 _('%d unresolved')]
3036 t = []
3039 t = []
3037 for s, l in zip(st, labels):
3040 for s, l in zip(st, labels):
3038 if s:
3041 if s:
3039 t.append(l % len(s))
3042 t.append(l % len(s))
3040
3043
3041 t = ', '.join(t)
3044 t = ', '.join(t)
3042 cleanworkdir = False
3045 cleanworkdir = False
3043
3046
3044 if len(parents) > 1:
3047 if len(parents) > 1:
3045 t += _(' (merge)')
3048 t += _(' (merge)')
3046 elif branch != parents[0].branch():
3049 elif branch != parents[0].branch():
3047 t += _(' (new branch)')
3050 t += _(' (new branch)')
3048 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]):
3049 t += _(' (clean)')
3052 t += _(' (clean)')
3050 cleanworkdir = True
3053 cleanworkdir = True
3051 elif pnode not in bheads:
3054 elif pnode not in bheads:
3052 t += _(' (new branch head)')
3055 t += _(' (new branch head)')
3053
3056
3054 if cleanworkdir:
3057 if cleanworkdir:
3055 ui.status(_('commit: %s\n') % t.strip())
3058 ui.status(_('commit: %s\n') % t.strip())
3056 else:
3059 else:
3057 ui.write(_('commit: %s\n') % t.strip())
3060 ui.write(_('commit: %s\n') % t.strip())
3058
3061
3059 # all ancestors of branch heads - all ancestors of parent = new csets
3062 # all ancestors of branch heads - all ancestors of parent = new csets
3060 new = [0] * len(repo)
3063 new = [0] * len(repo)
3061 cl = repo.changelog
3064 cl = repo.changelog
3062 for a in [cl.rev(n) for n in bheads]:
3065 for a in [cl.rev(n) for n in bheads]:
3063 new[a] = 1
3066 new[a] = 1
3064 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]):
3065 new[a] = 1
3068 new[a] = 1
3066 for a in [p.rev() for p in parents]:
3069 for a in [p.rev() for p in parents]:
3067 if a >= 0:
3070 if a >= 0:
3068 new[a] = 0
3071 new[a] = 0
3069 for a in cl.ancestors(*[p.rev() for p in parents]):
3072 for a in cl.ancestors(*[p.rev() for p in parents]):
3070 new[a] = 0
3073 new[a] = 0
3071 new = sum(new)
3074 new = sum(new)
3072
3075
3073 if new == 0:
3076 if new == 0:
3074 ui.status(_('update: (current)\n'))
3077 ui.status(_('update: (current)\n'))
3075 elif pnode not in bheads:
3078 elif pnode not in bheads:
3076 ui.write(_('update: %d new changesets (update)\n') % new)
3079 ui.write(_('update: %d new changesets (update)\n') % new)
3077 else:
3080 else:
3078 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3081 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3079 (new, len(bheads)))
3082 (new, len(bheads)))
3080
3083
3081 if opts.get('remote'):
3084 if opts.get('remote'):
3082 t = []
3085 t = []
3083 source, branches = hg.parseurl(ui.expandpath('default'))
3086 source, branches = hg.parseurl(ui.expandpath('default'))
3084 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3087 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3085 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
3088 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
3086 ui.debug('comparing with %s\n' % url.hidepassword(source))
3089 ui.debug('comparing with %s\n' % url.hidepassword(source))
3087 repo.ui.pushbuffer()
3090 repo.ui.pushbuffer()
3088 common, incoming, rheads = repo.findcommonincoming(other)
3091 common, incoming, rheads = repo.findcommonincoming(other)
3089 repo.ui.popbuffer()
3092 repo.ui.popbuffer()
3090 if incoming:
3093 if incoming:
3091 t.append(_('1 or more incoming'))
3094 t.append(_('1 or more incoming'))
3092
3095
3093 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
3096 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
3094 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
3097 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
3095 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3098 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3096 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3099 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3097 repo.ui.pushbuffer()
3100 repo.ui.pushbuffer()
3098 o = repo.findoutgoing(other)
3101 o = repo.findoutgoing(other)
3099 repo.ui.popbuffer()
3102 repo.ui.popbuffer()
3100 o = repo.changelog.nodesbetween(o, None)[0]
3103 o = repo.changelog.nodesbetween(o, None)[0]
3101 if o:
3104 if o:
3102 t.append(_('%d outgoing') % len(o))
3105 t.append(_('%d outgoing') % len(o))
3103
3106
3104 if t:
3107 if t:
3105 ui.write(_('remote: %s\n') % (', '.join(t)))
3108 ui.write(_('remote: %s\n') % (', '.join(t)))
3106 else:
3109 else:
3107 ui.status(_('remote: (synced)\n'))
3110 ui.status(_('remote: (synced)\n'))
3108
3111
3109 def tag(ui, repo, name1, *names, **opts):
3112 def tag(ui, repo, name1, *names, **opts):
3110 """add one or more tags for the current or given revision
3113 """add one or more tags for the current or given revision
3111
3114
3112 Name a particular revision using <name>.
3115 Name a particular revision using <name>.
3113
3116
3114 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
3115 very useful to compare different revisions, to go back to significant
3118 very useful to compare different revisions, to go back to significant
3116 earlier versions or to mark branch points as releases, etc.
3119 earlier versions or to mark branch points as releases, etc.
3117
3120
3118 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
3119 used, or tip if no revision is checked out.
3122 used, or tip if no revision is checked out.
3120
3123
3121 To facilitate version control, distribution, and merging of tags,
3124 To facilitate version control, distribution, and merging of tags,
3122 they are stored as a file named ".hgtags" which is managed
3125 they are stored as a file named ".hgtags" which is managed
3123 similarly to other project files and can be hand-edited if
3126 similarly to other project files and can be hand-edited if
3124 necessary. The file '.hg/localtags' is used for local tags (not
3127 necessary. The file '.hg/localtags' is used for local tags (not
3125 shared among repositories).
3128 shared among repositories).
3126
3129
3127 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.
3128 """
3131 """
3129
3132
3130 rev_ = "."
3133 rev_ = "."
3131 names = (name1,) + names
3134 names = (name1,) + names
3132 if len(names) != len(set(names)):
3135 if len(names) != len(set(names)):
3133 raise util.Abort(_('tag names must be unique'))
3136 raise util.Abort(_('tag names must be unique'))
3134 for n in names:
3137 for n in names:
3135 if n in ['tip', '.', 'null']:
3138 if n in ['tip', '.', 'null']:
3136 raise util.Abort(_('the name \'%s\' is reserved') % n)
3139 raise util.Abort(_('the name \'%s\' is reserved') % n)
3137 if opts.get('rev') and opts.get('remove'):
3140 if opts.get('rev') and opts.get('remove'):
3138 raise util.Abort(_("--rev and --remove are incompatible"))
3141 raise util.Abort(_("--rev and --remove are incompatible"))
3139 if opts.get('rev'):
3142 if opts.get('rev'):
3140 rev_ = opts['rev']
3143 rev_ = opts['rev']
3141 message = opts.get('message')
3144 message = opts.get('message')
3142 if opts.get('remove'):
3145 if opts.get('remove'):
3143 expectedtype = opts.get('local') and 'local' or 'global'
3146 expectedtype = opts.get('local') and 'local' or 'global'
3144 for n in names:
3147 for n in names:
3145 if not repo.tagtype(n):
3148 if not repo.tagtype(n):
3146 raise util.Abort(_('tag \'%s\' does not exist') % n)
3149 raise util.Abort(_('tag \'%s\' does not exist') % n)
3147 if repo.tagtype(n) != expectedtype:
3150 if repo.tagtype(n) != expectedtype:
3148 if expectedtype == 'global':
3151 if expectedtype == 'global':
3149 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3152 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3150 else:
3153 else:
3151 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3154 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3152 rev_ = nullid
3155 rev_ = nullid
3153 if not message:
3156 if not message:
3154 # we don't translate commit messages
3157 # we don't translate commit messages
3155 message = 'Removed tag %s' % ', '.join(names)
3158 message = 'Removed tag %s' % ', '.join(names)
3156 elif not opts.get('force'):
3159 elif not opts.get('force'):
3157 for n in names:
3160 for n in names:
3158 if n in repo.tags():
3161 if n in repo.tags():
3159 raise util.Abort(_('tag \'%s\' already exists '
3162 raise util.Abort(_('tag \'%s\' already exists '
3160 '(use -f to force)') % n)
3163 '(use -f to force)') % n)
3161 if not rev_ and repo.dirstate.parents()[1] != nullid:
3164 if not rev_ and repo.dirstate.parents()[1] != nullid:
3162 raise util.Abort(_('uncommitted merge - please provide a '
3165 raise util.Abort(_('uncommitted merge - please provide a '
3163 'specific revision'))
3166 'specific revision'))
3164 r = repo[rev_].node()
3167 r = repo[rev_].node()
3165
3168
3166 if not message:
3169 if not message:
3167 # we don't translate commit messages
3170 # we don't translate commit messages
3168 message = ('Added tag %s for changeset %s' %
3171 message = ('Added tag %s for changeset %s' %
3169 (', '.join(names), short(r)))
3172 (', '.join(names), short(r)))
3170
3173
3171 date = opts.get('date')
3174 date = opts.get('date')
3172 if date:
3175 if date:
3173 date = util.parsedate(date)
3176 date = util.parsedate(date)
3174
3177
3175 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)
3176
3179
3177 def tags(ui, repo):
3180 def tags(ui, repo):
3178 """list repository tags
3181 """list repository tags
3179
3182
3180 This lists both regular and local tags. When the -v/--verbose
3183 This lists both regular and local tags. When the -v/--verbose
3181 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.
3182 """
3185 """
3183
3186
3184 hexfunc = ui.debugflag and hex or short
3187 hexfunc = ui.debugflag and hex or short
3185 tagtype = ""
3188 tagtype = ""
3186
3189
3187 for t, n in reversed(repo.tagslist()):
3190 for t, n in reversed(repo.tagslist()):
3188 if ui.quiet:
3191 if ui.quiet:
3189 ui.write("%s\n" % t)
3192 ui.write("%s\n" % t)
3190 continue
3193 continue
3191
3194
3192 try:
3195 try:
3193 hn = hexfunc(n)
3196 hn = hexfunc(n)
3194 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3197 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3195 except error.LookupError:
3198 except error.LookupError:
3196 r = " ?:%s" % hn
3199 r = " ?:%s" % hn
3197 else:
3200 else:
3198 spaces = " " * (30 - encoding.colwidth(t))
3201 spaces = " " * (30 - encoding.colwidth(t))
3199 if ui.verbose:
3202 if ui.verbose:
3200 if repo.tagtype(t) == 'local':
3203 if repo.tagtype(t) == 'local':
3201 tagtype = " local"
3204 tagtype = " local"
3202 else:
3205 else:
3203 tagtype = ""
3206 tagtype = ""
3204 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3207 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3205
3208
3206 def tip(ui, repo, **opts):
3209 def tip(ui, repo, **opts):
3207 """show the tip revision
3210 """show the tip revision
3208
3211
3209 The tip revision (usually just called the tip) is the changeset
3212 The tip revision (usually just called the tip) is the changeset
3210 most recently added to the repository (and therefore the most
3213 most recently added to the repository (and therefore the most
3211 recently changed head).
3214 recently changed head).
3212
3215
3213 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
3214 you have just pulled changes from another repository, the tip of
3217 you have just pulled changes from another repository, the tip of
3215 that repository becomes the current tip. The "tip" tag is special
3218 that repository becomes the current tip. The "tip" tag is special
3216 and cannot be renamed or assigned to a different changeset.
3219 and cannot be renamed or assigned to a different changeset.
3217 """
3220 """
3218 displayer = cmdutil.show_changeset(ui, repo, opts)
3221 displayer = cmdutil.show_changeset(ui, repo, opts)
3219 displayer.show(repo[len(repo) - 1])
3222 displayer.show(repo[len(repo) - 1])
3220 displayer.close()
3223 displayer.close()
3221
3224
3222 def unbundle(ui, repo, fname1, *fnames, **opts):
3225 def unbundle(ui, repo, fname1, *fnames, **opts):
3223 """apply one or more changegroup files
3226 """apply one or more changegroup files
3224
3227
3225 Apply one or more compressed changegroup files generated by the
3228 Apply one or more compressed changegroup files generated by the
3226 bundle command.
3229 bundle command.
3227 """
3230 """
3228 fnames = (fname1,) + fnames
3231 fnames = (fname1,) + fnames
3229
3232
3230 lock = repo.lock()
3233 lock = repo.lock()
3231 try:
3234 try:
3232 for fname in fnames:
3235 for fname in fnames:
3233 f = url.open(ui, fname)
3236 f = url.open(ui, fname)
3234 gen = changegroup.readbundle(f, fname)
3237 gen = changegroup.readbundle(f, fname)
3235 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3238 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3236 finally:
3239 finally:
3237 lock.release()
3240 lock.release()
3238
3241
3239 return postincoming(ui, repo, modheads, opts.get('update'), None)
3242 return postincoming(ui, repo, modheads, opts.get('update'), None)
3240
3243
3241 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):
3242 """update working directory
3245 """update working directory
3243
3246
3244 Update the repository's working directory to the specified
3247 Update the repository's working directory to the specified
3245 changeset.
3248 changeset.
3246
3249
3247 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
3248 current branch. If this head is a descendant of the working
3251 current branch. If this head is a descendant of the working
3249 directory's parent, update to it, otherwise abort.
3252 directory's parent, update to it, otherwise abort.
3250
3253
3251 The following rules apply when the working directory contains
3254 The following rules apply when the working directory contains
3252 uncommitted changes:
3255 uncommitted changes:
3253
3256
3254 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
3255 the requested changeset is an ancestor or descendant of
3258 the requested changeset is an ancestor or descendant of
3256 the working directory's parent, the uncommitted changes
3259 the working directory's parent, the uncommitted changes
3257 are merged into the requested changeset and the merged
3260 are merged into the requested changeset and the merged
3258 result is left uncommitted. If the requested changeset is
3261 result is left uncommitted. If the requested changeset is
3259 not an ancestor or descendant (that is, it is on another
3262 not an ancestor or descendant (that is, it is on another
3260 branch), the update is aborted and the uncommitted changes
3263 branch), the update is aborted and the uncommitted changes
3261 are preserved.
3264 are preserved.
3262
3265
3263 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
3264 uncommitted changes are preserved.
3267 uncommitted changes are preserved.
3265
3268
3266 3. With the -C/--clean option, uncommitted changes are discarded and
3269 3. With the -C/--clean option, uncommitted changes are discarded and
3267 the working directory is updated to the requested changeset.
3270 the working directory is updated to the requested changeset.
3268
3271
3269 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
3270 clone -U').
3273 clone -U').
3271
3274
3272 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'.
3273
3276
3274 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.
3275 """
3278 """
3276 if rev and node:
3279 if rev and node:
3277 raise util.Abort(_("please specify just one revision"))
3280 raise util.Abort(_("please specify just one revision"))
3278
3281
3279 if not rev:
3282 if not rev:
3280 rev = node
3283 rev = node
3281
3284
3282 if check and clean:
3285 if check and clean:
3283 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3286 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3284
3287
3285 if check:
3288 if check:
3286 # 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
3287 c = repo[None]
3290 c = repo[None]
3288 if c.modified() or c.added() or c.removed():
3291 if c.modified() or c.added() or c.removed():
3289 raise util.Abort(_("uncommitted local changes"))
3292 raise util.Abort(_("uncommitted local changes"))
3290
3293
3291 if date:
3294 if date:
3292 if rev:
3295 if rev:
3293 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"))
3294 rev = cmdutil.finddate(ui, repo, date)
3297 rev = cmdutil.finddate(ui, repo, date)
3295
3298
3296 if clean or check:
3299 if clean or check:
3297 return hg.clean(repo, rev)
3300 return hg.clean(repo, rev)
3298 else:
3301 else:
3299 return hg.update(repo, rev)
3302 return hg.update(repo, rev)
3300
3303
3301 def verify(ui, repo):
3304 def verify(ui, repo):
3302 """verify the integrity of the repository
3305 """verify the integrity of the repository
3303
3306
3304 Verify the integrity of the current repository.
3307 Verify the integrity of the current repository.
3305
3308
3306 This will perform an extensive check of the repository's
3309 This will perform an extensive check of the repository's
3307 integrity, validating the hashes and checksums of each entry in
3310 integrity, validating the hashes and checksums of each entry in
3308 the changelog, manifest, and tracked files, as well as the
3311 the changelog, manifest, and tracked files, as well as the
3309 integrity of their crosslinks and indices.
3312 integrity of their crosslinks and indices.
3310 """
3313 """
3311 return hg.verify(repo)
3314 return hg.verify(repo)
3312
3315
3313 def version_(ui):
3316 def version_(ui):
3314 """output version and copyright information"""
3317 """output version and copyright information"""
3315 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3318 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3316 % util.version())
3319 % util.version())
3317 ui.status(_(
3320 ui.status(_(
3318 "\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"
3319 "This is free software; see the source for copying conditions. "
3322 "This is free software; see the source for copying conditions. "
3320 "There is NO\nwarranty; "
3323 "There is NO\nwarranty; "
3321 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3324 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3322 ))
3325 ))
3323
3326
3324 # Command options and aliases are listed here, alphabetically
3327 # Command options and aliases are listed here, alphabetically
3325
3328
3326 globalopts = [
3329 globalopts = [
3327 ('R', 'repository', '',
3330 ('R', 'repository', '',
3328 _('repository root directory or name of overlay bundle file')),
3331 _('repository root directory or name of overlay bundle file')),
3329 ('', 'cwd', '', _('change working directory')),
3332 ('', 'cwd', '', _('change working directory')),
3330 ('y', 'noninteractive', None,
3333 ('y', 'noninteractive', None,
3331 _('do not prompt, assume \'yes\' for any required answers')),
3334 _('do not prompt, assume \'yes\' for any required answers')),
3332 ('q', 'quiet', None, _('suppress output')),
3335 ('q', 'quiet', None, _('suppress output')),
3333 ('v', 'verbose', None, _('enable additional output')),
3336 ('v', 'verbose', None, _('enable additional output')),
3334 ('', 'config', [], _('set/override config option')),
3337 ('', 'config', [], _('set/override config option')),
3335 ('', 'debug', None, _('enable debugging output')),
3338 ('', 'debug', None, _('enable debugging output')),
3336 ('', 'debugger', None, _('start debugger')),
3339 ('', 'debugger', None, _('start debugger')),
3337 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3340 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3338 ('', 'encodingmode', encoding.encodingmode,
3341 ('', 'encodingmode', encoding.encodingmode,
3339 _('set the charset encoding mode')),
3342 _('set the charset encoding mode')),
3340 ('', 'traceback', None, _('always print a traceback on exception')),
3343 ('', 'traceback', None, _('always print a traceback on exception')),
3341 ('', 'time', None, _('time how long the command takes')),
3344 ('', 'time', None, _('time how long the command takes')),
3342 ('', 'profile', None, _('print command execution profile')),
3345 ('', 'profile', None, _('print command execution profile')),
3343 ('', 'version', None, _('output version information and exit')),
3346 ('', 'version', None, _('output version information and exit')),
3344 ('h', 'help', None, _('display help and exit')),
3347 ('h', 'help', None, _('display help and exit')),
3345 ]
3348 ]
3346
3349
3347 dryrunopts = [('n', 'dry-run', None,
3350 dryrunopts = [('n', 'dry-run', None,
3348 _('do not perform actions, just print output'))]
3351 _('do not perform actions, just print output'))]
3349
3352
3350 remoteopts = [
3353 remoteopts = [
3351 ('e', 'ssh', '', _('specify ssh command to use')),
3354 ('e', 'ssh', '', _('specify ssh command to use')),
3352 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3355 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3353 ]
3356 ]
3354
3357
3355 walkopts = [
3358 walkopts = [
3356 ('I', 'include', [], _('include names matching the given patterns')),
3359 ('I', 'include', [], _('include names matching the given patterns')),
3357 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3360 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3358 ]
3361 ]
3359
3362
3360 commitopts = [
3363 commitopts = [
3361 ('m', 'message', '', _('use <text> as commit message')),
3364 ('m', 'message', '', _('use <text> as commit message')),
3362 ('l', 'logfile', '', _('read commit message from <file>')),
3365 ('l', 'logfile', '', _('read commit message from <file>')),
3363 ]
3366 ]
3364
3367
3365 commitopts2 = [
3368 commitopts2 = [
3366 ('d', 'date', '', _('record datecode as commit date')),
3369 ('d', 'date', '', _('record datecode as commit date')),
3367 ('u', 'user', '', _('record the specified user as committer')),
3370 ('u', 'user', '', _('record the specified user as committer')),
3368 ]
3371 ]
3369
3372
3370 templateopts = [
3373 templateopts = [
3371 ('', 'style', '', _('display using template map file')),
3374 ('', 'style', '', _('display using template map file')),
3372 ('', 'template', '', _('display with template')),
3375 ('', 'template', '', _('display with template')),
3373 ]
3376 ]
3374
3377
3375 logopts = [
3378 logopts = [
3376 ('p', 'patch', None, _('show patch')),
3379 ('p', 'patch', None, _('show patch')),
3377 ('g', 'git', None, _('use git extended diff format')),
3380 ('g', 'git', None, _('use git extended diff format')),
3378 ('l', 'limit', '', _('limit number of changes displayed')),
3381 ('l', 'limit', '', _('limit number of changes displayed')),
3379 ('M', 'no-merges', None, _('do not show merges')),
3382 ('M', 'no-merges', None, _('do not show merges')),
3380 ] + templateopts
3383 ] + templateopts
3381
3384
3382 diffopts = [
3385 diffopts = [
3383 ('a', 'text', None, _('treat all files as text')),
3386 ('a', 'text', None, _('treat all files as text')),
3384 ('g', 'git', None, _('use git extended diff format')),
3387 ('g', 'git', None, _('use git extended diff format')),
3385 ('', 'nodates', None, _('omit dates from diff headers'))
3388 ('', 'nodates', None, _('omit dates from diff headers'))
3386 ]
3389 ]
3387
3390
3388 diffopts2 = [
3391 diffopts2 = [
3389 ('p', 'show-function', None, _('show which function each change is in')),
3392 ('p', 'show-function', None, _('show which function each change is in')),
3390 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3393 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3391 ('w', 'ignore-all-space', None,
3394 ('w', 'ignore-all-space', None,
3392 _('ignore white space when comparing lines')),
3395 _('ignore white space when comparing lines')),
3393 ('b', 'ignore-space-change', None,
3396 ('b', 'ignore-space-change', None,
3394 _('ignore changes in the amount of white space')),
3397 _('ignore changes in the amount of white space')),
3395 ('B', 'ignore-blank-lines', None,
3398 ('B', 'ignore-blank-lines', None,
3396 _('ignore changes whose lines are all blank')),
3399 _('ignore changes whose lines are all blank')),
3397 ('U', 'unified', '', _('number of lines of context to show')),
3400 ('U', 'unified', '', _('number of lines of context to show')),
3398 ('', 'stat', None, _('output diffstat-style summary of changes')),
3401 ('', 'stat', None, _('output diffstat-style summary of changes')),
3399 ]
3402 ]
3400
3403
3401 similarityopts = [
3404 similarityopts = [
3402 ('s', 'similarity', '',
3405 ('s', 'similarity', '',
3403 _('guess renamed files by similarity (0<=s<=100)'))
3406 _('guess renamed files by similarity (0<=s<=100)'))
3404 ]
3407 ]
3405
3408
3406 table = {
3409 table = {
3407 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3410 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3408 "addremove":
3411 "addremove":
3409 (addremove, similarityopts + walkopts + dryrunopts,
3412 (addremove, similarityopts + walkopts + dryrunopts,
3410 _('[OPTION]... [FILE]...')),
3413 _('[OPTION]... [FILE]...')),
3411 "^annotate|blame":
3414 "^annotate|blame":
3412 (annotate,
3415 (annotate,
3413 [('r', 'rev', '', _('annotate the specified revision')),
3416 [('r', 'rev', '', _('annotate the specified revision')),
3414 ('', 'follow', None, _('follow copies and renames (DEPRECATED)')),
3417 ('', 'follow', None, _('follow copies and renames (DEPRECATED)')),
3415 ('', 'no-follow', None, _("don't follow copies and renames")),
3418 ('', 'no-follow', None, _("don't follow copies and renames")),
3416 ('a', 'text', None, _('treat all files as text')),
3419 ('a', 'text', None, _('treat all files as text')),
3417 ('u', 'user', None, _('list the author (long with -v)')),
3420 ('u', 'user', None, _('list the author (long with -v)')),
3418 ('f', 'file', None, _('list the filename')),
3421 ('f', 'file', None, _('list the filename')),
3419 ('d', 'date', None, _('list the date (short with -q)')),
3422 ('d', 'date', None, _('list the date (short with -q)')),
3420 ('n', 'number', None, _('list the revision number (default)')),
3423 ('n', 'number', None, _('list the revision number (default)')),
3421 ('c', 'changeset', None, _('list the changeset')),
3424 ('c', 'changeset', None, _('list the changeset')),
3422 ('l', 'line-number', None,
3425 ('l', 'line-number', None,
3423 _('show line number at the first appearance'))
3426 _('show line number at the first appearance'))
3424 ] + walkopts,
3427 ] + walkopts,
3425 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3428 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3426 "archive":
3429 "archive":
3427 (archive,
3430 (archive,
3428 [('', 'no-decode', None, _('do not pass files through decoders')),
3431 [('', 'no-decode', None, _('do not pass files through decoders')),
3429 ('p', 'prefix', '', _('directory prefix for files in archive')),
3432 ('p', 'prefix', '', _('directory prefix for files in archive')),
3430 ('r', 'rev', '', _('revision to distribute')),
3433 ('r', 'rev', '', _('revision to distribute')),
3431 ('t', 'type', '', _('type of distribution to create')),
3434 ('t', 'type', '', _('type of distribution to create')),
3432 ] + walkopts,
3435 ] + walkopts,
3433 _('[OPTION]... DEST')),
3436 _('[OPTION]... DEST')),
3434 "backout":
3437 "backout":
3435 (backout,
3438 (backout,
3436 [('', 'merge', None,
3439 [('', 'merge', None,
3437 _('merge with old dirstate parent after backout')),
3440 _('merge with old dirstate parent after backout')),
3438 ('', 'parent', '', _('parent to choose when backing out merge')),
3441 ('', 'parent', '', _('parent to choose when backing out merge')),
3439 ('r', 'rev', '', _('revision to backout')),
3442 ('r', 'rev', '', _('revision to backout')),
3440 ] + walkopts + commitopts + commitopts2,
3443 ] + walkopts + commitopts + commitopts2,
3441 _('[OPTION]... [-r] REV')),
3444 _('[OPTION]... [-r] REV')),
3442 "bisect":
3445 "bisect":
3443 (bisect,
3446 (bisect,
3444 [('r', 'reset', False, _('reset bisect state')),
3447 [('r', 'reset', False, _('reset bisect state')),
3445 ('g', 'good', False, _('mark changeset good')),
3448 ('g', 'good', False, _('mark changeset good')),
3446 ('b', 'bad', False, _('mark changeset bad')),
3449 ('b', 'bad', False, _('mark changeset bad')),
3447 ('s', 'skip', False, _('skip testing changeset')),
3450 ('s', 'skip', False, _('skip testing changeset')),
3448 ('c', 'command', '', _('use command to check changeset state')),
3451 ('c', 'command', '', _('use command to check changeset state')),
3449 ('U', 'noupdate', False, _('do not update to target'))],
3452 ('U', 'noupdate', False, _('do not update to target'))],
3450 _("[-gbsr] [-U] [-c CMD] [REV]")),
3453 _("[-gbsr] [-U] [-c CMD] [REV]")),
3451 "branch":
3454 "branch":
3452 (branch,
3455 (branch,
3453 [('f', 'force', None,
3456 [('f', 'force', None,
3454 _('set branch name even if it shadows an existing branch')),
3457 _('set branch name even if it shadows an existing branch')),
3455 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3458 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3456 _('[-fC] [NAME]')),
3459 _('[-fC] [NAME]')),
3457 "branches":
3460 "branches":
3458 (branches,
3461 (branches,
3459 [('a', 'active', False,
3462 [('a', 'active', False,
3460 _('show only branches that have unmerged heads')),
3463 _('show only branches that have unmerged heads')),
3461 ('c', 'closed', False,
3464 ('c', 'closed', False,
3462 _('show normal and closed branches'))],
3465 _('show normal and closed branches'))],
3463 _('[-ac]')),
3466 _('[-ac]')),
3464 "bundle":
3467 "bundle":
3465 (bundle,
3468 (bundle,
3466 [('f', 'force', None,
3469 [('f', 'force', None,
3467 _('run even when the destination is unrelated')),
3470 _('run even when the destination is unrelated')),
3468 ('r', 'rev', [],
3471 ('r', 'rev', [],
3469 _('a changeset intended to be added to the destination')),
3472 _('a changeset intended to be added to the destination')),
3470 ('b', 'branch', [],
3473 ('b', 'branch', [],
3471 _('a specific branch you would like to bundle')),
3474 _('a specific branch you would like to bundle')),
3472 ('', 'base', [],
3475 ('', 'base', [],
3473 _('a base changeset assumed to be available at the destination')),
3476 _('a base changeset assumed to be available at the destination')),
3474 ('a', 'all', None, _('bundle all changesets in the repository')),
3477 ('a', 'all', None, _('bundle all changesets in the repository')),
3475 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3478 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3476 ] + remoteopts,
3479 ] + remoteopts,
3477 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3480 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3478 "cat":
3481 "cat":
3479 (cat,
3482 (cat,
3480 [('o', 'output', '', _('print output to file with formatted name')),
3483 [('o', 'output', '', _('print output to file with formatted name')),
3481 ('r', 'rev', '', _('print the given revision')),
3484 ('r', 'rev', '', _('print the given revision')),
3482 ('', 'decode', None, _('apply any matching decode filter')),
3485 ('', 'decode', None, _('apply any matching decode filter')),
3483 ] + walkopts,
3486 ] + walkopts,
3484 _('[OPTION]... FILE...')),
3487 _('[OPTION]... FILE...')),
3485 "^clone":
3488 "^clone":
3486 (clone,
3489 (clone,
3487 [('U', 'noupdate', None,
3490 [('U', 'noupdate', None,
3488 _('the clone will include an empty working copy (only a repository)')),
3491 _('the clone will include an empty working copy (only a repository)')),
3489 ('u', 'updaterev', '',
3492 ('u', 'updaterev', '',
3490 _('revision, tag or branch to check out')),
3493 _('revision, tag or branch to check out')),
3491 ('r', 'rev', [],
3494 ('r', 'rev', [],
3492 _('include the specified changeset')),
3495 _('include the specified changeset')),
3493 ('b', 'branch', [],
3496 ('b', 'branch', [],
3494 _('clone only the specified branch')),
3497 _('clone only the specified branch')),
3495 ('', 'pull', None, _('use pull protocol to copy metadata')),
3498 ('', 'pull', None, _('use pull protocol to copy metadata')),
3496 ('', 'uncompressed', None,
3499 ('', 'uncompressed', None,
3497 _('use uncompressed transfer (fast over LAN)')),
3500 _('use uncompressed transfer (fast over LAN)')),
3498 ] + remoteopts,
3501 ] + remoteopts,
3499 _('[OPTION]... SOURCE [DEST]')),
3502 _('[OPTION]... SOURCE [DEST]')),
3500 "^commit|ci":
3503 "^commit|ci":
3501 (commit,
3504 (commit,
3502 [('A', 'addremove', None,
3505 [('A', 'addremove', None,
3503 _('mark new/missing files as added/removed before committing')),
3506 _('mark new/missing files as added/removed before committing')),
3504 ('', 'close-branch', None,
3507 ('', 'close-branch', None,
3505 _('mark a branch as closed, hiding it from the branch list')),
3508 _('mark a branch as closed, hiding it from the branch list')),
3506 ] + walkopts + commitopts + commitopts2,
3509 ] + walkopts + commitopts + commitopts2,
3507 _('[OPTION]... [FILE]...')),
3510 _('[OPTION]... [FILE]...')),
3508 "copy|cp":
3511 "copy|cp":
3509 (copy,
3512 (copy,
3510 [('A', 'after', None, _('record a copy that has already occurred')),
3513 [('A', 'after', None, _('record a copy that has already occurred')),
3511 ('f', 'force', None,
3514 ('f', 'force', None,
3512 _('forcibly copy over an existing managed file')),
3515 _('forcibly copy over an existing managed file')),
3513 ] + walkopts + dryrunopts,
3516 ] + walkopts + dryrunopts,
3514 _('[OPTION]... [SOURCE]... DEST')),
3517 _('[OPTION]... [SOURCE]... DEST')),
3515 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3518 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3516 "debugcheckstate": (debugcheckstate, [], ''),
3519 "debugcheckstate": (debugcheckstate, [], ''),
3517 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3520 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3518 "debugcomplete":
3521 "debugcomplete":
3519 (debugcomplete,
3522 (debugcomplete,
3520 [('o', 'options', None, _('show the command options'))],
3523 [('o', 'options', None, _('show the command options'))],
3521 _('[-o] CMD')),
3524 _('[-o] CMD')),
3522 "debugdate":
3525 "debugdate":
3523 (debugdate,
3526 (debugdate,
3524 [('e', 'extended', None, _('try extended date formats'))],
3527 [('e', 'extended', None, _('try extended date formats'))],
3525 _('[-e] DATE [RANGE]')),
3528 _('[-e] DATE [RANGE]')),
3526 "debugdata": (debugdata, [], _('FILE REV')),
3529 "debugdata": (debugdata, [], _('FILE REV')),
3527 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3530 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3528 "debugindex": (debugindex, [], _('FILE')),
3531 "debugindex": (debugindex, [], _('FILE')),
3529 "debugindexdot": (debugindexdot, [], _('FILE')),
3532 "debugindexdot": (debugindexdot, [], _('FILE')),
3530 "debuginstall": (debuginstall, [], ''),
3533 "debuginstall": (debuginstall, [], ''),
3531 "debugrebuildstate":
3534 "debugrebuildstate":
3532 (debugrebuildstate,
3535 (debugrebuildstate,
3533 [('r', 'rev', '', _('revision to rebuild to'))],
3536 [('r', 'rev', '', _('revision to rebuild to'))],
3534 _('[-r REV] [REV]')),
3537 _('[-r REV] [REV]')),
3535 "debugrename":
3538 "debugrename":
3536 (debugrename,
3539 (debugrename,
3537 [('r', 'rev', '', _('revision to debug'))],
3540 [('r', 'rev', '', _('revision to debug'))],
3538 _('[-r REV] FILE')),
3541 _('[-r REV] FILE')),
3539 "debugsetparents":
3542 "debugsetparents":
3540 (debugsetparents, [], _('REV1 [REV2]')),
3543 (debugsetparents, [], _('REV1 [REV2]')),
3541 "debugstate":
3544 "debugstate":
3542 (debugstate,
3545 (debugstate,
3543 [('', 'nodates', None, _('do not display the saved mtime'))],
3546 [('', 'nodates', None, _('do not display the saved mtime'))],
3544 _('[OPTION]...')),
3547 _('[OPTION]...')),
3545 "debugsub":
3548 "debugsub":
3546 (debugsub,
3549 (debugsub,
3547 [('r', 'rev', '', _('revision to check'))],
3550 [('r', 'rev', '', _('revision to check'))],
3548 _('[-r REV] [REV]')),
3551 _('[-r REV] [REV]')),
3549 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3552 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3550 "^diff":
3553 "^diff":
3551 (diff,
3554 (diff,
3552 [('r', 'rev', [], _('revision')),
3555 [('r', 'rev', [], _('revision')),
3553 ('c', 'change', '', _('change made by revision'))
3556 ('c', 'change', '', _('change made by revision'))
3554 ] + diffopts + diffopts2 + walkopts,
3557 ] + diffopts + diffopts2 + walkopts,
3555 _('[OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
3558 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...')),
3556 "^export":
3559 "^export":
3557 (export,
3560 (export,
3558 [('o', 'output', '', _('print output to file with formatted name')),
3561 [('o', 'output', '', _('print output to file with formatted name')),
3559 ('', 'switch-parent', None, _('diff against the second parent')),
3562 ('', 'switch-parent', None, _('diff against the second parent')),
3560 ('r', 'rev', [], _('revisions to export')),
3563 ('r', 'rev', [], _('revisions to export')),
3561 ] + diffopts,
3564 ] + diffopts,
3562 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3565 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3563 "^forget":
3566 "^forget":
3564 (forget,
3567 (forget,
3565 [] + walkopts,
3568 [] + walkopts,
3566 _('[OPTION]... FILE...')),
3569 _('[OPTION]... FILE...')),
3567 "grep":
3570 "grep":
3568 (grep,
3571 (grep,
3569 [('0', 'print0', None, _('end fields with NUL')),
3572 [('0', 'print0', None, _('end fields with NUL')),
3570 ('', 'all', None, _('print all revisions that match')),
3573 ('', 'all', None, _('print all revisions that match')),
3571 ('f', 'follow', None,
3574 ('f', 'follow', None,
3572 _('follow changeset history,'
3575 _('follow changeset history,'
3573 ' or file history across copies and renames')),
3576 ' or file history across copies and renames')),
3574 ('i', 'ignore-case', None, _('ignore case when matching')),
3577 ('i', 'ignore-case', None, _('ignore case when matching')),
3575 ('l', 'files-with-matches', None,
3578 ('l', 'files-with-matches', None,
3576 _('print only filenames and revisions that match')),
3579 _('print only filenames and revisions that match')),
3577 ('n', 'line-number', None, _('print matching line numbers')),
3580 ('n', 'line-number', None, _('print matching line numbers')),
3578 ('r', 'rev', [], _('search in given revision range')),
3581 ('r', 'rev', [], _('search in given revision range')),
3579 ('u', 'user', None, _('list the author (long with -v)')),
3582 ('u', 'user', None, _('list the author (long with -v)')),
3580 ('d', 'date', None, _('list the date (short with -q)')),
3583 ('d', 'date', None, _('list the date (short with -q)')),
3581 ] + walkopts,
3584 ] + walkopts,
3582 _('[OPTION]... PATTERN [FILE]...')),
3585 _('[OPTION]... PATTERN [FILE]...')),
3583 "heads":
3586 "heads":
3584 (heads,
3587 (heads,
3585 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3588 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3586 ('t', 'topo', False, _('show topological heads only')),
3589 ('t', 'topo', False, _('show topological heads only')),
3587 ('a', 'active', False,
3590 ('a', 'active', False,
3588 _('show active branchheads only [DEPRECATED]')),
3591 _('show active branchheads only [DEPRECATED]')),
3589 ('c', 'closed', False,
3592 ('c', 'closed', False,
3590 _('show normal and closed branch heads')),
3593 _('show normal and closed branch heads')),
3591 ] + templateopts,
3594 ] + templateopts,
3592 _('[-ac] [-r STARTREV] [REV]...')),
3595 _('[-ac] [-r STARTREV] [REV]...')),
3593 "help": (help_, [], _('[TOPIC]')),
3596 "help": (help_, [], _('[TOPIC]')),
3594 "identify|id":
3597 "identify|id":
3595 (identify,
3598 (identify,
3596 [('r', 'rev', '', _('identify the specified revision')),
3599 [('r', 'rev', '', _('identify the specified revision')),
3597 ('n', 'num', None, _('show local revision number')),
3600 ('n', 'num', None, _('show local revision number')),
3598 ('i', 'id', None, _('show global revision id')),
3601 ('i', 'id', None, _('show global revision id')),
3599 ('b', 'branch', None, _('show branch')),
3602 ('b', 'branch', None, _('show branch')),
3600 ('t', 'tags', None, _('show tags'))],
3603 ('t', 'tags', None, _('show tags'))],
3601 _('[-nibt] [-r REV] [SOURCE]')),
3604 _('[-nibt] [-r REV] [SOURCE]')),
3602 "import|patch":
3605 "import|patch":
3603 (import_,
3606 (import_,
3604 [('p', 'strip', 1,
3607 [('p', 'strip', 1,
3605 _('directory strip option for patch. This has the same '
3608 _('directory strip option for patch. This has the same '
3606 'meaning as the corresponding patch option')),
3609 'meaning as the corresponding patch option')),
3607 ('b', 'base', '', _('base path')),
3610 ('b', 'base', '', _('base path')),
3608 ('f', 'force', None,
3611 ('f', 'force', None,
3609 _('skip check for outstanding uncommitted changes')),
3612 _('skip check for outstanding uncommitted changes')),
3610 ('', 'no-commit', None,
3613 ('', 'no-commit', None,
3611 _("don't commit, just update the working directory")),
3614 _("don't commit, just update the working directory")),
3612 ('', 'exact', None,
3615 ('', 'exact', None,
3613 _('apply patch to the nodes from which it was generated')),
3616 _('apply patch to the nodes from which it was generated')),
3614 ('', 'import-branch', None,
3617 ('', 'import-branch', None,
3615 _('use any branch information in patch (implied by --exact)'))] +
3618 _('use any branch information in patch (implied by --exact)'))] +
3616 commitopts + commitopts2 + similarityopts,
3619 commitopts + commitopts2 + similarityopts,
3617 _('[OPTION]... PATCH...')),
3620 _('[OPTION]... PATCH...')),
3618 "incoming|in":
3621 "incoming|in":
3619 (incoming,
3622 (incoming,
3620 [('f', 'force', None,
3623 [('f', 'force', None,
3621 _('run even if remote repository is unrelated')),
3624 _('run even if remote repository is unrelated')),
3622 ('n', 'newest-first', None, _('show newest record first')),
3625 ('n', 'newest-first', None, _('show newest record first')),
3623 ('', 'bundle', '', _('file to store the bundles into')),
3626 ('', 'bundle', '', _('file to store the bundles into')),
3624 ('r', 'rev', [],
3627 ('r', 'rev', [],
3625 _('a remote changeset intended to be added')),
3628 _('a remote changeset intended to be added')),
3626 ('b', 'branch', [],
3629 ('b', 'branch', [],
3627 _('a specific branch you would like to pull')),
3630 _('a specific branch you would like to pull')),
3628 ] + logopts + remoteopts,
3631 ] + logopts + remoteopts,
3629 _('[-p] [-n] [-M] [-f] [-r REV]...'
3632 _('[-p] [-n] [-M] [-f] [-r REV]...'
3630 ' [--bundle FILENAME] [SOURCE]')),
3633 ' [--bundle FILENAME] [SOURCE]')),
3631 "^init":
3634 "^init":
3632 (init,
3635 (init,
3633 remoteopts,
3636 remoteopts,
3634 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3637 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3635 "locate":
3638 "locate":
3636 (locate,
3639 (locate,
3637 [('r', 'rev', '', _('search the repository as it is in REV')),
3640 [('r', 'rev', '', _('search the repository as it is in REV')),
3638 ('0', 'print0', None,
3641 ('0', 'print0', None,
3639 _('end filenames with NUL, for use with xargs')),
3642 _('end filenames with NUL, for use with xargs')),
3640 ('f', 'fullpath', None,
3643 ('f', 'fullpath', None,
3641 _('print complete paths from the filesystem root')),
3644 _('print complete paths from the filesystem root')),
3642 ] + walkopts,
3645 ] + walkopts,
3643 _('[OPTION]... [PATTERN]...')),
3646 _('[OPTION]... [PATTERN]...')),
3644 "^log|history":
3647 "^log|history":
3645 (log,
3648 (log,
3646 [('f', 'follow', None,
3649 [('f', 'follow', None,
3647 _('follow changeset history,'
3650 _('follow changeset history,'
3648 ' or file history across copies and renames')),
3651 ' or file history across copies and renames')),
3649 ('', 'follow-first', None,
3652 ('', 'follow-first', None,
3650 _('only follow the first parent of merge changesets')),
3653 _('only follow the first parent of merge changesets')),
3651 ('d', 'date', '', _('show revisions matching date spec')),
3654 ('d', 'date', '', _('show revisions matching date spec')),
3652 ('C', 'copies', None, _('show copied files')),
3655 ('C', 'copies', None, _('show copied files')),
3653 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3656 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3654 ('r', 'rev', [], _('show the specified revision or range')),
3657 ('r', 'rev', [], _('show the specified revision or range')),
3655 ('', 'removed', None, _('include revisions where files were removed')),
3658 ('', 'removed', None, _('include revisions where files were removed')),
3656 ('m', 'only-merges', None, _('show only merges')),
3659 ('m', 'only-merges', None, _('show only merges')),
3657 ('u', 'user', [], _('revisions committed by user')),
3660 ('u', 'user', [], _('revisions committed by user')),
3658 ('b', 'only-branch', [],
3661 ('b', 'only-branch', [],
3659 _('show only changesets within the given named branch')),
3662 _('show only changesets within the given named branch')),
3660 ('P', 'prune', [],
3663 ('P', 'prune', [],
3661 _('do not display revision or any of its ancestors')),
3664 _('do not display revision or any of its ancestors')),
3662 ] + logopts + walkopts,
3665 ] + logopts + walkopts,
3663 _('[OPTION]... [FILE]')),
3666 _('[OPTION]... [FILE]')),
3664 "manifest":
3667 "manifest":
3665 (manifest,
3668 (manifest,
3666 [('r', 'rev', '', _('revision to display'))],
3669 [('r', 'rev', '', _('revision to display'))],
3667 _('[-r REV]')),
3670 _('[-r REV]')),
3668 "^merge":
3671 "^merge":
3669 (merge,
3672 (merge,
3670 [('f', 'force', None, _('force a merge with outstanding changes')),
3673 [('f', 'force', None, _('force a merge with outstanding changes')),
3671 ('r', 'rev', '', _('revision to merge')),
3674 ('r', 'rev', '', _('revision to merge')),
3672 ('P', 'preview', None,
3675 ('P', 'preview', None,
3673 _('review revisions to merge (no merge is performed)'))],
3676 _('review revisions to merge (no merge is performed)'))],
3674 _('[-P] [-f] [[-r] REV]')),
3677 _('[-P] [-f] [[-r] REV]')),
3675 "outgoing|out":
3678 "outgoing|out":
3676 (outgoing,
3679 (outgoing,
3677 [('f', 'force', None,
3680 [('f', 'force', None,
3678 _('run even when the destination is unrelated')),
3681 _('run even when the destination is unrelated')),
3679 ('r', 'rev', [],
3682 ('r', 'rev', [],
3680 _('a changeset intended to be included in the destination')),
3683 _('a changeset intended to be included in the destination')),
3681 ('n', 'newest-first', None, _('show newest record first')),
3684 ('n', 'newest-first', None, _('show newest record first')),
3682 ('b', 'branch', [],
3685 ('b', 'branch', [],
3683 _('a specific branch you would like to push')),
3686 _('a specific branch you would like to push')),
3684 ] + logopts + remoteopts,
3687 ] + logopts + remoteopts,
3685 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3688 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3686 "parents":
3689 "parents":
3687 (parents,
3690 (parents,
3688 [('r', 'rev', '', _('show parents of the specified revision')),
3691 [('r', 'rev', '', _('show parents of the specified revision')),
3689 ] + templateopts,
3692 ] + templateopts,
3690 _('[-r REV] [FILE]')),
3693 _('[-r REV] [FILE]')),
3691 "paths": (paths, [], _('[NAME]')),
3694 "paths": (paths, [], _('[NAME]')),
3692 "^pull":
3695 "^pull":
3693 (pull,
3696 (pull,
3694 [('u', 'update', None,
3697 [('u', 'update', None,
3695 _('update to new branch head if changesets were pulled')),
3698 _('update to new branch head if changesets were pulled')),
3696 ('f', 'force', None,
3699 ('f', 'force', None,
3697 _('run even when remote repository is unrelated')),
3700 _('run even when remote repository is unrelated')),
3698 ('r', 'rev', [],
3701 ('r', 'rev', [],
3699 _('a remote changeset intended to be added')),
3702 _('a remote changeset intended to be added')),
3700 ('b', 'branch', [],
3703 ('b', 'branch', [],
3701 _('a specific branch you would like to pull')),
3704 _('a specific branch you would like to pull')),
3702 ] + remoteopts,
3705 ] + remoteopts,
3703 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3706 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3704 "^push":
3707 "^push":
3705 (push,
3708 (push,
3706 [('f', 'force', None, _('force push')),
3709 [('f', 'force', None, _('force push')),
3707 ('r', 'rev', [],
3710 ('r', 'rev', [],
3708 _('a changeset intended to be included in the destination')),
3711 _('a changeset intended to be included in the destination')),
3709 ('b', 'branch', [],
3712 ('b', 'branch', [],
3710 _('a specific branch you would like to push')),
3713 _('a specific branch you would like to push')),
3711 ] + remoteopts,
3714 ] + remoteopts,
3712 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3715 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3713 "recover": (recover, []),
3716 "recover": (recover, []),
3714 "^remove|rm":
3717 "^remove|rm":
3715 (remove,
3718 (remove,
3716 [('A', 'after', None, _('record delete for missing files')),
3719 [('A', 'after', None, _('record delete for missing files')),
3717 ('f', 'force', None,
3720 ('f', 'force', None,
3718 _('remove (and delete) file even if added or modified')),
3721 _('remove (and delete) file even if added or modified')),
3719 ] + walkopts,
3722 ] + walkopts,
3720 _('[OPTION]... FILE...')),
3723 _('[OPTION]... FILE...')),
3721 "rename|mv":
3724 "rename|mv":
3722 (rename,
3725 (rename,
3723 [('A', 'after', None, _('record a rename that has already occurred')),
3726 [('A', 'after', None, _('record a rename that has already occurred')),
3724 ('f', 'force', None,
3727 ('f', 'force', None,
3725 _('forcibly copy over an existing managed file')),
3728 _('forcibly copy over an existing managed file')),
3726 ] + walkopts + dryrunopts,
3729 ] + walkopts + dryrunopts,
3727 _('[OPTION]... SOURCE... DEST')),
3730 _('[OPTION]... SOURCE... DEST')),
3728 "resolve":
3731 "resolve":
3729 (resolve,
3732 (resolve,
3730 [('a', 'all', None, _('select all unresolved files')),
3733 [('a', 'all', None, _('select all unresolved files')),
3731 ('l', 'list', None, _('list state of files needing merge')),
3734 ('l', 'list', None, _('list state of files needing merge')),
3732 ('m', 'mark', None, _('mark files as resolved')),
3735 ('m', 'mark', None, _('mark files as resolved')),
3733 ('u', 'unmark', None, _('unmark files as resolved')),
3736 ('u', 'unmark', None, _('unmark files as resolved')),
3734 ('n', 'no-status', None, _('hide status prefix'))]
3737 ('n', 'no-status', None, _('hide status prefix'))]
3735 + walkopts,
3738 + walkopts,
3736 _('[OPTION]... [FILE]...')),
3739 _('[OPTION]... [FILE]...')),
3737 "revert":
3740 "revert":
3738 (revert,
3741 (revert,
3739 [('a', 'all', None, _('revert all changes when no arguments given')),
3742 [('a', 'all', None, _('revert all changes when no arguments given')),
3740 ('d', 'date', '', _('tipmost revision matching date')),
3743 ('d', 'date', '', _('tipmost revision matching date')),
3741 ('r', 'rev', '', _('revert to the specified revision')),
3744 ('r', 'rev', '', _('revert to the specified revision')),
3742 ('', 'no-backup', None, _('do not save backup copies of files')),
3745 ('', 'no-backup', None, _('do not save backup copies of files')),
3743 ] + walkopts + dryrunopts,
3746 ] + walkopts + dryrunopts,
3744 _('[OPTION]... [-r REV] [NAME]...')),
3747 _('[OPTION]... [-r REV] [NAME]...')),
3745 "rollback": (rollback, []),
3748 "rollback": (rollback, []),
3746 "root": (root, []),
3749 "root": (root, []),
3747 "^serve":
3750 "^serve":
3748 (serve,
3751 (serve,
3749 [('A', 'accesslog', '', _('name of access log file to write to')),
3752 [('A', 'accesslog', '', _('name of access log file to write to')),
3750 ('d', 'daemon', None, _('run server in background')),
3753 ('d', 'daemon', None, _('run server in background')),
3751 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3754 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3752 ('E', 'errorlog', '', _('name of error log file to write to')),
3755 ('E', 'errorlog', '', _('name of error log file to write to')),
3753 ('p', 'port', 0, _('port to listen on (default: 8000)')),
3756 ('p', 'port', 0, _('port to listen on (default: 8000)')),
3754 ('a', 'address', '',
3757 ('a', 'address', '',
3755 _('address to listen on (default: all interfaces)')),
3758 _('address to listen on (default: all interfaces)')),
3756 ('', 'prefix', '',
3759 ('', 'prefix', '',
3757 _('prefix path to serve from (default: server root)')),
3760 _('prefix path to serve from (default: server root)')),
3758 ('n', 'name', '',
3761 ('n', 'name', '',
3759 _('name to show in web pages (default: working directory)')),
3762 _('name to show in web pages (default: working directory)')),
3760 ('', 'webdir-conf', '', _('name of the webdir config file'
3763 ('', 'webdir-conf', '', _('name of the webdir config file'
3761 ' (serve more than one repository)')),
3764 ' (serve more than one repository)')),
3762 ('', 'pid-file', '', _('name of file to write process ID to')),
3765 ('', 'pid-file', '', _('name of file to write process ID to')),
3763 ('', 'stdio', None, _('for remote clients')),
3766 ('', 'stdio', None, _('for remote clients')),
3764 ('t', 'templates', '', _('web templates to use')),
3767 ('t', 'templates', '', _('web templates to use')),
3765 ('', 'style', '', _('template style to use')),
3768 ('', 'style', '', _('template style to use')),
3766 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3769 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3767 ('', 'certificate', '', _('SSL certificate file'))],
3770 ('', 'certificate', '', _('SSL certificate file'))],
3768 _('[OPTION]...')),
3771 _('[OPTION]...')),
3769 "showconfig|debugconfig":
3772 "showconfig|debugconfig":
3770 (showconfig,
3773 (showconfig,
3771 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3774 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3772 _('[-u] [NAME]...')),
3775 _('[-u] [NAME]...')),
3773 "^summary|sum":
3776 "^summary|sum":
3774 (summary,
3777 (summary,
3775 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3778 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3776 "^status|st":
3779 "^status|st":
3777 (status,
3780 (status,
3778 [('A', 'all', None, _('show status of all files')),
3781 [('A', 'all', None, _('show status of all files')),
3779 ('m', 'modified', None, _('show only modified files')),
3782 ('m', 'modified', None, _('show only modified files')),
3780 ('a', 'added', None, _('show only added files')),
3783 ('a', 'added', None, _('show only added files')),
3781 ('r', 'removed', None, _('show only removed files')),
3784 ('r', 'removed', None, _('show only removed files')),
3782 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3785 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3783 ('c', 'clean', None, _('show only files without changes')),
3786 ('c', 'clean', None, _('show only files without changes')),
3784 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3787 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3785 ('i', 'ignored', None, _('show only ignored files')),
3788 ('i', 'ignored', None, _('show only ignored files')),
3786 ('n', 'no-status', None, _('hide status prefix')),
3789 ('n', 'no-status', None, _('hide status prefix')),
3787 ('C', 'copies', None, _('show source of copied files')),
3790 ('C', 'copies', None, _('show source of copied files')),
3788 ('0', 'print0', None,
3791 ('0', 'print0', None,
3789 _('end filenames with NUL, for use with xargs')),
3792 _('end filenames with NUL, for use with xargs')),
3790 ('', 'rev', [], _('show difference from revision')),
3793 ('', 'rev', [], _('show difference from revision')),
3791 ('', 'change', '', _('list the changed files of a revision')),
3794 ('', 'change', '', _('list the changed files of a revision')),
3792 ] + walkopts,
3795 ] + walkopts,
3793 _('[OPTION]... [FILE]...')),
3796 _('[OPTION]... [FILE]...')),
3794 "tag":
3797 "tag":
3795 (tag,
3798 (tag,
3796 [('f', 'force', None, _('replace existing tag')),
3799 [('f', 'force', None, _('replace existing tag')),
3797 ('l', 'local', None, _('make the tag local')),
3800 ('l', 'local', None, _('make the tag local')),
3798 ('r', 'rev', '', _('revision to tag')),
3801 ('r', 'rev', '', _('revision to tag')),
3799 ('', 'remove', None, _('remove a tag')),
3802 ('', 'remove', None, _('remove a tag')),
3800 # -l/--local is already there, commitopts cannot be used
3803 # -l/--local is already there, commitopts cannot be used
3801 ('m', 'message', '', _('use <text> as commit message')),
3804 ('m', 'message', '', _('use <text> as commit message')),
3802 ] + commitopts2,
3805 ] + commitopts2,
3803 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3806 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3804 "tags": (tags, [], ''),
3807 "tags": (tags, [], ''),
3805 "tip":
3808 "tip":
3806 (tip,
3809 (tip,
3807 [('p', 'patch', None, _('show patch')),
3810 [('p', 'patch', None, _('show patch')),
3808 ('g', 'git', None, _('use git extended diff format')),
3811 ('g', 'git', None, _('use git extended diff format')),
3809 ] + templateopts,
3812 ] + templateopts,
3810 _('[-p] [-g]')),
3813 _('[-p] [-g]')),
3811 "unbundle":
3814 "unbundle":
3812 (unbundle,
3815 (unbundle,
3813 [('u', 'update', None,
3816 [('u', 'update', None,
3814 _('update to new branch head if changesets were unbundled'))],
3817 _('update to new branch head if changesets were unbundled'))],
3815 _('[-u] FILE...')),
3818 _('[-u] FILE...')),
3816 "^update|up|checkout|co":
3819 "^update|up|checkout|co":
3817 (update,
3820 (update,
3818 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3821 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3819 ('c', 'check', None, _('check for uncommitted changes')),
3822 ('c', 'check', None, _('check for uncommitted changes')),
3820 ('d', 'date', '', _('tipmost revision matching date')),
3823 ('d', 'date', '', _('tipmost revision matching date')),
3821 ('r', 'rev', '', _('revision'))],
3824 ('r', 'rev', '', _('revision'))],
3822 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3825 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3823 "verify": (verify, []),
3826 "verify": (verify, []),
3824 "version": (version_, []),
3827 "version": (version_, []),
3825 }
3828 }
3826
3829
3827 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3830 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3828 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3831 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3829 optionalrepo = ("identify paths serve showconfig debugancestor")
3832 optionalrepo = ("identify paths serve showconfig debugancestor")
@@ -1,634 +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]... [-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
387 baseline.
388
386 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
387 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
388 with undesirable results.
391 with undesirable results.
389
392
390 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.
391 For more information, read 'hg help diffs'.
394 For more information, read 'hg help diffs'.
392
395
393 options:
396 options:
394
397
395 -r --rev revision
398 -r --rev revision
396 -c --change change made by revision
399 -c --change change made by revision
397 -a --text treat all files as text
400 -a --text treat all files as text
398 -g --git use git extended diff format
401 -g --git use git extended diff format
399 --nodates omit dates from diff headers
402 --nodates omit dates from diff headers
400 -p --show-function show which function each change is in
403 -p --show-function show which function each change is in
401 --reverse produce a diff that undoes the changes
404 --reverse produce a diff that undoes the changes
402 -w --ignore-all-space ignore white space when comparing lines
405 -w --ignore-all-space ignore white space when comparing lines
403 -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
404 -B --ignore-blank-lines ignore changes whose lines are all blank
407 -B --ignore-blank-lines ignore changes whose lines are all blank
405 -U --unified number of lines of context to show
408 -U --unified number of lines of context to show
406 --stat output diffstat-style summary of changes
409 --stat output diffstat-style summary of changes
407 -I --include include names matching the given patterns
410 -I --include include names matching the given patterns
408 -X --exclude exclude names matching the given patterns
411 -X --exclude exclude names matching the given patterns
409
412
410 use "hg -v help diff" to show global options
413 use "hg -v help diff" to show global options
411 hg status [OPTION]... [FILE]...
414 hg status [OPTION]... [FILE]...
412
415
413 aliases: st
416 aliases: st
414
417
415 show changed files in the working directory
418 show changed files in the working directory
416
419
417 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
418 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
419 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
422 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
420 -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
421 only ..." are given, the options -mardu are used.
424 only ..." are given, the options -mardu are used.
422
425
423 Option -q/--quiet hides untracked (unknown and ignored) files unless
426 Option -q/--quiet hides untracked (unknown and ignored) files unless
424 explicitly requested with -u/--unknown or -i/--ignored.
427 explicitly requested with -u/--unknown or -i/--ignored.
425
428
426 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
427 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
428 permission changes and diff only reports changes relative to one merge
431 permission changes and diff only reports changes relative to one merge
429 parent.
432 parent.
430
433
431 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
432 revisions are given, the differences between them are shown. The --change
435 revisions are given, the differences between them are shown. The --change
433 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
434 revision from its first parent.
437 revision from its first parent.
435
438
436 The codes used to show the status of files are:
439 The codes used to show the status of files are:
437
440
438 M = modified
441 M = modified
439 A = added
442 A = added
440 R = removed
443 R = removed
441 C = clean
444 C = clean
442 ! = missing (deleted by non-hg command, but still tracked)
445 ! = missing (deleted by non-hg command, but still tracked)
443 ? = not tracked
446 ? = not tracked
444 I = ignored
447 I = ignored
445 = origin of the previous file listed as A (added)
448 = origin of the previous file listed as A (added)
446
449
447 options:
450 options:
448
451
449 -A --all show status of all files
452 -A --all show status of all files
450 -m --modified show only modified files
453 -m --modified show only modified files
451 -a --added show only added files
454 -a --added show only added files
452 -r --removed show only removed files
455 -r --removed show only removed files
453 -d --deleted show only deleted (but tracked) files
456 -d --deleted show only deleted (but tracked) files
454 -c --clean show only files without changes
457 -c --clean show only files without changes
455 -u --unknown show only unknown (not tracked) files
458 -u --unknown show only unknown (not tracked) files
456 -i --ignored show only ignored files
459 -i --ignored show only ignored files
457 -n --no-status hide status prefix
460 -n --no-status hide status prefix
458 -C --copies show source of copied files
461 -C --copies show source of copied files
459 -0 --print0 end filenames with NUL, for use with xargs
462 -0 --print0 end filenames with NUL, for use with xargs
460 --rev show difference from revision
463 --rev show difference from revision
461 --change list the changed files of a revision
464 --change list the changed files of a revision
462 -I --include include names matching the given patterns
465 -I --include include names matching the given patterns
463 -X --exclude exclude names matching the given patterns
466 -X --exclude exclude names matching the given patterns
464
467
465 use "hg -v help status" to show global options
468 use "hg -v help status" to show global options
466 hg status [OPTION]... [FILE]...
469 hg status [OPTION]... [FILE]...
467
470
468 show changed files in the working directory
471 show changed files in the working directory
469 hg: unknown command 'foo'
472 hg: unknown command 'foo'
470 Mercurial Distributed SCM
473 Mercurial Distributed SCM
471
474
472 basic commands:
475 basic commands:
473
476
474 add add the specified files on the next commit
477 add add the specified files on the next commit
475 annotate show changeset information by line for each file
478 annotate show changeset information by line for each file
476 clone make a copy of an existing repository
479 clone make a copy of an existing repository
477 commit commit the specified files or all outstanding changes
480 commit commit the specified files or all outstanding changes
478 diff diff repository (or selected files)
481 diff diff repository (or selected files)
479 export dump the header and diffs for one or more changesets
482 export dump the header and diffs for one or more changesets
480 forget forget the specified files on the next commit
483 forget forget the specified files on the next commit
481 init create a new repository in the given directory
484 init create a new repository in the given directory
482 log show revision history of entire repository or files
485 log show revision history of entire repository or files
483 merge merge working directory with another revision
486 merge merge working directory with another revision
484 pull pull changes from the specified source
487 pull pull changes from the specified source
485 push push changes to the specified destination
488 push push changes to the specified destination
486 remove remove the specified files on the next commit
489 remove remove the specified files on the next commit
487 serve export the repository via HTTP
490 serve export the repository via HTTP
488 status show changed files in the working directory
491 status show changed files in the working directory
489 summary summarize working directory state
492 summary summarize working directory state
490 update update working directory
493 update update working directory
491
494
492 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
493 hg: unknown command 'skjdfks'
496 hg: unknown command 'skjdfks'
494 Mercurial Distributed SCM
497 Mercurial Distributed SCM
495
498
496 basic commands:
499 basic commands:
497
500
498 add add the specified files on the next commit
501 add add the specified files on the next commit
499 annotate show changeset information by line for each file
502 annotate show changeset information by line for each file
500 clone make a copy of an existing repository
503 clone make a copy of an existing repository
501 commit commit the specified files or all outstanding changes
504 commit commit the specified files or all outstanding changes
502 diff diff repository (or selected files)
505 diff diff repository (or selected files)
503 export dump the header and diffs for one or more changesets
506 export dump the header and diffs for one or more changesets
504 forget forget the specified files on the next commit
507 forget forget the specified files on the next commit
505 init create a new repository in the given directory
508 init create a new repository in the given directory
506 log show revision history of entire repository or files
509 log show revision history of entire repository or files
507 merge merge working directory with another revision
510 merge merge working directory with another revision
508 pull pull changes from the specified source
511 pull pull changes from the specified source
509 push push changes to the specified destination
512 push push changes to the specified destination
510 remove remove the specified files on the next commit
513 remove remove the specified files on the next commit
511 serve export the repository via HTTP
514 serve export the repository via HTTP
512 status show changed files in the working directory
515 status show changed files in the working directory
513 summary summarize working directory state
516 summary summarize working directory state
514 update update working directory
517 update update working directory
515
518
516 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
517 %% test command with no help text
520 %% test command with no help text
518 hg nohelp
521 hg nohelp
519
522
520 (no help text available)
523 (no help text available)
521
524
522 use "hg -v help nohelp" to show global options
525 use "hg -v help nohelp" to show global options
523 %% test that default list of commands omits extension commands
526 %% test that default list of commands omits extension commands
524 Mercurial Distributed SCM
527 Mercurial Distributed SCM
525
528
526 list of commands:
529 list of commands:
527
530
528 add add the specified files on the next commit
531 add add the specified files on the next commit
529 addremove add all new files, delete all missing files
532 addremove add all new files, delete all missing files
530 annotate show changeset information by line for each file
533 annotate show changeset information by line for each file
531 archive create an unversioned archive of a repository revision
534 archive create an unversioned archive of a repository revision
532 backout reverse effect of earlier changeset
535 backout reverse effect of earlier changeset
533 bisect subdivision search of changesets
536 bisect subdivision search of changesets
534 branch set or show the current branch name
537 branch set or show the current branch name
535 branches list repository named branches
538 branches list repository named branches
536 bundle create a changegroup file
539 bundle create a changegroup file
537 cat output the current or given revision of files
540 cat output the current or given revision of files
538 clone make a copy of an existing repository
541 clone make a copy of an existing repository
539 commit commit the specified files or all outstanding changes
542 commit commit the specified files or all outstanding changes
540 copy mark files as copied for the next commit
543 copy mark files as copied for the next commit
541 diff diff repository (or selected files)
544 diff diff repository (or selected files)
542 export dump the header and diffs for one or more changesets
545 export dump the header and diffs for one or more changesets
543 forget forget the specified files on the next commit
546 forget forget the specified files on the next commit
544 grep search for a pattern in specified files and revisions
547 grep search for a pattern in specified files and revisions
545 heads show current repository heads or show branch heads
548 heads show current repository heads or show branch heads
546 help show help for a given topic or a help overview
549 help show help for a given topic or a help overview
547 identify identify the working copy or specified revision
550 identify identify the working copy or specified revision
548 import import an ordered set of patches
551 import import an ordered set of patches
549 incoming show new changesets found in source
552 incoming show new changesets found in source
550 init create a new repository in the given directory
553 init create a new repository in the given directory
551 locate locate files matching specific patterns
554 locate locate files matching specific patterns
552 log show revision history of entire repository or files
555 log show revision history of entire repository or files
553 manifest output the current or given revision of the project manifest
556 manifest output the current or given revision of the project manifest
554 merge merge working directory with another revision
557 merge merge working directory with another revision
555 outgoing show changesets not found in the destination
558 outgoing show changesets not found in the destination
556 parents show the parents of the working directory or revision
559 parents show the parents of the working directory or revision
557 paths show aliases for remote repositories
560 paths show aliases for remote repositories
558 pull pull changes from the specified source
561 pull pull changes from the specified source
559 push push changes to the specified destination
562 push push changes to the specified destination
560 recover roll back an interrupted transaction
563 recover roll back an interrupted transaction
561 remove remove the specified files on the next commit
564 remove remove the specified files on the next commit
562 rename rename files; equivalent of copy + remove
565 rename rename files; equivalent of copy + remove
563 resolve retry file merges from a merge or update
566 resolve retry file merges from a merge or update
564 revert restore individual files or directories to an earlier state
567 revert restore individual files or directories to an earlier state
565 rollback roll back the last transaction
568 rollback roll back the last transaction
566 root print the root (top) of the current working directory
569 root print the root (top) of the current working directory
567 serve export the repository via HTTP
570 serve export the repository via HTTP
568 showconfig show combined config settings from all hgrc files
571 showconfig show combined config settings from all hgrc files
569 status show changed files in the working directory
572 status show changed files in the working directory
570 summary summarize working directory state
573 summary summarize working directory state
571 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
572 tags list repository tags
575 tags list repository tags
573 tip show the tip revision
576 tip show the tip revision
574 unbundle apply one or more changegroup files
577 unbundle apply one or more changegroup files
575 update update working directory
578 update update working directory
576 verify verify the integrity of the repository
579 verify verify the integrity of the repository
577 version output version and copyright information
580 version output version and copyright information
578
581
579 enabled extensions:
582 enabled extensions:
580
583
581 helpext (no help text available)
584 helpext (no help text available)
582
585
583 additional help topics:
586 additional help topics:
584
587
585 config Configuration Files
588 config Configuration Files
586 dates Date Formats
589 dates Date Formats
587 patterns File Name Patterns
590 patterns File Name Patterns
588 environment Environment Variables
591 environment Environment Variables
589 revisions Specifying Single Revisions
592 revisions Specifying Single Revisions
590 multirevs Specifying Multiple Revisions
593 multirevs Specifying Multiple Revisions
591 diffs Diff Formats
594 diffs Diff Formats
592 templating Template Usage
595 templating Template Usage
593 urls URL Paths
596 urls URL Paths
594 extensions Using additional features
597 extensions Using additional features
595
598
596 use "hg -v help" to show aliases and global options
599 use "hg -v help" to show aliases and global options
597 %% test list of commands with command with no help text
600 %% test list of commands with command with no help text
598 helpext extension - no help text available
601 helpext extension - no help text available
599
602
600 list of commands:
603 list of commands:
601
604
602 nohelp (no help text available)
605 nohelp (no help text available)
603
606
604 use "hg -v help helpext" to show aliases and global options
607 use "hg -v help helpext" to show aliases and global options
605 %% test a help topic
608 %% test a help topic
606 Specifying Single Revisions
609 Specifying Single Revisions
607
610
608 Mercurial supports several ways to specify individual revisions.
611 Mercurial supports several ways to specify individual revisions.
609
612
610 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
611 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
612 denoting the revision prior to the tip, and so forth.
615 denoting the revision prior to the tip, and so forth.
613
616
614 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.
615
618
616 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
617 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
618 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
619 full-length identifier.
622 full-length identifier.
620
623
621 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
622 symbolic name associated with a revision identifier. A branch name denotes
625 symbolic name associated with a revision identifier. A branch name denotes
623 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
624 the ":" character.
627 the ":" character.
625
628
626 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
627 recent revision.
630 recent revision.
628
631
629 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
630 of an empty repository, and the parent of revision 0.
633 of an empty repository, and the parent of revision 0.
631
634
632 The reserved name "." indicates the working directory parent. If no
635 The reserved name "." indicates the working directory parent. If no
633 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
634 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