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