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