D3959: rebase: add --stop option to stop rebase at any point (issue5206)

Yuya Nishihara yuya at tcha.org
Wed Aug 8 13:06:00 UTC 2018


> -    def _finishrebase(self):
> +    def _finishrebase(self, stoprebase=False):
>          repo, ui, opts = self.repo, self.ui, self.opts
>          fm = ui.formatter('rebase', opts)
>          fm.startitem()
> +        if stoprebase:
> +            self.restorestatus()
> +            if self.collapsef:
> +                ui.status(_("cannot stop in --collapse session\n"))
> +                return

raise Abort because it's an error?

> +
> +            allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
> +            if not (self.keepf or allowunstable):
> +                raise error.Abort(_("can't remove original changesets with"
> +                      " unrebased descendants"),
> +                    hint=_('either enable obsmarkers to allow unstable '
> +                           'revisions or use --keep to keep original '
> +                           'changesets'))

It will be nice if we can move the pre-process out from `_finishrebase()`,
and get rid of the `stoprebase` flag somehow.

>          if self.collapsef:
>              p1, p2, _base = defineparents(repo, min(self.state), self.destmap,
>                                            self.state, self.skipped,
> @@ -626,7 +640,10 @@
>              newwd = self.originalwd
>          if newwd not in [c.rev() for c in repo[None].parents()]:
>              ui.note(_("update back to initial working directory parent\n"))
> -            hg.updaterepo(repo, newwd, overwrite=False)
> +            if stoprebase:
> +                hg.updaterepo(repo, newwd, overwrite=True)
> +            else:
> +                hg.updaterepo(repo, newwd, overwrite=False)

This implies an interrupted merge won't be cleared if no update is required.
(try `hg up 3 && hg rebase -s 1 -d 5` in the first test you've added.)

Perhaps the `rebase --stop` flow can be processed as follows?

```
       rbsrt = rebaseruntime(repo, ui)
       rbsrt.restorestatus()
       ... check unsupported options ...
       with repo.wlock(), repo.lock():
           if needupdate(repo, state):
               .. update to the current working revision with overwrite=True
               .. to clear interrupted merge
           rbsrt._finishrebase()
```


More information about the Mercurial-devel mailing list