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'):