diff -r fbc3f73dc802 -r 51e7c83e05ee hgext/rebase.py --- a/hgext/rebase.py Wed Dec 07 21:53:03 2016 +0530 +++ b/hgext/rebase.py Mon Nov 28 05:45:22 2016 +0000 @@ -724,12 +724,19 @@ dest = repo[_destrebase(repo, base, destspace=destspace)] destf = str(dest) - commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first() - if commonanc is not None: - rebaseset = repo.revs('(%d::(%ld) - %d)::', - commonanc, base, commonanc) - else: - rebaseset = [] + roots = [] # selected children of branching points + bpbase = {} # {branchingpoint: [origbase]} + for b in base: # group bases by branching points + bp = repo.revs('ancestor(%d, %d)', b, dest).first() + bpbase[bp] = bpbase.get(bp, []) + [b] + if None in bpbase: + # emulate the old behavior, showing "nothing to rebase" (a better + # behavior may be abort with "cannot find branching point" error) + bpbase.clear() + for bp, bs in bpbase.iteritems(): # calculate roots + roots += list(repo.revs('children(%d) & ancestors(%ld)', bp, bs)) + + rebaseset = repo.revs('%ld::', roots) if not rebaseset: # transform to list because smartsets are not comparable to