diff --git a/hgext/transplant.py b/hgext/transplant.py --- a/hgext/transplant.py +++ b/hgext/transplant.py @@ -412,6 +412,17 @@ # this is kept only to reduce changes in a patch. pass + def stop(self, ui, repo): + """logic to stop an interrupted transplant""" + if self.canresume(): + startctx = repo['.'] + hg.updaterepo(repo, startctx.node(), overwrite=True) + ui.status(_("stopped the interrupted transplant\n")) + ui.status(_("working directory is now at %s\n") % + startctx.hex()[:12]) + self.unlog() + return 0 + def readseries(self): nodes = [] merges = [] @@ -559,6 +570,7 @@ _('parent to choose when transplanting merge'), _('REV')), ('e', 'edit', False, _('invoke editor on commit messages')), ('', 'log', None, _('append transplant info to log message')), + ('', 'stop', False, _('stop interrupted transplant')), ('c', 'continue', None, _('continue last transplant session ' 'after fixing conflicts')), ('', 'filter', '', @@ -646,6 +658,11 @@ raise error.Abort(_('--continue is incompatible with ' '--branch, --all and --merge')) return + if opts.get('stop'): + if opts.get('branch') or opts.get('all') or opts.get('merge'): + raise error.Abort(_('--stop is incompatible with ' + '--branch, --all and --merge')) + return if not (opts.get('source') or revs or opts.get('merge') or opts.get('branch')): raise error.Abort(_('no source URL, branch revision, or revision ' @@ -676,6 +693,10 @@ if not tp.canresume(): raise error.Abort(_('no transplant to continue')) else: + if opts.get('stop'): + if not tp.canresume(): + raise error.Abort(_('no interrupted transplant found')) + return tp.stop(ui, repo) cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) @@ -769,8 +790,8 @@ 'transplant', fname='transplant/journal', clearable=True, continuefunc=continuecmd, statushint=_('To continue: hg transplant --continue\n' - 'To abort: hg update'), - cmdhint=_("use 'hg transplant --continue' or 'hg update' to abort") + 'To stop: hg transplant --stop'), + cmdhint=_("use 'hg transplant --continue' or 'hg transplant --stop'") ) # tell hggettext to extract docstrings from these functions: diff --git a/tests/test-transplant.t b/tests/test-transplant.t --- a/tests/test-transplant.t +++ b/tests/test-transplant.t @@ -2,6 +2,7 @@ $ cat <> $HGRCPATH > [extensions] > transplant= + > graphlog= > EOF #if continueflag @@ -19,6 +20,9 @@ $ hg transplant --continue --all abort: --continue is incompatible with --branch, --all and --merge [255] + $ hg transplant --stop --all + abort: --stop is incompatible with --branch, --all and --merge + [255] $ hg transplant --all tip abort: --all requires a branch revision [255] @@ -376,7 +380,8 @@ applying 722f4667af76 722f4667af76 transplanted to 76e321915884 -transplant --continue + +transplant --continue and --stop behaviour $ hg init ../tc $ cd ../tc @@ -416,6 +421,36 @@ $ echo foobar > foo $ hg ci -mfoobar created new head + +Repo log before transplant + $ hg glog + @ changeset: 4:e8643552fde5 + | tag: tip + | parent: 0:493149fa1541 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: foobar + | + | o changeset: 3:1dab759070cf + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: bar2 + | | + | o changeset: 2:9d6d6b5a8275 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: bar + | | + | o changeset: 1:46ae92138f3c + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: foo2 + | + o changeset: 0:493149fa1541 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: foo + $ hg transplant 1:3 applying 46ae92138f3c patching file foo @@ -425,6 +460,49 @@ abort: fix up the working directory and run hg transplant --continue [255] + $ hg transplant --stop + stopped the interrupted transplant + working directory is now at e8643552fde5 +Repo log after abort + $ hg glog + @ changeset: 4:e8643552fde5 + | tag: tip + | parent: 0:493149fa1541 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: foobar + | + | o changeset: 3:1dab759070cf + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: bar2 + | | + | o changeset: 2:9d6d6b5a8275 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: bar + | | + | o changeset: 1:46ae92138f3c + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: foo2 + | + o changeset: 0:493149fa1541 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: foo + + $ hg transplant 1:3 + applying 46ae92138f3c + file added already exists + 1 out of 1 hunks FAILED -- saving rejects to file added.rej + patching file foo + Hunk #1 FAILED at 0 + 1 out of 1 hunks FAILED -- saving rejects to file foo.rej + patch failed to apply + abort: fix up the working directory and run hg transplant --continue + [255] + transplant -c shouldn't use an old changeset $ hg up -C @@ -436,6 +514,9 @@ abort: no transplant to continue (continueflag !) abort: no operation in progress (no-continueflag !) [255] + $ hg transplant --stop + abort: no interrupted transplant found + [255] $ hg transplant 1 applying 46ae92138f3c patching file foo @@ -489,23 +570,23 @@ [255] $ hg transplant 1:3 abort: transplant in progress - (use 'hg transplant --continue' or 'hg update' to abort) + (use 'hg transplant --continue' or 'hg transplant --stop') [255] $ hg status -v A bar + ? added.rej ? baz.rej ? foo.rej # The repository is in an unfinished *transplant* state. # To continue: hg transplant --continue - # To abort: hg update + # To stop: hg transplant --stop $ echo fixed > baz $ hg continue 9d6d6b5a8275 transplanted as d80c49962290 applying 1dab759070cf 1dab759070cf transplanted to aa0ffe6bd5ae - $ cd .. Issue1111: Test transplant --merge