diff docs/obs-terms.rst @ 363:5280e7ce026d stable

doc: big update of terms and summary of the concept This is intended to be sent to the mailing list for discussion.
author Pierre-Yves.David@ens-lyon.org
date Sun, 15 Jul 2012 12:49:25 +0200
parents
children c2f3cdd5a2a2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/obs-terms.rst	Sun Jul 15 12:49:25 2012 +0200
@@ -0,0 +1,253 @@
+-----------------------------------------------------------
+Terminology of the obsolete concept
+-----------------------------------------------------------
+
+Obsolete marker them self
+---------------------------------
+
+The mutable concept is based on the creation of **obsolete marker**. An obsolete
+marker register a relation between the old obsoleted changeset and its newer
+version.
+
+The old changesets is called **precursors**. Its newer version are called
+*successors*. A marker always register a single *precursors* but can refer
+to:
+
+- No *successors* at all if the *precursors* if just discarded.
+- One *successor* at all if the *precursors* have been rewritten
+- Multiple *successors* if the *precursors* have been splitted in myltiple
+  changeset.
+
+The **precursors** and **successors** terms can be used on changeset directy:
+
+:precursors: of a changeset `A` are changesets used as *precursors* by
+             obsolete marker using changeset `A` as *successors*
+
+:successors: of a changeset `B` are changesets used as *successors* by
+             obsolete marker using changeset `B` as *precursors*
+
+*Precursors* and *successors* directly related within the same marker are called
+**direct precursors** and **direct successors** in ambiguous situation.
+
+The set of all *obsolete markers* create a direct acyclic graph the same way
+standard *parent* and *children* relation do. In this graph we have:
+
+:any precursors: of a `A` are transitive precursors of `A`. (*direct
+                 precursors* of `A` and *precursors*  of *precursors*)
+
+:any successors: of a `A` are transitive successors of `A`. (*direct
+                 successors* of `A` and *precursors*  of *precursors*)
+
+Obsolete markers may revert to changesets that are not known locally. *Direct
+precursors* of a changeset may be unknown locally. This is why we usually focus
+on the **first known precursors**  of changeset
+
+(The same apply for successors)
+
+Item in *Any successors* which are not *obsolete* are called **newest
+successors** 
+
+.. note:: I'm not very happy with this naming scheme and I'm looking for a
+          better distinction between direct-successors, any-successors.
+
+Possible changesets "type"
+---------------------------------
+
+The following table describe name and behavior of changesets affected by
+obsolete marker. Left column describe generic category and right column are
+about sub-category.
+
+
++---------------------+--------------------------+-----------------------------+
+| **mutable**         | **obsolete**             | **extinct**                 |
+|                     |                          |                             |
+| Changeset in either | Obsolete changesets are  | Extinct changesets are      |
+| *draft* or *secret* | mutable changeset used   | obsolete one with obsolete  |
+| phases.             | as a precursors.         | only descendants.           |
+|                     |                          |                             |
+|                     | A changeset is used as   | They can be safely:         |
+|                     | a precursors when at     |                             |
+|                     | least one obsolete       | - hidden in the UI,         |
+|                     | refer to it in the       | - silently excluded from pp |
+|                     | precursors field.        |   pull and push,t operation |
+|                     |                          | - ignored by most operation |
+|                     |                          | - garbage collected.        |
+|                     |                          |                             |
+|                     |                          +-----------------------------+
+|                     |                          |                             |
+|                     |                          | **suspended**               |
+|                     |                          |                             |
+|                     |                          | Suspended changesets are    |
+|                     |                          | obsolete one with at least  |
+|                     |                          | one non-obsolete descendant |
+|                     |                          |                             |
+|                     |                          | Thoses descendants prevent  |
+|                     |                          | properties of extincts      |
+|                     |                          | changesets to apply. But    |
+|                     |                          | they will refuse to be      |
+|                     |                          | pushed without --force.     |
+|                     |                          |                             |
+|                     +--------------------------+-----------------------------+
+|                     |                          |                             |
+|                     | **troublesome**          | **unstable**                |
+|                     |                          |                             |
+|                     | Troublesome commit have  | Unstable changesets are     |
+|                     | unresolved issue caused  | changesets with obsolete    |
+|                     | by obsolete relations.   | ancestors.                  |
+|                     |                          |                             |
+|                     | Possible issues are      | They must be rebased on a   |
+|                     | listed in the next       | better base to solve the    |
+|                     | column. It is possible   | situation.                  |
+|                     | for troublesome          |                             |
+|                     | changeset to combine     | (possible alternative name: |
+|                     | multiple issue at once.  | precarious)                 |
+|                     | (eg: conflicting and     |                             |
+|                     | unstable)                +-----------------------------+
+|                     |                          |                             |
+|                     | (possible alternative    | **latecomer**               |
+|                     | name: unsettled,         |                             |
+|                     | troubled)                | Latecomer changesets are    |
+|                     |                          | changesets that try to      |
+|                     |                          | be successors of public     |
+|                     |                          | changesets.                 |
+|                     |                          |                             |
+|                     |                          | Public changeset can't      |
+|                     |                          | be obsolete. Latecomer      |
+|                     |                          | changeset need to be        |
+|                     |                          | rewritten as an overlay     |
+|                     |                          | to this public changeset.   |
+|                     |                          |                             |
+|                     |                          | (possible alternative names |
+|                     |                          | mislead, naive, unaware,    |
+|                     |                          | mindless, disenchanting)    |
+|                     |                          |                             |
+|                     |                          +-----------------------------+
+|                     |                          | **conflicting**             |
+|                     |                          |                             |
+|                     |                          | Conflicting changesets      |
+|                     |                          | happen when multiple        |
+|                     |                          | changesets are successors   |
+|                     |                          | of the same obsolete        |
+|                     |                          | changeset.                  |
+|                     |                          |                             |
+|                     |                          | Conflicting changesets are  |
+|                     |                          | resolve through a three     |
+|                     |                          | ways merging between the    |
+|                     |                          | two conflicting changesets, |
+|                     |                          | using the last "obsolete-   |
+|                     |                          | -common-ancestor" as the    |
+|                     |                          | base.                       |
+|                     |                          |                             |
+|                     |                          | (Changeset splitting is     |
+|                     |                          | properly not detected as a  |
+|                     |                          | conflict)                   |
+|                     |                          |                             |
+|                     +--------------------------+-----------------------------+
+|                     |                                                        |
+|                     | Mutable changesets which are neither *obsolete* or     |
+|                     | *troublesome* are *"ok"*.                              |
+|                     |                                                        |
+|                     | Do we really need a name for it ? *"ok"* is a pretty   |
+|                     | crappy name :-/ other possibilities are:               |
+|                     |                                                        |
+|                     | - stable (confusing with stable branch)                |
+|                     | - sane                                                 |
+|                     | - healthy                                              |
+|                     |                                                        |
++---------------------+--------------------------------------------------------+
+|                                                                              |
+|     **immutable**                                                            |
+|                                                                              |
+| Changesets in the *public* phases.                                           |
+|                                                                              |
+| Rewriting operation refuse to work on immutable changeset.                   |
+|                                                                              |
+| Obsolete markers that refer an immutable changeset as precursors have        |
+| no effect on the precussors changeset (but may have effect on the            |
+| successors)                                                                  |
+|                                                                              |
+| When a mutable changeset becomes immutable its is just *immutable* and loose |
+| any property of it's former state.                                           |
+|                                                                              |
+| By phase property, once a changeset becomes a public immutable changeset,    |
+| you can expect it to remain as such forever.                                 |
+|                                                                              |
++------------------------------------------------------------------------------+
+
+.. note:: I'm not very happy with the naming of:
+
+          - "ok" changeset
+          - latecomer
+          - troublesome
+
+          Any better idea are welcome.
+
+
+Command and operation name
+---------------------------------
+
+
+Existing terms
+``````````````
+
+Mercurial already use the following terms:
+
+:amend: rewrite a changeset
+:graft: copy a changeset
+:rebase: move a changeset
+
+
+Uncommit
+`````````````
+
+remove files from a commit (and leave them as dirty in the working directory)
+
+The evolve extension have an `uncommit` command that aims to replace most
+`rollback` usage.
+
+Fold
+``````````
+
+Collapse multiple changeset into one
+
+The evolve extensions *will* have a `fold` commands
+
+Prune
+``````````
+
+Make a changeset obsolete without successors.
+
+This an important operation as it should replace strip in 95% of the case.
+
+alternative name:
+
+- kill: nice name for effect when you forget the "hg" in front on "hg kill".
+- obsolete: too vague, long and generic.
+
+Stabilize
+```````````````
+
+Automatically resolve troublesome changesets
+(unstable, latecomer and conflicting)
+
+This is an important name as hg pull/pussh will suggest it the same way it
+suggest merging when you add heads.
+
+I do not like stabilize much.
+
+alternative name:
+
+- solve (too generic ?)
+- evolve (too vague)
+
+
+
+
+
+.. note:: I'm not very happy with the naming of:
+
+          - "ok" changeset
+          - latecomer
+          - troublesome
+
+          Any better idea are welcome.