comparison mercurial/commands.py @ 35704:41ef02ba329b

merge: add `--abort` flag which can abort the merge Currently we don't have a good functionality to abort the merge and tell user to do `hg update -C .` which can leads to different results if user missed the '.' and moreover does not align with other abort functionalities like rebase, shelve etc. This patch adds `hg merge --abort` which will abort the ongoing merge and take us back to the chagneset where we started from. Works in both cases when merge resulted in conflicts and when there were no conflicts. .. feature:: A `--abort` flag to merge command to abort the ongoing merge. Differential Revision: https://phab.mercurial-scm.org/D1829
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 08 Jan 2018 19:41:47 +0530
parents 1c929b4942a3
children 35a0f6f31eef
comparison
equal deleted inserted replaced
35703:9a50ffd15b25 35704:41ef02ba329b
3528 @command('^merge', 3528 @command('^merge',
3529 [('f', 'force', None, 3529 [('f', 'force', None,
3530 _('force a merge including outstanding changes (DEPRECATED)')), 3530 _('force a merge including outstanding changes (DEPRECATED)')),
3531 ('r', 'rev', '', _('revision to merge'), _('REV')), 3531 ('r', 'rev', '', _('revision to merge'), _('REV')),
3532 ('P', 'preview', None, 3532 ('P', 'preview', None,
3533 _('review revisions to merge (no merge is performed)')) 3533 _('review revisions to merge (no merge is performed)')),
3534 ('', 'abort', None, _('abort the ongoing merge')),
3534 ] + mergetoolopts, 3535 ] + mergetoolopts,
3535 _('[-P] [[-r] REV]')) 3536 _('[-P] [[-r] REV]'))
3536 def merge(ui, repo, node=None, **opts): 3537 def merge(ui, repo, node=None, **opts):
3537 """merge another revision into working directory 3538 """merge another revision into working directory
3538 3539
3553 head, the other head is merged with by default. Otherwise, an 3554 head, the other head is merged with by default. Otherwise, an
3554 explicit revision with which to merge with must be provided. 3555 explicit revision with which to merge with must be provided.
3555 3556
3556 See :hg:`help resolve` for information on handling file conflicts. 3557 See :hg:`help resolve` for information on handling file conflicts.
3557 3558
3558 To undo an uncommitted merge, use :hg:`update --clean .` which 3559 To undo an uncommitted merge, use :hg:`merge --abort` which
3559 will check out a clean copy of the original merge parent, losing 3560 will check out a clean copy of the original merge parent, losing
3560 all changes. 3561 all changes.
3561 3562
3562 Returns 0 on success, 1 if there are unresolved files. 3563 Returns 0 on success, 1 if there are unresolved files.
3563 """ 3564 """
3564 3565
3565 opts = pycompat.byteskwargs(opts) 3566 opts = pycompat.byteskwargs(opts)
3567 abort = opts.get('abort')
3568 if abort and repo.dirstate.p2() == nullid:
3569 cmdutil.wrongtooltocontinue(repo, _('merge'))
3570 if abort:
3571 if node:
3572 raise error.Abort(_("cannot specify a node with --abort"))
3573 if opts.get('rev'):
3574 raise error.Abort(_("cannot specify both --rev and --abort"))
3575 if opts.get('preview'):
3576 raise error.Abort(_("cannot specify --preview with --abort"))
3566 if opts.get('rev') and node: 3577 if opts.get('rev') and node:
3567 raise error.Abort(_("please specify just one revision")) 3578 raise error.Abort(_("please specify just one revision"))
3568 if not node: 3579 if not node:
3569 node = opts.get('rev') 3580 node = opts.get('rev')
3570 3581
3571 if node: 3582 if node:
3572 node = scmutil.revsingle(repo, node).node() 3583 node = scmutil.revsingle(repo, node).node()
3573 3584
3574 if not node: 3585 if not node and not abort:
3575 node = repo[destutil.destmerge(repo)].node() 3586 node = repo[destutil.destmerge(repo)].node()
3576 3587
3577 if opts.get('preview'): 3588 if opts.get('preview'):
3578 # find nodes that are ancestors of p2 but not of p1 3589 # find nodes that are ancestors of p2 but not of p1
3579 p1 = repo.lookup('.') 3590 p1 = repo.lookup('.')
3590 # ui.forcemerge is an internal variable, do not document 3601 # ui.forcemerge is an internal variable, do not document
3591 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge') 3602 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
3592 force = opts.get('force') 3603 force = opts.get('force')
3593 labels = ['working copy', 'merge rev'] 3604 labels = ['working copy', 'merge rev']
3594 return hg.merge(repo, node, force=force, mergeforce=force, 3605 return hg.merge(repo, node, force=force, mergeforce=force,
3595 labels=labels) 3606 labels=labels, abort=abort)
3596 finally: 3607 finally:
3597 ui.setconfig('ui', 'forcemerge', '', 'merge') 3608 ui.setconfig('ui', 'forcemerge', '', 'merge')
3598 3609
3599 @command('outgoing|out', 3610 @command('outgoing|out',
3600 [('f', 'force', None, _('run even when the destination is unrelated')), 3611 [('f', 'force', None, _('run even when the destination is unrelated')),