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