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