[PATCH] rebase: adds storing collapse message (issue4792)

Augie Fackler raf at durin42.com
Mon Feb 22 18:05:11 EST 2016


On Wed, Feb 17, 2016 at 11:10:18PM +0100, liscju wrote:
> # HG changeset patch
> # User liscju <piotr.listkiewicz at gmail.com>
> # Date 1455745501 -3600
> #      Wed Feb 17 22:45:01 2016 +0100
> # Node ID a5fbc43da54ea47b3ff75db25cdd73e70303a19e
> # Parent  a036e1ae1fbe88ab99cb861ebfc2e4da7a3912ca
> rebase: adds storing collapse message (issue4792)

I'm -0 on (ab)using last-message.txt for this, but overall it's enough
of an improvement I've queued this anyway. Thanks!

>
> Before this patch collapse message wasn't stored so when
> you ran into the merge conflict while rebasing, running
> rebase --continue didn't remember the message and
> always opened editor to fill commit message.
>
> This patch adds saving collapse message in
> .hg/last-message.txt and restoring it later
> when needed.
>
> diff -r a036e1ae1fbe -r a5fbc43da54e hgext/rebase.py
> --- a/hgext/rebase.py	Sun Feb 07 00:49:31 2016 -0600
> +++ b/hgext/rebase.py	Wed Feb 17 22:45:01 2016 +0100
> @@ -263,9 +263,11 @@
>              try:
>                  (originalwd, target, state, skipped, collapsef, keepf,
>                   keepbranchesf, external, activebookmark) = restorestatus(repo)
> +                collapsemsg = restorecollapsemsg(repo)
>              except error.RepoLookupError:
>                  if abortf:
>                      clearstatus(repo)
> +                    clearcollapsemsg(repo)
>                      repo.ui.warn(_('rebase aborted (no revision is removed,'
>                                     ' only broken state is cleared)\n'))
>                      return 0
> @@ -457,6 +459,7 @@
>                                               targetancestors)
>                  storestatus(repo, originalwd, target, state, collapsef, keepf,
>                              keepbranchesf, external, activebookmark)
> +                storecollapsemsg(repo, collapsemsg)
>                  if len(repo[None].parents()) == 2:
>                      repo.ui.debug('resuming interrupted rebase\n')
>                  else:
> @@ -578,6 +581,7 @@
>                      # active bookmark was divergent one and has been deleted
>                      activebookmark = None
>          clearstatus(repo)
> +        clearcollapsemsg(repo)
>
>          ui.note(_("rebase completed\n"))
>          util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
> @@ -843,6 +847,29 @@
>              bookmarks.deletedivergent(repo, [targetnode], k)
>      marks.recordchange(tr)
>
> +def storecollapsemsg(repo, collapsemsg):
> +    'Store the collapse message to allow recovery'
> +    collapsemsg = collapsemsg or ''
> +    f = repo.vfs("last-message.txt", "w")
> +    f.write("%s\n" % collapsemsg)
> +    f.close()
> +
> +def clearcollapsemsg(repo):
> +    'Remove collapse message file'
> +    util.unlinkpath(repo.join("last-message.txt"), ignoremissing=True)
> +
> +def restorecollapsemsg(repo):
> +    'Restore previously stored collapse message'
> +    try:
> +        f = repo.vfs("last-message.txt")
> +        collapsemsg = f.readline().strip()
> +        f.close()
> +    except IOError as err:
> +        if err.errno != errno.ENOENT:
> +            raise
> +        raise error.Abort(_('no rebase in progress'))
> +    return collapsemsg
> +
>  def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
>                  external, activebookmark):
>      'Store the current status to allow recovery'
> @@ -1002,6 +1029,7 @@
>
>      finally:
>          clearstatus(repo)
> +        clearcollapsemsg(repo)
>          repo.ui.warn(_('rebase aborted\n'))
>      return 0
>
> diff -r a036e1ae1fbe -r a5fbc43da54e tests/test-rebase-collapse.t
> --- a/tests/test-rebase-collapse.t	Sun Feb 07 00:49:31 2016 -0600
> +++ b/tests/test-rebase-collapse.t	Wed Feb 17 22:45:01 2016 +0100
> @@ -804,3 +804,52 @@
>    base
>
>    $ cd ..
> +
> +Test that rebase --collapse will remember message after
> +running into merge conflict and invoking rebase --continue.
> +
> +  $ hg init collapse_remember_message
> +  $ cd collapse_remember_message
> +  $ touch a
> +  $ hg add a
> +  $ hg commit -m "a"
> +  $ echo "a-default" > a
> +  $ hg commit -m "a-default"
> +  $ hg update -r 0
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  $ hg branch dev
> +  marked working directory as branch dev
> +  (branches are permanent and global, did you want a bookmark?)
> +  $ echo "a-dev" > a
> +  $ hg commit -m "a-dev"
> +  $ hg rebase --collapse -m "a-default-dev" -d 1
> +  rebasing 2:b8d8db2b242d "a-dev" (tip)
> +  merging a
> +  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
> +  unresolved conflicts (see hg resolve, then hg rebase --continue)
> +  [1]
> +  $ rm a.orig
> +  $ hg resolve --mark a
> +  (no more unresolved files)
> +  continue: hg rebase --continue
> +  $ hg rebase --continue
> +  rebasing 2:b8d8db2b242d "a-dev" (tip)
> +  saved backup bundle to $TESTTMP/collapse_remember_message/.hg/strip-backup/b8d8db2b242d-f474c19a-backup.hg (glob)
> +  $ hg log
> +  changeset:   2:12bb766dceb1
> +  tag:         tip
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     a-default-dev
> +
> +  changeset:   1:3c8db56a44bc
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     a-default
> +
> +  changeset:   0:3903775176ed
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     a
> +
> +  $ cd ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list