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