Mercurial > hg
comparison hgext/rebase.py @ 34354:2f427b57bf90 stable 4.3.3
rebase: move bookmarks with --keep (issue5682)
This is a regression caused by 3b7cb3d17137. We have documented the behavior
in rebase help:
Rebase will destroy original commits unless you use "--keep". It will
also move your bookmarks (even if you do).
So let's restore the old behavior.
It is done by changing `scmutil.cleanupnodes` to accept more information so
a node could have different "movement destination" from "successors". It
also helps simplifying the callsite as a side effect - the special bookmark
movement logic in rebase is removed.
Differential Revision: https://phab.mercurial-scm.org/D727
author | Jun Wu <quark@fb.com> |
---|---|
date | Mon, 18 Sep 2017 10:54:00 -0700 |
parents | 5a5f600b06ad |
children | f61f5af5ed31 |
comparison
equal
deleted
inserted
replaced
34353:2dbd6d259cd2 | 34354:2f427b57bf90 |
---|---|
506 newwd = self.originalwd | 506 newwd = self.originalwd |
507 if newwd not in [c.rev() for c in repo[None].parents()]: | 507 if newwd not in [c.rev() for c in repo[None].parents()]: |
508 ui.note(_("update back to initial working directory parent\n")) | 508 ui.note(_("update back to initial working directory parent\n")) |
509 hg.updaterepo(repo, newwd, False) | 509 hg.updaterepo(repo, newwd, False) |
510 | 510 |
511 collapsedas = None | |
511 if not self.keepf: | 512 if not self.keepf: |
512 collapsedas = None | |
513 if self.collapsef: | 513 if self.collapsef: |
514 collapsedas = newnode | 514 collapsedas = newnode |
515 clearrebased(ui, repo, self.dest, self.state, self.skipped, | 515 clearrebased(ui, repo, self.dest, self.state, self.skipped, |
516 collapsedas) | 516 collapsedas, self.keepf) |
517 | 517 |
518 clearstatus(repo) | 518 clearstatus(repo) |
519 clearcollapsemsg(repo) | 519 clearcollapsemsg(repo) |
520 | 520 |
521 ui.note(_("rebase completed\n")) | 521 ui.note(_("rebase completed\n")) |
1352 state[r] = revpruned | 1352 state[r] = revpruned |
1353 else: | 1353 else: |
1354 state[r] = revprecursor | 1354 state[r] = revprecursor |
1355 return originalwd, dest.rev(), state | 1355 return originalwd, dest.rev(), state |
1356 | 1356 |
1357 def clearrebased(ui, repo, dest, state, skipped, collapsedas=None): | 1357 def clearrebased(ui, repo, dest, state, skipped, collapsedas=None, keepf=False): |
1358 """dispose of rebased revision at the end of the rebase | 1358 """dispose of rebased revision at the end of the rebase |
1359 | 1359 |
1360 If `collapsedas` is not None, the rebase was a collapse whose result if the | 1360 If `collapsedas` is not None, the rebase was a collapse whose result if the |
1361 `collapsedas` node.""" | 1361 `collapsedas` node. |
1362 | |
1363 If `keepf` is not True, the rebase has --keep set and no nodes should be | |
1364 removed (but bookmarks still need to be moved). | |
1365 """ | |
1362 tonode = repo.changelog.node | 1366 tonode = repo.changelog.node |
1363 # Move bookmark of skipped nodes to destination. This cannot be handled | 1367 replacements = {} |
1364 # by scmutil.cleanupnodes since it will treat rev as removed (no successor) | 1368 moves = {} |
1365 # and move bookmark backwards. | |
1366 bmchanges = [(name, tonode(max(adjustdest(repo, rev, dest, state)))) | |
1367 for rev in skipped | |
1368 for name in repo.nodebookmarks(tonode(rev))] | |
1369 if bmchanges: | |
1370 with repo.transaction('rebase') as tr: | |
1371 repo._bookmarks.applychanges(repo, tr, bmchanges) | |
1372 mapping = {} | |
1373 for rev, newrev in sorted(state.items()): | 1369 for rev, newrev in sorted(state.items()): |
1374 if newrev >= 0 and newrev != rev: | 1370 if newrev >= 0 and newrev != rev: |
1375 if rev in skipped: | 1371 oldnode = tonode(rev) |
1376 succs = () | 1372 newnode = collapsedas or tonode(newrev) |
1377 elif collapsedas is not None: | 1373 moves[oldnode] = newnode |
1378 succs = (collapsedas,) | 1374 if not keepf: |
1379 else: | 1375 if rev in skipped: |
1380 succs = (tonode(newrev),) | 1376 succs = () |
1381 mapping[tonode(rev)] = succs | 1377 else: |
1382 scmutil.cleanupnodes(repo, mapping, 'rebase') | 1378 succs = (newnode,) |
1379 replacements[oldnode] = succs | |
1380 scmutil.cleanupnodes(repo, replacements, 'rebase', moves) | |
1383 | 1381 |
1384 def pullrebase(orig, ui, repo, *args, **opts): | 1382 def pullrebase(orig, ui, repo, *args, **opts): |
1385 'Call rebase after pull if the latter has been invoked with --rebase' | 1383 'Call rebase after pull if the latter has been invoked with --rebase' |
1386 ret = None | 1384 ret = None |
1387 if opts.get('rebase'): | 1385 if opts.get('rebase'): |