Mercurial > evolve
diff docs/tutorial/draft.md @ 3376:aad37ffd7d58
doc: import the training support
Import the training support which was stored in a private-repository before.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Mon, 08 Jan 2018 11:46:53 +0100 |
parents | |
children | 803d32f4e498 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/tutorial/draft.md Mon Jan 08 11:46:53 2018 +0100 @@ -0,0 +1,1288 @@ +--- +author: Boris Feld <boris.feld@octobus.net> +title: Changeset evolution +date: June 23, 2017 +--- + +# Why Evolve is the future? (TO CHANGE) + +Use hexagon or drop all of themes +Use old names +Replace hg amend by commit --amend + +Flow + +Basic - Feature - Tool / instability - command semantic + +Basic (local amend + local rebase) + +Stabilization -> Evolution + +Feature + +# Local amend + +## Amending commits + +We all makes mistake: + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fx bug[case"; + } +~~~ + +## Some times pass + +## Urgent Amend needed + +But it's easy to fix the fix: + +~~~ {.sh} +hg commit --amend -m "Fix bug" +~~~ + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fix bug"; + } +~~~ + +## So easy to do something wrong + +But wait you had local changes! And they get incorporated into the amend. + +## Too bad + +It's too late, they are gone! + +<img src="https://media1.giphy.com/media/vMiCDfoKdJP0c/giphy.gif"> + +## HARD + +UNbundle, get the rev, strip + +## Never without Evolve! + +<img src="https://media3.giphy.com/media/EVbEdEW3kuu0o/giphy.gif"> + + +## Let's try again! + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fx bug"; + } +~~~ + +## Evolve powa + +With evolve this time: + +~~~ {.sh} +hg commit --amend -m "Fix bug" +~~~ + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fix bug"; + } +~~~ + +## Ok what the difference? + +<pre class="shell_output"> +$> hg log -G +@ <span style="color:olive;">changeset: 3:467de638a224</span> +| tag: tip +| parent: 0:852811e0e2a8 +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:15:55 2017 +0200 +| summary: Fix bug +| +o <span style="color:olive;">changeset: 0:852811e0e2a8</span> + user: Boris Feld <boris.feld@octobus.net> + date: Wed Jun 21 14:15:55 2017 +0200 + summary: Root + +</pre> + +## The difference + +<pre class="shell_output"> +$> hg log -G --hidden +@ <span style="color:olive;">changeset: 3:467de638a224</span> +| tag: tip +| parent: 0:852811e0e2a8 +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:15:55 2017 +0200 +| summary: Fix bug +| +| x <span style="color:olive;">changeset: 2:614cb09cc83d</span> +| | user: Boris Feld <boris.feld@octobus.net> +| | date: Wed Jun 21 14:15:55 2017 +0200 +| | summary: temporary amend commit for e46245132d3d +| | +| x <span style="color:olive;">changeset: 1:e46245132d3d</span> +|/ user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:15:55 2017 +0200 +| summary: Fx bug +| +o <span style="color:olive;">changeset: 0:852811e0e2a8</span> + user: Boris Feld <boris.feld@octobus.net> + date: Wed Jun 21 14:15:55 2017 +0200 + summary: Root + +</pre> + +## Perf impact + +No strip == no cache bust, == faster + +# Local rebase + +## You are working on your branch + +~~~graphviz + digraph G { + rankdir="LR"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=feature]; + Parent -> "Feature"; + } +~~~ + +## More work + +~~~graphviz + digraph G { + rankdir="LR"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=feature]; + Parent -> "Feature" -> "Feature 2"; + } +~~~ + +## Pull + +~~~graphviz + digraph G { + rankdir="LR"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Trunk" -> "Trunk 2"; + + node[group=feature]; + Parent -> "Feature" -> "Feature 2"; + } +~~~ + +## Time to rebase + +~~~graphviz + digraph G { + rankdir="LR"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Trunk" -> "Trunk 2"; + + node[group=feature]; + "Trunk 2" -> "Feature" -> "Feature 2"; + } +~~~ + +## Without evolve + +<pre class="shell_output"> +@ <span style="color:olive;">changeset: 6:105f743d81c8</span> +| tag: tip +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:47:48 2017 +0200 +| summary: Feature2 +| +o <span style="color:olive;">changeset: 5:3966a515e569</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:47:48 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 4:bd3d94325819</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:47:49 2017 +0200 +| summary: Trunk2 +| +o <span style="color:olive;">changeset: 3:120d3e4ce8b7</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:47:49 2017 +0200 +| summary: Trunk +| +o <span style="color:olive;">changeset: 2:36db121866a2</span> +| user: Boris Feld <boris.feld@octobus.net> +~ date: Wed Jun 21 14:47:48 2017 +0200 + summary: Parent + +</pre> + +## With evolve + +<pre style="font-size: 0.25em !important;"> +@ <span style="color:olive;">changeset: 10:2c1a992b87c3</span> +| tag: tip +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature2 +| +o <span style="color:olive;">changeset: 9:751113c206d0</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 8:9f9f3db01630</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Trunk2 +| +o <span style="color:olive;">changeset: 7:a5e9a3060e20</span> +| parent: 4:32253567b531 +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Trunk +| +| x <span style="color:olive;">changeset: 6:a57f1852d740</span> +| | branch: feature +| | user: Boris Feld <boris.feld@octobus.net> +| | date: Wed Jun 21 14:50:39 2017 +0200 +| | summary: Feature2 +| | +| x <span style="color:olive;">changeset: 5:896dc0771e5e</span> +|/ branch: feature +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 4:32253567b531</span> +| user: Boris Feld <boris.feld@octobus.net> +~ date: Wed Jun 21 14:50:39 2017 +0200 + summary: Parent + +</pre> + +# How does it works? + +## It's smart + +<img src="https://media2.giphy.com/media/ZThQqlxY5BXMc/giphy.gif"> + +## Does Evolve only stores more changesets? (CHANGE) + +## Not only + +Remember our amend? + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 50%'> +~~~graphviz + digraph G { + rankdir="BT"; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fx bug"; + } +~~~ +</div> + +<div class='right' style='order:2; width: 50%'> + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fix bug"; + } +~~~ +</div> +</div> + +## More revisions + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 50%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fx bug"; + } +~~~ +</div> + +<div class='right' style='order:2; width: 50%'> + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fix bug"; + node[group=obsolete]; + Parent -> "Fx bug"; + } +~~~ +</div> +</div> + +## But hidden + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 50%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fx bug"; + } +~~~ +</div> + +<div class='right' style='order:2; width: 50%'> + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fix bug"; + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Parent -> "Fx bug"; + } +~~~ +</div> +</div> + +## Here is the smartness (change word)! + +~~~graphviz + digraph G { + rankdir="BT"; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Parent -> "Fix bug"; + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Parent -> "Fx bug"; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "Fx bug" -> "Fix bug"; + } +~~~ + +## Obs markers + +Obs markers stores the relation between a changeset and its evolutions. + +XXX: Speak about META + +~~~graphviz + digraph G { + rankdir="BT"; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + node[group=obsolete, style="dotted, filled" fillcolor="#DFDFFF"]; + edge[dir=back, style=dotted, arrowtail=dot]; + "Predecessor" -> "Successor"; + + "Successor" [style="filled", fillcolor="#7F7FFF"]; + } +~~~ + + +# Phases + +## 3 phases + +Changesets can be in one of three phases: + +* Public +* Draft +* Secrets + +## Public + +The public phase holds changesets that have been exchanged publicly. + +Changesets in the public phase are expected to remain in your repository history and are said to be immutable. + +## Drafts + +The draft phase holds changesets that are not yet considered a part of the repository's permanent history. + +You can safely rewrite them. + +New commits are in the draft phase by default. + +## Secrets (hide) + +The secret phase holds changesets that you do not want to exchange with other repositories. + +Secret changesets are hidden from remote peers and will not be included in push operations. + +Manual operations or extensions may move a changeset into the secret phase. + +## Representation + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF"]; + + // Revisions + node[group=main]; + Public -> Draft -> Secret; + + Draft [shape="pentagon"]; + Secret [shape="square"]; + } +~~~ + +# Instability (add sub-titles, obsolete -> orphan, etc...) + +## Obsolete + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"]; + + + node[group=main]; + Root -> New; + node[group=obsolete]; + Root -> Obsolete; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + Obsolete -> New; + + Obsolete [fillcolor="#DFDFFF"]; + Root[shape="circle"]; + } +~~~ + +## Unstable + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"]; + + node[group=main]; + Root -> New; + node[group=obsolete]; + Root -> Obsolete -> Unstable; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + Obsolete -> New; + + Obsolete [fillcolor="#DFDFFF"]; + Unstable [fillcolor="#FF3535"]; + Root[shape="circle"]; + } +~~~ + +## Bumped + +## Divergent + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"]; + + Root -> Base; + Root -> Divergent1; + Root -> Divergent2; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + Base -> Divergent1; + Base -> Divergent2; + + Base [shape="pentagon", fillcolor="#DFDFFF"]; + Divergent1 [fillcolor="#FF3535"]; + Divergent2 [fillcolor="#FF3535"]; + Root[shape="circle"]; + } +~~~ + +# Topic + +# CHANGE TITLE (LATER IN THE FLOW) + +## Log on obsolete + +<pre style="font-size: 0.25em;"> +$> hg log -G +o <span style="color:olive;">changeset: 10:2c1a992b87c3</span> +| tag: tip +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature2 +| +o <span style="color:olive;">changeset: 9:751113c206d0</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 8:9f9f3db01630</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Trunk2 +| +o <span style="color:olive;">changeset: 7:a5e9a3060e20</span> +| parent: 4:32253567b531 +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Trunk +| +| @ <span style="color:olive;">changeset: 6:a57f1852d740</span> +| | branch: feature +| | user: Boris Feld <boris.feld@octobus.net> +| | date: Wed Jun 21 14:50:39 2017 +0200 +| | summary: Feature2 +| | +| x <span style="color:olive;">changeset: 5:896dc0771e5e</span> +|/ branch: feature +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 4:32253567b531</span> +| user: Boris Feld <boris.feld@octobus.net> +~ date: Wed Jun 21 14:50:39 2017 +0200 + summary: Parent + +</pre> + +## Log with hidden + +<pre style="font-size: 0.25em;"> +$ hg log -G --hidden +@ <span style="color:olive;">changeset: 10:2c1a992b87c3</span> +| tag: tip +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature2 +| +o <span style="color:olive;">changeset: 9:751113c206d0</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 8:9f9f3db01630</span> +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Trunk2 +| +o <span style="color:olive;">changeset: 7:a5e9a3060e20</span> +| parent: 4:32253567b531 +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Trunk +| +| x <span style="color:olive;">changeset: 6:a57f1852d740</span> +| | branch: feature +| | user: Boris Feld <boris.feld@octobus.net> +| | date: Wed Jun 21 14:50:39 2017 +0200 +| | summary: Feature2 +| | +| x <span style="color:olive;">changeset: 5:896dc0771e5e</span> +|/ branch: feature +| user: Boris Feld <boris.feld@octobus.net> +| date: Wed Jun 21 14:50:39 2017 +0200 +| summary: Feature +| +o <span style="color:olive;">changeset: 4:32253567b531</span> +| user: Boris Feld <boris.feld@octobus.net> +~ date: Wed Jun 21 14:50:39 2017 +0200 + summary: Parent + +</pre> + +## Obslog + +Behold our savior Obslog! + +## Obslog + +<pre class="shell_output"> +$> hg obslog -r 3 +o <span style="color:olive;">c4414d4a5955</span> <span style="color:blue;">(3)</span> Fix bug +| +x <span style="color:olive;">9b5b4aa63d51</span> <span style="color:blue;">(1)</span> Fx bug + rewritten by <span style="color:green;">Boris Feld <boris.feld@octobus.net></span> <span style="color:teal;">(Wed Jun 21 14:50:38 2017 +0200)</span> as <span style="color:olive;">c4414d4a5955</span> + +</pre> + +<pre class="shell_output"> +$> hg obslog -r 6 --all --hidden +@ <span style="color:olive;">2c1a992b87c3</span> <span style="color:blue;">(10)</span> Feature2 +| +x <span style="color:olive;">a57f1852d740</span> <span style="color:blue;">(6)</span> Feature2 + rewritten by <span style="color:green;">Boris Feld <boris.feld@octobus.net></span> <span style="color:teal;">(Wed Jun 21 14:50:39 2017 +0200)</span> as <span style="color:olive;">2c1a992b87c3</span> + +</pre> + +Obslog is your next best friend! + +## Obslog + +<img src="https://media4.giphy.com/media/LxPsfUhFxwRRC/giphy.gif"> + +# Evolve Basics behind the hood + +## Amend + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=main]; + Root -> "A"; + Root [shape="circle"]; + } +~~~ +</div> + +<div class="middle" style='order:2; width: 60%'> +To amend A: + + hg amend -m 'A1' +</div> + +<div class='right' style='order:2; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=main]; + Root -> "A1"; + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A"; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "A1"; + Root [shape="circle"]; + } +~~~ +</div> +</div> + +## Amend bis + +It also works with: + + hg commit --amend -m 'A1' + + +## Prune + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=main]; + Root -> "A"; + Root [shape="circle"]; + } +~~~ +</div> + +<div class="middle" style='order:2; width: 60%'> + +To prune A: + + hg prune -r "desc(A)" +</div> + +<div class='right' style='order:2; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + Root [shape="circle"]; + + // Revisions + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A"; + } +~~~ +</div> +</div> + + + +## Rebase + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> B; + node[group=main]; + Root -> "A"; + + Root [shape="circle"]; + } +~~~ +</div> + +<div class="middle" style='order:2; width: 60%'> + +In order to rebase A on top of B; + + hg rebase -r "desc(A)" -d "desc(B)" + +</div> + +<div class='right' style='order:2; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> B -> "A'"; + + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A"; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "A'"; + + Root [shape="circle"]; + } +~~~ +</div> +</div> + + +# More advanced + +## Fold + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 15%'> + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> A -> B; + + Root [shape="circle"]; + } +~~~ +</div> + +<div class="middle" style='order:2; width: 70%'> + +To fold A and B: + + hg fold -r "desc(A)" -r "desc(B)" -m "C" + +</div> + +<div class='right' style='order:2; width: 15%'> + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> C; + + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> A -> B; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "C"; + "B" -> "C"; + + Root [shape="circle"]; + } +~~~ + +</div> +</div> + + +## Split + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> A; + + Root [shape="circle"]; + } +~~~ +</div> + +<div class="middle" style='order:2; width: 60%'> + +Split in two: + + hg split -r "desc(A)" +</div> + +<div class='right' style='order:2; width: 20%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> B -> C; + + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> A; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "C"; + "A" -> "B"; + + Root [shape="circle"]; + } +~~~ +</div> +</div> + + +# Warning zone + +## Divergence + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> "A"; + + Root [shape="circle"]; + } +~~~ + +## Divergence + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 30%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + // Revisions + node[group=branch]; + Root -> "B"; + + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A"; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "B"; + + Root [shape="circle"]; + } +~~~ +</div> + +<div class="middle" style='order:2; width: 70%'> + +First amend: + + hg amend -m B; + +</div> +</div> + + +## Divergence 2 + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> + +<div class="middle" style='order:1; width: 70%'> + +Second amend: + + hg amend -m C + +</div> + +<div class='left' style='order:2; width: 30%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, width=1, height=1, style="filled", fillcolor="#7F7FFF", shape="pentagon"]; + + Root; + + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A"; + + // Revisions + node[group=branch, fillcolor="#7F7FFF", style="filled"]; + Root -> "C"; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "C"; + + Root [shape="circle"]; + } +~~~ +</div> +</div> + +## Result + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"]; + + node[group=main]; + Root -> "B"; + node[group=divergence]; + Root -> "C"; + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A"; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + A -> B; + A -> C; + + Root [shape="pentagon"]; + B [fillcolor="#FF3535"]; + C [fillcolor="#FF3535"]; + Root[shape="circle"]; + } +~~~ + +## That's gonna hurt! + +# Stabilization + +## Stabilization with amend + +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"]; + + node[group=main]; + Root -> "A'"; + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A" -> B; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "A'"; + + B[fillcolor="#FF3535"]; + Root[shape="circle"]; + } +~~~ + +## Evolve! + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class="middle" style='order:2; width: 50%'> + +Stabilize repo: + + hg evolve --all +</div> +<div class='right' style='order:2; width: 50%'> +~~~graphviz + digraph G { + rankdir="BT"; + graph[splines=polyline]; + node[fixedsize=true, style="filled", width=1, height=1, fillcolor="#7F7FFF", shape="pentagon"]; + + node[group=main]; + Root -> "A'" -> "B'"; + node[group=obsolete, style="dotted, filled", fillcolor="#DFDFFF"]; + Root -> "A" -> B; + + // Obsolescence links + edge[dir=back, style=dotted, arrowtail=dot]; + "A" -> "A'"; + "B" -> "B'"; + + Root[shape="circle"]; + } +~~~ + +</div> +</div> + +# Future is near! + +## Effect-flag + +Remember our obs-markers? + +They are great for evolution, but how do you know what changed between two evolutions? + +## Effect-flag + +Effect-flag are storing what changed between evolutions. You can view them with `obslog`, who else? + +## Effect-flag + +Does the meta only changed? + +<pre class="shell_output"> +o <span style="color:olive;">5732d5ea6aa2</span> <span style="color:blue;">(2)</span> Fix bug +| +@ <span style="color:olive;">aa3cd7ee52fc</span> <span style="color:blue;">(1)</span> Fx bug + rewritten(description) by <span style="color:green;">Boris Feld <boris.feld@octobus.net></span> <span style="color:teal;">(Wed Jun 21 15:49:54 2017 +0200)</span> as <span style="color:olive;">5732d5ea6aa2</span> + +</pre> + +## Or did the code changed? + +<pre class="shell_output"> +@ <span style="color:olive;">8f824718f3f7</span> <span style="color:blue;">(12)</span> Fix the build +| +x <span style="color:olive;">f9310b4b05e1</span> <span style="color:blue;">(10)</span> Fix the build + rewritten(content) by <span style="color:green;">Boris Feld <boris.feld@octobus.net></span> <span style="color:teal;">(Wed Jun 21 15:53:07 2017 +0200)</span> as <span style="color:olive;">8f824718f3f7</span> + +</pre> + +## Or was rebased? + +<pre class="shell_output"> +o <span style="color:olive;">ab709059df38</span> <span style="color:blue;">(9)</span> Feature2 +| +@ <span style="color:olive;">3d61cb9ab34f</span> <span style="color:blue;">(5)</span> Feature2 + rewritten(branch, parent) by <span style="color:green;">Boris Feld <boris.feld@octobus.net></span> <span style="color:teal;">(Wed Jun 21 15:53:06 2017 +0200)</span> as <span style="color:olive;">ab709059df38</span> + +</pre> + +## Obslog + +<img src="https://media0.giphy.com/media/3oriO13KTkzPwTykp2/giphy.gif"> + +## Obsfate + +<pre class="shell_output"> +o 8f824718f3f7 +| +| x f39472eb8519 +| | Obsfate: pruned by Boris Feld <boris.feld@octobus.net> (at 2017-06-21 15:53 +0200) +| | +| x f9310b4b05e1 +|/ Obsfate: rewritten by Boris Feld <boris.feld@octobus.net> as 8f824718f3f7 (at 2017-06-21 15:53 +0200) +| +o ab709059df38 +| +o b0d7c614e47d +| +o d61083b45bba +| +o 50ebd46e2452 +| +| @ 3d61cb9ab34f +| | Obsfate: rewritten by Boris Feld <boris.feld@octobus.net> as ab709059df38 (at 2017-06-21 15:53 +0200) +| | +| x 1c6a75c00a45 +|/ Obsfate: rewritten by Boris Feld <boris.feld@octobus.net> as b0d7c614e47d (at 2017-06-21 15:53 +0200) +| +o c1bdb750ab80 +| +o 39752c0e48a4 +| +| x 36744bfd9d65 +|/ Obsfate: rewritten by Boris Feld <boris.feld@octobus.net> as 39752c0e48a4 (at 2017-06-21 15:53 +0200) +| +o 7d12a4681f84 +</pre> + +## Obslog --patch + +<pre class="shell_output"> +$> hg obslog --patch +x <span style="color:olive;">19fb99aaa0d5</span> <span style="color:blue;">(3594)</span> obslog: add a patch option +| rewritten(content) by <span style="color:green;">Pierre-Yves David <pierre-yves.david@octobus.net></span> <span style="color:teal;">(Mon Jun 19 19:25:18 2017 +0200)</span> as <span style="color:olive;">81b01fe6db3b</span> +| diff -r 19fb99aaa0d5 -r 81b01fe6db3b hgext3rd/evolve/obshistory.py +| --- a/hgext3rd/evolve/obshistory.py Mon Jun 19 19:00:36 2017 +0200 +| +++ b/hgext3rd/evolve/obshistory.py Mon Jun 19 19:00:36 2017 +0200 +| @@ -105,6 +105,10 @@ +| markerfm.plain('\n') +| +| # Patch +| + +| +# XXX-review: I find it a bit hacky always call showpatch and expect it to not +| +# XXX-review: show anything without --patch. I would prefer and explicite condition for +| +# XXX-review: calling showpatch. +| self.showpatch(ctx, matchfn) +| +| self.hunk[ctx.node()] = self.ui.popbuffer() +| ... +| +| o <span style="color:olive;">a788967aa800</span> <span style="color:blue;">(3593)</span> obslog: clarify some sorting code +| | +x | <span style="color:olive;">4c2be5027b23</span> +|/ rewritten(user) by <span style="color:green;">Pierre-Yves David <pierre-yves.david@octobus.net></span> <span style="color:teal;">(Mon Jun 19 19:00:54 2017 +0200)</span> as <span style="color:olive;">19fb99aaa0d5</span> +| (No patch available yet, context is not local) +| +x <span style="color:olive;">5d04c9bfac7e</span> +| rewritten(description, user, date, parent, content) by <span style="color:green;">Pierre-Yves David <pierre-yves.david@octobus.net></span> <span style="color:teal;">(Mon Jun 19 19:00:36 2017 +0200)</span> as <span style="color:olive;">4c2be5027b23, a788967aa800</span> +| (No patch available yet, context is not local) +| +x <span style="color:olive;">8ddfd687cf57</span> <span style="color:blue;">(3559)</span> obslog: add a patch option +| rewritten(parent) by <span style="color:green;">Pierre-Yves David <pierre-yves.david@octobus.net></span> <span style="color:teal;">(Mon Jun 19 18:59:02 2017 +0200)</span> as <span style="color:olive;">5d04c9bfac7e</span> +| (No patch available yet, succ is unknown locally) +| +x <span style="color:olive;">27d388000e90</span> <span style="color:blue;">(3541)</span> obslog: add a patch option + rewritten(content) by <span style="color:green;">Boris Feld <boris.feld@octobus.net></span> <span style="color:teal;">(Mon Jun 19 18:40:16 2017 +0200)</span> as <span style="color:olive;">8ddfd687cf57</span> +</pre> + + +# Conclusion + +<div class='graph' style='display: flex ;align-items: stretch ;flex-flow: row wrap ; align-items: center;'> +<div class='left' style='order:1; width: 20%'> +~~~graphviz + digraph G{} +~~~ +</div> + +<div class="middle" style='order:2; width: 60%'> +To stuff: + + hg +</div> + +<div class='right' style='order:2; width: 20%'> +~~~graphviz + digraph G{} +~~~ +</div> +</div>