D4409: rebase: skip *all* obsolete revisions
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Tue Aug 28 07:33:41 UTC 2018
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
We already skip obsolete revisions in some case: if there is no
successor, or when the successor is in the rebase set or in the
destination, I think. However, we instead error out if the successor
is elsewhere (e.g. a child or a sibling of the destination). The
previous commit fixed one specific case of this.
Consider this history (based on a test case updated by this patch):
o D
|
| o B' |
| / |
| o C |
| |
| x B |
| / |
|
o A
If the user now runs `hg rebase -s B -d D` we would error out and tell
them that it would cause divergence from B. This patch makes it so we
instead ignore B and C (and tell the user that we're doing that
because it would cause divergence). I think this simpler model will be
easier for users to understand (I had also thought that all obsolete
commits and their descendants were skipped until we got reports from
users that that wasn't the case).
This should also let us simplify the source quite a bit. I'll do that
in later commits after I've heard people's thoughts on this one.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D4409
AFFECTED FILES
hgext/rebase.py
tests/test-rebase-obsolete.t
CHANGE DETAILS
diff --git a/tests/test-rebase-obsolete.t b/tests/test-rebase-obsolete.t
--- a/tests/test-rebase-obsolete.t
+++ b/tests/test-rebase-obsolete.t
@@ -943,9 +943,7 @@
phases: 8 draft
orphan: 1 changesets
$ hg rebase -s 10 -d 12
- abort: this rebase will cause divergences from: 121d9e3bc4c6
- (to force the rebase please set experimental.evolution.allowdivergence=True)
- [255]
+ note: not rebasing 10:121d9e3bc4c6 "P" and its descendants as this would cause divergence
$ hg log -G
@ 14:73568ab6879d bar foo
|
@@ -1146,14 +1144,13 @@
By allowing divergence, we can perform the rebase.
$ hg rebase -r 'c'::'f' -d 'x'
- abort: this rebase will cause divergences from: 76be324c128b
- (to force the rebase please set experimental.evolution.allowdivergence=True)
- [255]
+ rebasing 3:a82ac2b38757 "c" (c)
+ note: not rebasing 4:76be324c128b "d" (d) and its descendants as this would cause divergence
+ 2 new orphan changesets
$ hg rebase --config experimental.evolution.allowdivergence=true -r 'c'::'f' -d 'x'
rebasing 3:a82ac2b38757 "c" (c)
rebasing 4:76be324c128b "d" (d)
- rebasing 7:1143e9adc121 "f" (f tip)
- 1 new orphan changesets
+ rebasing 7:1143e9adc121 "f" (f)
2 new content-divergent changesets
$ hg log -G -r 'a':: -T instabilities
o 10:e1744ea07510 f
@@ -1289,18 +1286,16 @@
o 0:b173517d0057 a
$ hg rebase -d 0 -r 2
- rebasing 2:a82ac2b38757 "c" (c)
+ note: not rebasing 2:a82ac2b38757 "c" (c) and its descendants as this would cause divergence
$ hg log -G -r 'a': --hidden
- o 5:69ad416a4a26 c
+ * 4:76be324c128b d
|
- | * 4:76be324c128b d
+ | x 3:ef8a456de8fa c1 (pruned)
| |
- | | x 3:ef8a456de8fa c1 (pruned)
- | | |
- | x | 2:a82ac2b38757 c (rewritten using replace as 3:ef8a456de8fa rewritten using rebase as 5:69ad416a4a26)
- | |/
- | o 1:488e1b7e7341 b
+ x | 2:a82ac2b38757 c (rewritten using replace as 3:ef8a456de8fa)
|/
+ o 1:488e1b7e7341 b
+ |
o 0:b173517d0057 a
$ cd ..
@@ -1559,9 +1554,7 @@
1 new orphan changesets
$ hg rebase -b 'desc("D")' -d 'desc("J")'
- abort: this rebase will cause divergences from: 112478962961
- (to force the rebase please set experimental.evolution.allowdivergence=True)
- [255]
+ note: not rebasing 2:112478962961 "B" (B) and its descendants as this would cause divergence
Rebase merge where both parents have successors in destination
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -1888,11 +1888,10 @@
obsoletenotrebased[srcrev] = succrev
break
else:
- # If 'srcrev' has a successor in rebase set but none in
- # destination (which would be catched above), we shall skip it
- # and its descendants to avoid divergence.
- if srcrev in extinctrevs or any(s in destmap for s in succrevs):
- obsoletewithoutsuccessorindestination.add(srcrev)
+ # If 'srcrev' has no successor in destination (which would be
+ # caught above), we shall skip it and its descendants to
+ # avoid divergence.
+ obsoletewithoutsuccessorindestination.add(srcrev)
return (
obsoletenotrebased,
To: martinvonz, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list