D1047: tweakdefaults: add restack command

2017-11-12 Thread indygreg (Gregory Szorc)
indygreg added a comment.


  I'm a bit late to the party. But here are my thoughts.
  
  While I think there should be some "auto stabilize" behavior on `hg rebase`, 
I also believe there should be a top-level command or alias for recovering 
orphans. If nothing else, it is because it is a common operation. What that's 
named, I'm not sure. But the implementation of `hg restack` in this patch does 
implement that UI primitive.
  
  Whatever we do, the output of commands that create orphans and would benefit 
from hints to this command. Furthermore, it would be ideal if the terminology 
agreed. Right now, `hg amend` will print e.g. "2 new orphan changesets." That's 
it. What verb you can use to bring these "orphans" back into "stable" history, 
I don't know. "restack" is not exactly intuitive. Neither is "rebase." I think 
we should come up with a better term than "orphan" - one that has a physical 
world relationship to whatever we call "restack." I think concepts like 
"detach" and "stabilize" are more appropriate.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: indygreg, durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-11-09 Thread quark (Jun Wu)
quark abandoned this revision.
quark added a comment.


  This does not belong to tweakdefaults, which is for BC purpose.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread durin42 (Augie Fackler)
durin42 added a comment.


  In https://phab.mercurial-scm.org/D1047#17724, @quark wrote:
  
  > In https://phab.mercurial-scm.org/D1047#17715, @durin42 wrote:
  >
  > > The only concern I have is that this is pretty complicated to express in 
a revset, but if we can figure it out that's almost certainly the way to go...
  >
  >
  > If this is the only concern, how about defining a `_deststabilize(src, 
allsrc)` revset in `rebase`? (since we already have `_destrebase` for now) Then 
the user-facing revset could be shorter and do not require PhD-level knowledge 
to write. This solves extra problems, like we can do extra work to handle the 
divergence case, and do some caching to improve performance on huge repos in 
the revset implementation.
  
  
  Seems fine to me, maybe write up a brief proposal so people don't have to 
read the whole comment thread here?

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread durin42 (Augie Fackler)
durin42 added a comment.


  In https://phab.mercurial-scm.org/D1047#17725, @quark wrote:
  
  > The reason I perfer a revset alias is it's more flexible: people can define 
`auto2` so `-d auto2` just works. Or use `auto` in a more complex way: 
`first(auto|myauto)` (if auto cannot find the destination, use `myauto`).
  
  
  Yeah, that makes sense to me.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
quark added a comment.


  The reason I perfer a revset alias is it's more flexible: people can define 
`auto2` so `-d auto2` just works. Or use `auto` in a more complex way: 
`first(auto|myauto)` (if auto cannot find the destination, use `myauto`).

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
quark added a comment.


  In https://phab.mercurial-scm.org/D1047#17715, @durin42 wrote:
  
  > The only concern I have is that this is pretty complicated to express in a 
revset, but if we can figure it out that's almost certainly the way to go...
  
  
  If this is the only concern, how about defining a `_deststabilize(src, 
allsrc)` revset in `rebase`? (since we already have `_destrebase` for now) Then 
the user-facing revset could be shorter. This solves extra problems, like we 
can do extra work to handle the divergence case, and do some caching to improve 
performance on huge repos in the revset implementation.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread durin42 (Augie Fackler)
durin42 added a comment.


  In https://phab.mercurial-scm.org/D1047#17714, @quark wrote:
  
  > In https://phab.mercurial-scm.org/D1047#17692, @durin42 wrote:
  >
  > > Counterproposal:
  > >
  > > `hg rebase --auto `
  > >
  > > or
  > >
  > > `hg rebase --auto -r `
  > >
  > > rather than introducing a new concept of a stack. I know Facebook has 
this concept internally, but for core hg we don't have the notion of a stack 
outside `mq` and `show`: the former is heavily deprecated, and the latter is 
experimental and still subject to change. Also, I feel like 'automatic rebase' 
is a pretty good description of what's actually happening to resolve the 
trivial orphans-only trouble cases. Thoughts?
  > >
  > > I'd be happy to spend a bit of time writing up a commit for rebase--auto 
if people want to play with it.
  >
  >
  > I'm unconvinced that `--auto` should be bound to the concept of 
stabilization. I think it should be made more flexible. ex. some users may ask 
"why --auto does not rebase my commits to master"?
  
  
  That's a good point. In a perfect world you'd do something like "rebase to my 
successor, unless my successor is an ancestor of the 
otherwise-default-destination, in which case rebase to there."
  
  > Currently, rebase has a non-configurable `_destrebase` revset that is used 
when `-d` is not specified. It's basically useless. And we even have 
`commands.rebase.requiredest` to disable it.
  > 
  > I think we can have proper ways to make it possible that the "default" 
behavior is useful and does the "--auto" thing, while still being flexible.
  > 
  > What I'm thinking about is a config section like:
  > 
  >   [revsetalias:rebase.dest] # revsetalias that is only used in rebase 
destination scope
  >   auto = if(SRC is orphan and 
obsoleted,first(max((successors(max(roots(ALLSRC) & 
::SRC)^)-obsolete())::)+max(::((roots(ALLSRC) & ::SRC)^)-obsolete()
  >   # missing bit: express "ifempty(x, trueset, falseset)" in revset language
  
  I like where your head is at, but I think I'd probably do `[command] 
rebase.dest.auto` to be in line with our current direction on commands.
  
  The only concern I have is that this is pretty complicated to express in a 
revset, but if we can figure it out that's almost certainly the way to go...
  
  > Benefit:
  > 
  > 1. Users can run `hg rebase -r 'draft()' -d auto`, which seems to be 
convenient enough.
  > 2. Sysadmins can override the config so it also works for rebasing to 
`master`. More flexible.
  > 
  >   In addition, we can have something like:
  > 
  >   [commands] # ignored by HGPLAIN rebase.defaultsrcdest = "not public()", 
auto # used when both src and dest are not provided rebase.defaultdest = auto # 
used when src is provided, but not dest rebase.defaultsrc = ("not public()" & 
::.)+(.::)  # used when src is not provided, but dest is provided
  > 
  >   Then users can just run `hg rebase` without arguments.
  
  Overall, I like the (configurable) `rebase --dest auto`, and I think that 
configurable destination shorthand(s) is meritorious even if it doesn't obviate 
an eventual `hg restack` or `hg stabilize` (though I think it does, at least 
for the basic case of having some non-divergent orphans, at least well enough 
we could start enabling more of the obsolete/rebase/histedit/amend stuff out of 
the box.)

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
quark added a comment.


  In https://phab.mercurial-scm.org/D1047#17692, @durin42 wrote:
  
  > Counterproposal:
  >
  > `hg rebase --auto `
  >
  > or
  >
  > `hg rebase --auto -r `
  >
  > rather than introducing a new concept of a stack. I know Facebook has this 
concept internally, but for core hg we don't have the notion of a stack outside 
`mq` and `show`: the former is heavily deprecated, and the latter is 
experimental and still subject to change. Also, I feel like 'automatic rebase' 
is a pretty good description of what's actually happening to resolve the 
trivial orphans-only trouble cases. Thoughts?
  >
  > I'd be happy to spend a bit of time writing up a commit for rebase--auto if 
people want to play with it.
  
  
  I'm unconvinced that `--auto` should be bound to the concept of 
stabilization. I think it should be made more flexible. ex. some users may ask 
"why --auto does not rebase my commits to master"?
  
  Currently, rebase has a non-configurable `_destrebase` revset that is used 
when `-d` is not specified. It's basically useless. And we even have 
`commands.rebase.requiredest` to disable it.
  
  I think we can have proper ways to make it possible that the "default" 
behavior is useful and does the "--auto" thing, while still being flexible.
  
  What I'm thinking about is a config section like:
  
[revsetalias:rebase.dest] # revsetalias that is only used in rebase 
destination scope
auto = if(SRC is orphan and 
obsoleted,first(max((successors(max(roots(ALLSRC) & 
::SRC)^)-obsolete())::)+max(::((roots(ALLSRC) & ::SRC)^)-obsolete()
# missing bit: express "ifempty(x, trueset, falseset)" in revset language
  
  Benefit:
  
  1. Users can run `hg rebase -r 'draft()' -d auto`, which seems to be 
convenient enough.
  2. Sysadmins can override the config so it also works for rebasing to 
`master`. More flexible.
  
  In addition, we can have something like:
  
[commands] # ignored by HGPLAIN
rebase.defaultsrcdest = "not public()", auto # used when both src and dest 
are not provided
rebase.defaultdest = auto # used when src is provided, but not dest
rebase.defaultsrc = ("not public()" & ::.)+(.::)  # used when src is not 
provided, but dest is provided
  
  Then users can just run `hg rebase` without arguments.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread durin42 (Augie Fackler)
durin42 added a comment.


  Counterproposal:
  
  `hg rebase --auto `
  
  or
  
  `hg rebase --auto -r `
  
  rather than introducing a new concept of a stack. I know Facebook has this 
concept internally, but for core hg we don't have the notion of a stack outside 
`mq` and `show`: the former is heavily deprecated, and the latter is 
experimental and still subject to change. Also, I feel like 'automatic rebase' 
is a pretty good description of what's actually happening to resolve the 
trivial orphans-only trouble cases. Thoughts?
  
  I'd be happy to spend a bit of time writing up a commit for rebase--auto if 
people want to play with it.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: durin42, martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
quark added a comment.


  In https://phab.mercurial-scm.org/D1047#17639, @lothiraldan wrote:
  
  > But instead of having an alias, no matter how awesome it is that we can 
implement such command using only revsets, could we have it instead as a 
command? So we could add documentation and a proper help. I'm not sure that all 
end-users will be able to understand the revsets and I don't think the 
tweakdefaults comments will be available to them.
  
  
  I found the revset helpful for understanding what it does. I understand 
non-power users may feel differently.
  
  > I think that there were some discussions about some problems with pruned 
changeset, is there a scenario where restack fails or misbehave with pruned 
changesets?
  
  If you read the comment or the test, it's already handled by using 
`first(A+B)`.
  
  > Also as a user, I would like to restack only my current stack (no matter 
how it is defined) if I have other orphans changesets (like if parts of my 
changesets have been queued), I don't want them to be rebased while I'm working 
on something else.
  
  That's doable by changing `-r`.
  
  > With all these considerations, I would prefer to have restack as an 
experimental extension and not activated by default. We highlight it during 4.4 
announcement so people could test with their own workflow and gives feedback 
before activating it by default.
  
  That sounds okay. I'll move the code to `hgext`.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread martinvonz (Martin von Zweigbergk)
martinvonz added a comment.


  In https://phab.mercurial-scm.org/D1047#17639, @lothiraldan wrote:
  
  > I'm +1 for having stabilization command in core that handles 80% of the 
use-case which is mid-stack amend.
  >
  > But instead of having an alias, no matter how awesome it is that we can 
implement such command using only revsets, could we have it instead as a 
command? So we could add documentation and a proper help. I'm not sure that all 
end-users will be able to understand the revsets and I don't think the 
tweakdefaults comments will be available to them.
  >
  > I think that there were some discussions about some problems with pruned 
changeset, is there a scenario where restack fails or misbehave with pruned 
changesets?
  >
  > Also as a user, I would like to restack only my current stack (no matter 
how it is defined) if I have other orphans changesets (like if parts of my 
changesets have been queued), I don't want them to be rebased while I'm working 
on something else.
  >
  > With all these considerations, I would prefer to have restack as an 
experimental extension and not activated by default. We highlight it during 4.4 
announcement so people could test with their own workflow and gives feedback 
before activating it by default.
  
  
  I agree with all the above.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: martinvonz, lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread lothiraldan (Boris Feld)
lothiraldan added a comment.


  I'm +1 for having stabilization command in core that handles 80% of the 
use-case which is mid-stack amend.
  
  But instead of having an alias, no matter how awesome it is that we can 
implement such command using only revsets, could we have it instead as a 
command? So we could add documentation and a proper help. I'm not sure that all 
end-users will be able to understand the revsets and I don't think the 
tweakdefaults comments will be available to them.
  
  I think that there were some discussions about some problems with pruned 
changeset, is there a scenario where restack fails or misbehave with pruned 
changesets?
  
  Also as a user, I would like to restack only my current stack (no matter how 
it is defined) if I have other orphans changesets (like if parts of my 
changesets have been queued), I don't want them to be rebased while I'm working 
on something else.
  
  With all these considerations, I would prefer to have restack as an 
experimental extension and not activated by default. We highlight it during 4.4 
announcement so people could test with their own workflow and gives feedback 
before activating it by default.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: lothiraldan, dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
quark added a comment.


  In https://phab.mercurial-scm.org/D1047#17465, @dlax wrote:
  
  > As an end user, I'd probably not use this; it's too much magic.
  
  
  `restack` is used pretty frequently by internal users. I think it could be 
hard for some users (ex. designers) to understand the DAG, or know what to do 
after `hg amend` in the middle of a stack. So this command is pretty handy.
  
  I also think it's at least less magic than `evolve` since the it's just a 
plain rebase with a fancy revset (displayed when you run `--help`). Users 
understanding revsets could follow its logic and understand what it's doing.

INLINE COMMENTS

> dlax wrote in ui.py:56
> Maybe also explain what `ALLSRC` and `SRC` are.
> Also, it's not clear from reading this which "orphaned changesets" would be 
> rebased. All of them?

This will be explained in rebase command help text (by the time experimental 
flag gets removed).

> dlax wrote in ui.py:86
> Do we want to activate an experimental option in tweakdefaults?

I think it's fine since this is invisible to end-user. I also plan to remove 
the experimental flag soon(tm).

> dlax wrote in test-tweakdefaults-restack.t:28
> It's not obvious where wordking directory is, so maybe issue a `hg log -r .`

Working directory is `null`. Since `rebase` is expected to take care of working 
directory movement and that is covered by rebase tests, I think it's okay to 
not care about working directory here.

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread dlax (Denis Laxalde)
dlax added a comment.


  As an end user, I'd probably not use this; it's too much magic.

INLINE COMMENTS

> ui.py:56
> +# Destination revset explanation:
> +# - max(roots(ALLSRC) & ::SRC)^
> +#   The obsoleted changeset that the SRC stack is based on.

Maybe also explain what `ALLSRC` and `SRC` are.
Also, it's not clear from reading this which "orphaned changesets" would be 
rebased. All of them?

> ui.py:86
> +[experimental]
> +rebase.multidest = 1
>  """

Do we want to activate an experimental option in tweakdefaults?

> test-tweakdefaults-restack.t:28
> +  > EOS
> +  $ hg restack
> +  rebasing 6:799bf3a4122a "B3" (B3)

It's not obvious where wordking directory is, so maybe issue a `hg log -r .`

REPOSITORY
  rHG Mercurial

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

To: quark, #hg-reviewers
Cc: dlax, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
quark updated this revision to Diff 2665.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D1047?vs=2654=2665

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,80 @@
+  $ cat >> $HGRCPATH< [ui]
+  > tweakdefaults=1
+  > [extensions]
+  > drawdag=$TESTDIR/drawdag.py
+  > [experimental]
+  > stabilization=createmarkers allowunstable
+  > EOF
+
+  $ hg init repo1
+  $ cd repo1
+  $ hg debugdrawdag <<'EOS'
+  >   HI
+  >   ||
+  >   G   E2   # rebase: E1 -> E2
+  >   ||
+  >  E1F   # prune: F
+  >   ||
+  >   CD
+  >   ||
+  >  B1 B2 B3  # amend: B1 -> B2 -> B3
+  >   \ | /
+  >\|/
+  > A1  A2 # amend: A1 -> A2
+  > |   |
+  > X   Y
+  > EOS
+  $ hg restack
+  rebasing 6:799bf3a4122a "B3" (B3)
+  rebasing 8:288ec50c8e7e "D" (D)
+  rebasing 11:eccb0cc6c7e4 "E2" (E2)
+  rebasing 14:4d27b6814343 "I" (I tip)
+  rebasing 7:5c2d17df3d86 "C" (C)
+  rebasing 12:f2b51a466fe6 "G" (G)
+  rebasing 13:7aee36f22fb4 "H" (H)
+  $ hg log -G -T '{desc}' -r 'sort(all(), topo)'
+  o  H
+  |
+  o  G
+  |
+  o  C
+  |
+  o  I
+  |
+  o  E2
+  |
+  o  D
+  |
+  o  B3
+  |
+  o  A2
+  |
+  | x  I
+  | |
+  | x  E2
+  | |
+  | x  F
+  | |
+  | x  D
+  | |
+  | x  B3
+  | |
+  | | x  H
+  | | |
+  | | x  G
+  | | |
+  | | x  E1
+  | | |
+  | | x  C
+  | | |
+  | | x  B1
+  | |/
+  | | x  B2
+  | |/
+  | x  A1
+  | |
+  o |  Y
+   /
+  o  X
+  
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
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1047: tweakdefaults: add restack command

2017-10-13 Thread quark (Jun Wu)
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< [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
+  >   ||
+  >  F1H   # prune: H
+  >   ||
+  >   DE
+  >   ||
+  >  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
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel