447 if opts.get('parent'): |
447 if opts.get('parent'): |
448 raise util.Abort(_('cannot use --parent on non-merge changeset')) |
448 raise util.Abort(_('cannot use --parent on non-merge changeset')) |
449 parent = p1 |
449 parent = p1 |
450 |
450 |
451 # the backout should appear on the same branch |
451 # the backout should appear on the same branch |
452 branch = repo.dirstate.branch() |
452 wlock = repo.wlock() |
453 hg.clean(repo, node, show_stats=False) |
453 try: |
454 repo.dirstate.setbranch(branch) |
454 branch = repo.dirstate.branch() |
455 revert_opts = opts.copy() |
455 hg.clean(repo, node, show_stats=False) |
456 revert_opts['date'] = None |
456 repo.dirstate.setbranch(branch) |
457 revert_opts['all'] = True |
457 revert_opts = opts.copy() |
458 revert_opts['rev'] = hex(parent) |
458 revert_opts['date'] = None |
459 revert_opts['no_backup'] = None |
459 revert_opts['all'] = True |
460 revert(ui, repo, **revert_opts) |
460 revert_opts['rev'] = hex(parent) |
461 if not opts.get('merge') and op1 != node: |
461 revert_opts['no_backup'] = None |
462 try: |
462 revert(ui, repo, **revert_opts) |
463 ui.setconfig('ui', 'forcemerge', opts.get('tool', '')) |
463 if not opts.get('merge') and op1 != node: |
464 return hg.update(repo, op1) |
464 try: |
465 finally: |
465 ui.setconfig('ui', 'forcemerge', opts.get('tool', '')) |
466 ui.setconfig('ui', 'forcemerge', '') |
466 return hg.update(repo, op1) |
467 |
467 finally: |
468 commit_opts = opts.copy() |
468 ui.setconfig('ui', 'forcemerge', '') |
469 commit_opts['addremove'] = False |
469 |
470 if not commit_opts['message'] and not commit_opts['logfile']: |
470 commit_opts = opts.copy() |
471 # we don't translate commit messages |
471 commit_opts['addremove'] = False |
472 commit_opts['message'] = "Backed out changeset %s" % short(node) |
472 if not commit_opts['message'] and not commit_opts['logfile']: |
473 commit_opts['force_editor'] = True |
473 # we don't translate commit messages |
474 commit(ui, repo, **commit_opts) |
474 commit_opts['message'] = "Backed out changeset %s" % short(node) |
475 def nice(node): |
475 commit_opts['force_editor'] = True |
476 return '%d:%s' % (repo.changelog.rev(node), short(node)) |
476 commit(ui, repo, **commit_opts) |
477 ui.status(_('changeset %s backs out changeset %s\n') % |
477 def nice(node): |
478 (nice(repo.changelog.tip()), nice(node))) |
478 return '%d:%s' % (repo.changelog.rev(node), short(node)) |
479 if opts.get('merge') and op1 != node: |
479 ui.status(_('changeset %s backs out changeset %s\n') % |
480 hg.clean(repo, op1, show_stats=False) |
480 (nice(repo.changelog.tip()), nice(node))) |
481 ui.status(_('merging with changeset %s\n') |
481 if opts.get('merge') and op1 != node: |
482 % nice(repo.changelog.tip())) |
482 hg.clean(repo, op1, show_stats=False) |
483 try: |
483 ui.status(_('merging with changeset %s\n') |
484 ui.setconfig('ui', 'forcemerge', opts.get('tool', '')) |
484 % nice(repo.changelog.tip())) |
485 return hg.merge(repo, hex(repo.changelog.tip())) |
485 try: |
486 finally: |
486 ui.setconfig('ui', 'forcemerge', opts.get('tool', '')) |
487 ui.setconfig('ui', 'forcemerge', '') |
487 return hg.merge(repo, hex(repo.changelog.tip())) |
|
488 finally: |
|
489 ui.setconfig('ui', 'forcemerge', '') |
|
490 finally: |
|
491 wlock.release() |
488 return 0 |
492 return 0 |
489 |
493 |
490 @command('bisect', |
494 @command('bisect', |
491 [('r', 'reset', False, _('reset bisect state')), |
495 [('r', 'reset', False, _('reset bisect state')), |
492 ('g', 'good', False, _('mark changeset good')), |
496 ('g', 'good', False, _('mark changeset good')), |