diff docs/unstability.rst @ 227:abe52cf492ee

doc: several update and review.
author Pierre-Yves.David@ens-lyon.org
date Wed, 09 May 2012 13:08:46 +0200
parents d43b72724b84
children 5a17c0d41a00
line wrap: on
line diff
--- a/docs/unstability.rst	Wed May 09 12:43:45 2012 +0200
+++ b/docs/unstability.rst	Wed May 09 13:08:46 2012 +0200
@@ -1,3 +1,4 @@
+
 -----------------------------------
 The Unstability Principle
 -----------------------------------
@@ -7,6 +8,7 @@
 An intrinsic contradiction
 -----------------------------------
 
+XXX starts by talking about getting ride of changeset.
 
 DVCS bring two new major concepts to the Version Control Scene:
 
@@ -25,6 +27,8 @@
 All three elements are used generate a *unique* hash that identify the changeset
 (with various other metadata). This identification is a key part of DVCS design.
 
+XXX missing lines ?
+
 ::
 
   Schema base,  A, B and B'
@@ -56,73 +60,150 @@
 Everybody is working around the issue
 ------------------------------------------------
 
-I'm not claiming that rewriting history is impossible. People are 
+I'm not claiming that rewriting history is impossible. People are successfully
+doing for years. However they all need to work around this unstability:
 
 
 
 Rewriting all at once
 ``````````````````````````
 
+The simplest way to avoid unstability is to ensure rewritting operation always
+ends in a stable situation. This is achieve by rewriting all impacted changeset
+at the same time.
+
+rewritting all descendants at the same time that the rewritting of a changeset.
+
+::
+
+  Schema!
+
+Several Mercurial command follow this idea: rebase, collapse, histedit.
+Mercurial also refuse to amend changeset with descendant.  The git brnach design enforce such approach in git too.
 
 
-stable situation to stable situation
+However, DVCS are **Distributed**. This means that you do not control what
+happen outside your repository. Once a changeset have been exchanged *outside*,
+you can't be sure of it's descendant. Therefore** if you rewritte changeset that
+exists elsewere, you can't erradicate the risk of unstability.**
 
-Distributed means that you do not control what happen outside your repository:
-
+Do not rewrite exchanged changeset
+```````````````````````````````````
 
-* phase.
-* overwrite.
+To work around this issue mercurial introduced phases that prevent you to
+rewrite exchanged changeset and ensure other can't pull certain changeset from
+you. But this is a very frustrating limitation that prevent you to
+efficiently share, review and collaborate on mutable changeset.
 
-
-Boiler Plate
+Git world use another approach to prevent unstability.
+By convention only a single developper works on a changeset contained in a named
+branch. But once again this is a huge blocker for collaborating and clueless people
+**will** mess up social convention soon or later.
 
 
 Loose the DAG robustness
 ````````````````````````````
 
-The other approach is
+The other approach use in Mercurial is to keep the mutable part of the history
+outside the DVCS constraint. This is the MQ approach of sticking a quilt queue
+over Mercurial.
 
-mq -- quilt
+This allow much more flexible workflow two major feature are lost in the
+process:
 
-Conflict too much conflict
+  * Graceful merge. MQ use plain-patch to store changeset content and patch have
+    trouble to apply in changing context. applying you queu can because very
+    painful if context changeset.
 
-Linear
+  * easy branching. A quilt queue is by definition a linear queue.
 
+It is possible to collaborate over versionned mq! But you are going ahead a lot
+of trouble.
 
-Deny a lot of option
-````````````````````````````
-
-
-
-[] rewrite
-
-[] exchange
-
-[] collaborate
-
+.. Ignore conflicts
+.. ```````````````````````````````````
+.. 
+.. Another ignored issue is conflicting rewritting of the same changeset. If a
+.. changeset is rewritten two times we have two newer version, duplicated history
+.. complicate to merge.
+.. 
+.. Mercurial work around by
+.. 
+.. The "One set of mutable changset == One developper" mantra is also a way to work
+.. around conflicting rewritting of changeset. If two different people are able to
+.. 
+.. The git branch model allow to overwrite changeset version by another one. But it
+.. does not care about divergent version. It is the equilent of "common ftp" source
+.. management for changeset.
 
 Facing The Danger Once And For All
 ------------------------------------------------
 The more effort you put to avoid instability, the more option you deny. And even
 most restrictive work flow can't garantee that instability will never show up!
 
+Obsolete marker can handle the job
+```````````````````````````````````
+
 It is time to provide a full featured solution to deal with instability and to
 stop working around the issue! This is why I developing a new feature for
-mercurial called "Obsolete marker".
+mercurial called "Obsolete marker". Obsolete marker have two key property:
 
 
 * Any changeset is we want to get ride of is **explicitly** marked as "obsolete"
-  by history rewritting operation..
+  by history rewritting operation.
+
+  By explicitly marking the obsolete part of the history, we will be able to
+  easily detect appearance of unstability. 
 
 * Relations between old and new version of changesets are tracked by Obsolete
   markers.
 
-By explicitly marking the obsolete part of the history, we will be able to
-easily detect appearance of unstability. By Storing a meta-history of changeset
-evolution we are able to easily resolve instability and edition conflict.
+  By Storing a meta-history of changeset evolution we are able to easily resolve
+  instability and edition conflict [#]_ .
+
+.. [#] edition conflict is another major obstable to collaboration. See the
+       section dedicated to obsolete marker for details.
+
+Improving robusness improves simplicity
+````````````````````````````````````````````````
+
+This proposal should **first** be seen as a safety measure.
+
+It allow to detect unstability as soon as possible
+
+::
+    $ hg pull
+    added 3 changeset
+    +2 unstable changeset
+    (do you want "hg stabilize" ?)
+    working directory parent is obsolete!
+    $ hg push
+    outgoing unstable changesets
+    (use "hg stabilize" or force the push)
+
+And should not not encourage people to create unstability
+
+::
+    $ hg up 42
+    $ hg commit --amend
+    changeset have descendant.
+    $ hg commit --amend -f
+    +5 unstable changeset
+
+    $ hg rebase -D --rev 40::44
+    rebasing already obsolete changeset 42:AAA will conflict with newer version 48:BBB
+
+While allowing powerful feature
+````````````````````````````````````````````````
+
+* "kill" changeset remotely.
+
+* track resulting changeset when submitting patch//pull request.
+
+* Focus on what you do:
+
+  I do not like the "all at once" model of history rewriting. I'm confortable
+  with unstability and obsolete marker offer all the tool to safely create and
+  handle unstability locally.
 
 
-
-
-No instability is still a bad situation.
-No instability is still a bad situation that should be avoided.