diff -r 2dbd6d259cd2 -r 2f427b57bf90 hgext/rebase.py --- a/hgext/rebase.py Wed Sep 20 09:32:26 2017 -0700 +++ b/hgext/rebase.py Mon Sep 18 10:54:00 2017 -0700 @@ -508,12 +508,12 @@ ui.note(_("update back to initial working directory parent\n")) hg.updaterepo(repo, newwd, False) + collapsedas = None if not self.keepf: - collapsedas = None if self.collapsef: collapsedas = newnode - clearrebased(ui, repo, self.dest, self.state, self.skipped, - collapsedas) + clearrebased(ui, repo, self.dest, self.state, self.skipped, + collapsedas, self.keepf) clearstatus(repo) clearcollapsemsg(repo) @@ -1354,32 +1354,30 @@ state[r] = revprecursor return originalwd, dest.rev(), state -def clearrebased(ui, repo, dest, state, skipped, collapsedas=None): +def clearrebased(ui, repo, dest, state, skipped, collapsedas=None, keepf=False): """dispose of rebased revision at the end of the rebase If `collapsedas` is not None, the rebase was a collapse whose result if the - `collapsedas` node.""" + `collapsedas` node. + + If `keepf` is not True, the rebase has --keep set and no nodes should be + removed (but bookmarks still need to be moved). + """ tonode = repo.changelog.node - # Move bookmark of skipped nodes to destination. This cannot be handled - # by scmutil.cleanupnodes since it will treat rev as removed (no successor) - # and move bookmark backwards. - bmchanges = [(name, tonode(max(adjustdest(repo, rev, dest, state)))) - for rev in skipped - for name in repo.nodebookmarks(tonode(rev))] - if bmchanges: - with repo.transaction('rebase') as tr: - repo._bookmarks.applychanges(repo, tr, bmchanges) - mapping = {} + replacements = {} + moves = {} for rev, newrev in sorted(state.items()): if newrev >= 0 and newrev != rev: - if rev in skipped: - succs = () - elif collapsedas is not None: - succs = (collapsedas,) - else: - succs = (tonode(newrev),) - mapping[tonode(rev)] = succs - scmutil.cleanupnodes(repo, mapping, 'rebase') + oldnode = tonode(rev) + newnode = collapsedas or tonode(newrev) + moves[oldnode] = newnode + if not keepf: + if rev in skipped: + succs = () + else: + succs = (newnode,) + replacements[oldnode] = succs + scmutil.cleanupnodes(repo, replacements, 'rebase', moves) def pullrebase(orig, ui, repo, *args, **opts): 'Call rebase after pull if the latter has been invoked with --rebase'