Mercurial > hg
comparison hgext/rebase.py @ 28185:c7e8948627f3
rebase: adds storing collapse message (issue4792)
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.
author | liscju <piotr.listkiewicz@gmail.com> |
---|---|
date | Wed, 17 Feb 2016 22:45:01 +0100 |
parents | 5853878bbc2a |
children | 6411140aeda9 |
comparison
equal
deleted
inserted
replaced
28184:11c2f8af09c2 | 28185:c7e8948627f3 |
---|---|
261 ui.warn(_('tool option will be ignored\n')) | 261 ui.warn(_('tool option will be ignored\n')) |
262 | 262 |
263 try: | 263 try: |
264 (originalwd, target, state, skipped, collapsef, keepf, | 264 (originalwd, target, state, skipped, collapsef, keepf, |
265 keepbranchesf, external, activebookmark) = restorestatus(repo) | 265 keepbranchesf, external, activebookmark) = restorestatus(repo) |
266 collapsemsg = restorecollapsemsg(repo) | |
266 except error.RepoLookupError: | 267 except error.RepoLookupError: |
267 if abortf: | 268 if abortf: |
268 clearstatus(repo) | 269 clearstatus(repo) |
270 clearcollapsemsg(repo) | |
269 repo.ui.warn(_('rebase aborted (no revision is removed,' | 271 repo.ui.warn(_('rebase aborted (no revision is removed,' |
270 ' only broken state is cleared)\n')) | 272 ' only broken state is cleared)\n')) |
271 return 0 | 273 return 0 |
272 else: | 274 else: |
273 msg = _('cannot continue inconsistent rebase') | 275 msg = _('cannot continue inconsistent rebase') |
386 _('changesets'), total) | 388 _('changesets'), total) |
387 p1, p2, base = defineparents(repo, rev, target, state, | 389 p1, p2, base = defineparents(repo, rev, target, state, |
388 targetancestors) | 390 targetancestors) |
389 storestatus(repo, originalwd, target, state, collapsef, keepf, | 391 storestatus(repo, originalwd, target, state, collapsef, keepf, |
390 keepbranchesf, external, activebookmark) | 392 keepbranchesf, external, activebookmark) |
393 storecollapsemsg(repo, collapsemsg) | |
391 if len(repo[None].parents()) == 2: | 394 if len(repo[None].parents()) == 2: |
392 repo.ui.debug('resuming interrupted rebase\n') | 395 repo.ui.debug('resuming interrupted rebase\n') |
393 else: | 396 else: |
394 try: | 397 try: |
395 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), | 398 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), |
507 updatebookmarks(repo, targetnode, nstate, currentbookmarks, tr) | 510 updatebookmarks(repo, targetnode, nstate, currentbookmarks, tr) |
508 if activebookmark not in repo._bookmarks: | 511 if activebookmark not in repo._bookmarks: |
509 # active bookmark was divergent one and has been deleted | 512 # active bookmark was divergent one and has been deleted |
510 activebookmark = None | 513 activebookmark = None |
511 clearstatus(repo) | 514 clearstatus(repo) |
515 clearcollapsemsg(repo) | |
512 | 516 |
513 ui.note(_("rebase completed\n")) | 517 ui.note(_("rebase completed\n")) |
514 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True) | 518 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True) |
515 if skipped: | 519 if skipped: |
516 ui.note(_("%d revisions have been skipped\n") % len(skipped)) | 520 ui.note(_("%d revisions have been skipped\n") % len(skipped)) |
843 if v in nstate: | 847 if v in nstate: |
844 # update the bookmarks for revs that have moved | 848 # update the bookmarks for revs that have moved |
845 marks[k] = nstate[v] | 849 marks[k] = nstate[v] |
846 bookmarks.deletedivergent(repo, [targetnode], k) | 850 bookmarks.deletedivergent(repo, [targetnode], k) |
847 marks.recordchange(tr) | 851 marks.recordchange(tr) |
852 | |
853 def storecollapsemsg(repo, collapsemsg): | |
854 'Store the collapse message to allow recovery' | |
855 collapsemsg = collapsemsg or '' | |
856 f = repo.vfs("last-message.txt", "w") | |
857 f.write("%s\n" % collapsemsg) | |
858 f.close() | |
859 | |
860 def clearcollapsemsg(repo): | |
861 'Remove collapse message file' | |
862 util.unlinkpath(repo.join("last-message.txt"), ignoremissing=True) | |
863 | |
864 def restorecollapsemsg(repo): | |
865 'Restore previously stored collapse message' | |
866 try: | |
867 f = repo.vfs("last-message.txt") | |
868 collapsemsg = f.readline().strip() | |
869 f.close() | |
870 except IOError as err: | |
871 if err.errno != errno.ENOENT: | |
872 raise | |
873 raise error.Abort(_('no rebase in progress')) | |
874 return collapsemsg | |
848 | 875 |
849 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, | 876 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, |
850 external, activebookmark): | 877 external, activebookmark): |
851 'Store the current status to allow recovery' | 878 'Store the current status to allow recovery' |
852 f = repo.vfs("rebasestate", "w") | 879 f = repo.vfs("rebasestate", "w") |
1003 if activebookmark and activebookmark in repo._bookmarks: | 1030 if activebookmark and activebookmark in repo._bookmarks: |
1004 bookmarks.activate(repo, activebookmark) | 1031 bookmarks.activate(repo, activebookmark) |
1005 | 1032 |
1006 finally: | 1033 finally: |
1007 clearstatus(repo) | 1034 clearstatus(repo) |
1035 clearcollapsemsg(repo) | |
1008 repo.ui.warn(_('rebase aborted\n')) | 1036 repo.ui.warn(_('rebase aborted\n')) |
1009 return 0 | 1037 return 0 |
1010 | 1038 |
1011 def buildstate(repo, dest, rebaseset, collapse, obsoletenotrebased): | 1039 def buildstate(repo, dest, rebaseset, collapse, obsoletenotrebased): |
1012 '''Define which revisions are going to be rebased and where | 1040 '''Define which revisions are going to be rebased and where |