D1047: tweakdefaults: add restack command

quark (Jun Wu) phabricator at mercurial-scm.org
Fri Oct 13 06:02:36 UTC 2017


quark created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  The restack command uses a predefined rebase revset that moves orphaned
  changesets to places so they are no longer orphaned.
  
  This is a highly wanted feature.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1047

AFFECTED FILES
  mercurial/ui.py
  tests/test-tweakdefaults-restack.t

CHANGE DETAILS

diff --git a/tests/test-tweakdefaults-restack.t b/tests/test-tweakdefaults-restack.t
new file mode 100644
--- /dev/null
+++ b/tests/test-tweakdefaults-restack.t
@@ -0,0 +1,54 @@
+  $ cat >> $HGRCPATH<<EOF
+  > [ui]
+  > tweakdefaults=1
+  > [extensions]
+  > drawdag=$TESTDIR/drawdag.py
+  > [experimental]
+  > stabilization=createmarkers allowunstable
+  > EOF
+
+  $ hg init repo1
+  $ cd repo1
+  $ hg debugdrawdag <<'EOS'
+  >   G1  F2   # rebase: F1 -> F2
+  >   |    |
+  >  F1    H   # prune: H
+  >   |    |
+  >   D    E
+  >   |    |
+  >  B1 B2 B3  # amend: B1 -> B2 -> B3
+  >   \ | /
+  >    \|/
+  >     A
+  > EOS
+  $ hg restack
+  rebasing 8:70cffc4fc494 "F2" (F2)
+  rebasing 4:68fe7abd1dcc "D" (D)
+  rebasing 9:7c43db0f1f66 "G1" (G1 tip)
+  $ hg log -G -T '{desc}' -r 'sort(all(), topo)'
+  o  G1
+  |
+  o  D
+  |
+  o  F2
+  |
+  | x  F2
+  | |
+  | x  H
+  |/
+  o  E
+  |
+  o  B3
+  |
+  | x  B2
+  |/
+  | x  G1
+  | |
+  | x  F1
+  | |
+  | x  D
+  | |
+  | x  B1
+  |/
+  o  A
+  
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -50,6 +50,27 @@
 # The rollback command is dangerous. As a rule, don't use it.
 rollback = False
 
+[alias]
+# Move orphaned changesets to better places.
+# Destination revset explanation:
+# - max(roots(ALLSRC) & ::SRC)^
+#   The obsoleted changeset that the SRC stack is based on.
+# - successors(...)-obsolete()
+#   A non-obsoleted successor. Or an empty set (no successor).
+# - max(...::)
+#   Get the top of the stack, so history is more linear.
+#   This is the rebase destination for SRC when there is a successor.
+# - max(::((roots(ALLSRC) & ::SRC)^)-obsolete())
+#   The first non-obsoleted changeset before the obsoleted changeset that the
+#   SRC stack is based on.
+#   This is the rebase destination for SRC when there is no successor.
+# - first(A+B)
+#   Pick B if A is empty.
+restack = rebase
+ -r 'orphan()-obsolete()'
+ -d 'first(max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::)+
+           max(::((roots(ALLSRC) & ::SRC)^)-obsolete()))'
+
 [commands]
 # Make `hg status` emit cwd-relative paths by default.
 status.relative = yes
@@ -60,6 +81,9 @@
 
 [diff]
 git = 1
+
+[experimental]
+rebase.multidest = 1
 """
 
 samplehgrcs = {



To: quark, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list