Mercurial > hg-stable
comparison hgext/rebase.py @ 13733:4e2690a764c1
rebase: allow for rebasing descendants onto ancestors on different named branches
So far we've been denying rebasing descendants onto ancestors, but there are
situations in which this kind of operation makes perfect sense to me.
Let's say we have made a commit (or more), that belongs to branch 'dev', on
top of the named branch 'stable':
... a (stable) - b (dev)
but then we realize that b should belong to branch 'stable'.
In these cases a rebase means: "move these csets from named branch A to named
branch B" and there isn't a valid reason to deny it.
This patch basically doesn't block it, if source and destination are
on different named branches.
The old behaviour still applies for rebases across the same named branch.
Can you think of any tricky corner cases in which this new behaviour could
lead to problems? (I bet there are tons of them...)
By the way, I created a brand new .t because I feel there should be more
tests I can't think of at the moment.
author | Stefano Tortarolo <stefano.tortarolo@gmail.com> |
---|---|
date | Wed, 23 Mar 2011 01:14:43 +0100 |
parents | ee349e228835 |
children | 627e50e9e316 |
comparison
equal
deleted
inserted
replaced
13732:afe9269dccec | 13733:4e2690a764c1 |
---|---|
480 [s.node for s in repo.mq.applied]): | 480 [s.node for s in repo.mq.applied]): |
481 raise util.Abort(_('cannot rebase onto an applied mq patch')) | 481 raise util.Abort(_('cannot rebase onto an applied mq patch')) |
482 | 482 |
483 if src: | 483 if src: |
484 commonbase = repo[src].ancestor(repo[dest]) | 484 commonbase = repo[src].ancestor(repo[dest]) |
485 samebranch = repo[src].branch() == repo[dest].branch() | |
485 if commonbase == repo[src]: | 486 if commonbase == repo[src]: |
486 raise util.Abort(_('source is ancestor of destination')) | 487 raise util.Abort(_('source is ancestor of destination')) |
487 if commonbase == repo[dest]: | 488 if samebranch and commonbase == repo[dest]: |
488 raise util.Abort(_('source is descendant of destination')) | 489 raise util.Abort(_('source is descendant of destination')) |
489 source = repo[src].rev() | 490 source = repo[src].rev() |
490 if detach: | 491 if detach: |
491 # We need to keep track of source's ancestors up to the common base | 492 # We need to keep track of source's ancestors up to the common base |
492 srcancestors = set(repo.changelog.ancestors(source)) | 493 srcancestors = set(repo.changelog.ancestors(source)) |