author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
Tue, 20 Mar 2012 17:04:49 +0100 | |
changeset 158 | 3cdf8291fd97 |
parent 149 | 03f314e32058 |
permissions | -rw-r--r-- |
149
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
1 |
========================= |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
2 |
Obsolete concept |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
3 |
========================= |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
4 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
5 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
6 |
Obsolete marker is a powerful concept that allow mercurial to safely handle |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
7 |
history rewriting operations. It is a new type of relation between Mercurial |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
8 |
changesets that track the result of history rewriting operations. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
9 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
10 |
This concept is simple to define and provides a very solid base to: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
11 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
12 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
13 |
- Very fast history rewriting operations, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
14 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
15 |
- auditable and reversible history rewritting process, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
16 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
17 |
- clean final history, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
18 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
19 |
- share and collaborate on mutable part of the history, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
20 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
21 |
- gracefully handle history rewriting conflict, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
22 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
23 |
- allows various history rewriting UI to collaborate with a underlying common API. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
24 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
25 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
26 |
----------------------------------------------------- |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
27 |
Basic concept |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
28 |
----------------------------------------------------- |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
29 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
30 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
31 |
Every history rewriting operation stores the information that old rewritten |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
32 |
changesets has newer version available in a set of changeset. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
33 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
34 |
This simple rules allows to express any possible history rewriting operation: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
35 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
36 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
37 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
38 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
39 |
.. figure:: ./figures/example-1-update.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
40 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
41 |
*Updating* a changeset |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
42 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
43 |
Create one obsolete marker: ``([A'] obsolete A)`` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
44 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
45 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
46 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
47 |
.. figure:: ./figures/example-2-split.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
48 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
49 |
*Splitting* a changeset in multiple one |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
50 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
51 |
Create one obsolete marker ``([B1, B2] obsolete B)]`` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
52 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
53 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
54 |
.. figure:: ./figures/example-3-merge.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
55 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
56 |
*Merging* multiple changeset in a single one |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
57 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
58 |
Create two obsolete markers ``([C] obsolete A), ([C] obsolete B)`` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
59 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
60 |
.. figure:: ./figures/example-4-reorder.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
61 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
62 |
*Moving* changeset around |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
63 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
64 |
Reordering those two changesets need two obsolete markers: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
65 |
``([A'] obsolete A), ([B'] obsolete B)`` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
66 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
67 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
68 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
69 |
.. figure:: ./figures/example-5-delete.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
70 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
71 |
*Removing* a changeset: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
72 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
73 |
One obselete marker ``([] obsolete B)`` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
74 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
75 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
76 |
To conclude, a single obsolete marker express a relation from **0..n** new |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
77 |
changesets to **1** old changeset. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
78 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
79 |
----------------------------------------------------- |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
80 |
Basic Usage |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
81 |
----------------------------------------------------- |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
82 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
83 |
Obsolete markers create a perpendicular history: **a versionned version of the |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
84 |
changeset graph**. This means that we can have the same feature we have for |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
85 |
versioned files but applied to changeset: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
86 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
87 |
First: we can display a **coherent view** of the history graph with only a |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
88 |
single version of your changeset are displayed by the UI. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
89 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
90 |
Second, because obsolete changeset content are still **available**. You can |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
91 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
92 |
* **browse** the content of your obsolete commit, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
93 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
94 |
* **compare** newer and older version of a changeset, |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
95 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
96 |
* **restore** content of previously obsolete changeset. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
97 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
98 |
Finally, obsolete marker can be **exchanged between repositories**. You are able to |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
99 |
share the result on your history rewriting operation with other and **collaborate |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
100 |
on mutable part of the history**. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
101 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
102 |
Conflicting history rewriting operation can be detected and **resolved** as easily |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
103 |
as conflicting changes on file. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
104 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
105 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
106 |
----------------------------------------------------- |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
107 |
Detecting and solving tricky situation |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
108 |
----------------------------------------------------- |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
109 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
110 |
History rewriting can lead to complex situation. Obsolete marker introduce a |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
111 |
simple representation this complex reality. But people using complex workflow |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
112 |
will one day or another you have to face the intrinsics complexity of some |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
113 |
situation. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
114 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
115 |
This section describe possible situations, define precise set of changesets |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
116 |
involved in such situation and explains how error case can we automatically |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
117 |
resolved using available information. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
118 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
119 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
120 |
obsolete changesets |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
121 |
```````````````````` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
123 |
Old changesets left behind by obsolete operation are said **obsolete**. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
124 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
125 |
With current version of mercurial, this *obsolete* part is stripped from the |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
126 |
repository before the end of every rewritting operation. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
127 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
128 |
.. figure:: ./figures/error-obsolete.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
129 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
130 |
Rebasing `B` and `C` on `A` (as `B'`, `C'`) |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
131 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
132 |
This rebase operation added two obsolete markers from new changesets to old |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
133 |
changesets. These Two old changesets are now part of the *obsolete* part of the |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
134 |
history. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
135 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
136 |
In most case the obsolete set will be fully hidden to both UI and discovery so |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
137 |
user do not have to care about them unless he wants to audit history rewriting |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
138 |
operation. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
139 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
140 |
Unstable changesets |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
141 |
``````````````````` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
142 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
143 |
While exploring obsolete marker possibility a bit further you way end up with |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
144 |
*obsolete* changeset with *non-obsolete* children. There is two common ways to |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
145 |
achieve this: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
146 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
147 |
* Pull a changeset based of an old version of a changeset [#]_. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
148 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
149 |
* Use a partial rewriting operation. For example amend on a changeset with |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
150 |
childrens. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
151 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
152 |
*Non-obsolete* changeset based on *obsolete* one are said **unstable** |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
153 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
154 |
.. figure:: ./figures/error-unstable.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
155 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
156 |
Amend `A` into `A'` leaving `B` behind. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
157 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
158 |
In this situation we can not consider `B` as *obsolete*. But we have all |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
159 |
necessary data to detect `B` as an *unstable* branch of the history because |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
160 |
its parent `A` is *obsolete*. In addition, we have enough data to |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
161 |
automatically resolve this instability: we know that the new version of `B` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
162 |
parent (`A`) is `A'`, We can deduce that we should rebase `B` on `A'` to get |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
163 |
a stable history again. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
164 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
165 |
Proper warning should be issued when part of the history become unstable. UI |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
166 |
will be able to use the obsolete marker to automatically suggest resolution to |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
167 |
the user of even carry them out for him. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
168 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
169 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
170 |
XXX details automatic resolution for |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
171 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
172 |
* movement |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
173 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
174 |
* handling deletion |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
175 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
176 |
* handling split on multiple head |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
177 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
178 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
179 |
.. [#] For this to happen one needs to explicitly enable exchange of draft |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
180 |
changeset. See phase help for details. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
181 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
182 |
The two part of the obsolete set |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
183 |
`````````````````````````````````````` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
184 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
185 |
The previous section show that it could be two kinds of *obsolete* changeset: |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
186 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
187 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
188 |
* *obsolete* changeset with no or *obsolete* only descendants, said **extinct**. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
189 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
190 |
* *obsolete* changeset with *unstable* descendants, said **suspended**. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
191 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
192 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
193 |
.. figure:: ./figures/error-extinct.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
194 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
195 |
Amend `A` and `C` leaving `B` behind. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
196 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
197 |
In this example we have two *obsolete* changesets: `C` with no *unstable* |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
198 |
children is *extinct*. `A` with *unstable* descendant (`B`) is *suspended*. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
199 |
`B` is *unstable* as before. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
200 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
201 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
202 |
Because nothing outside the obsolete set default on *extinct* changesets, they |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
203 |
can be safely hidden in the UI and even garbage collected. *Suspended* changeset |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
204 |
have to stay visible and available until they unstable descendant are rewritten |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
205 |
in stable version. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
206 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
207 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
208 |
Conflicting rewriting |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
209 |
`````````````````````` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
210 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
211 |
If people start to concurrently edit the same part of the history they will |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
212 |
likely meet conflicting situation when a changeset have been rewritten in two |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
213 |
different versions. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
214 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
215 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
216 |
.. figure:: ./figures/error-conflicting.png |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
217 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
218 |
Conflicting rewriting of `A` into `A'` and `A''` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
219 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
220 |
This kind of conflict is easy to detect with obsolete marker because an obsolete |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
221 |
changeset have more than one new version. It may be seen as the multiple heads |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
222 |
case Mercurial warn you about on pull. It is resolved the same way by a merge of |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
223 |
A' and A'' that will keep the same parent than `A'` and `A''` with two obsolete |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
224 |
markers pointing to both `A` and `A'` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
225 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
226 |
.. warning:: TODO: Add a schema of the resolution. (merge A' and A'' with A as |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
227 |
ancestor and graft the result of A^) |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
228 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
229 |
Allowing multiple new changesets to obsolete a single one allow to distinct a |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
230 |
splitted changeset from history rewriting conflict. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
231 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
232 |
Reliable history |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
233 |
`````````````````````` |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
234 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
235 |
Obsolete marker really help to smooth rewriting operation process. However they |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
236 |
do not change the fact that **you should only rewrite the mutable part of the |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
237 |
history**. The phase concept enforce this rules by explicitly defining a |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
238 |
public immutable set of changeset. Rewriting operation refuse to work on |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
239 |
public changeset, but they is still some corner case where changesets |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
240 |
rewritten in the past are made public. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
241 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
242 |
Special rules apply for obsolete marker pointing to public changeset |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
243 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
244 |
* Public changesets are excluded from the obsolete set (public changeset are |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
245 |
never hidden or candidate to garbage collection) |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
246 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
247 |
* *newer* version of public changeset are said **latecomer** and highlighted as |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
248 |
error case. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
249 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
250 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
251 |
Solving such error is easy. Because we know what changeset a *latecomer* try to |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
252 |
rewrite, we can easily compute a smaller changeset containing only the change |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
253 |
from the old *public* to the new *latecomer*. |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
254 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
255 |
|
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
256 |
.. warning:: add a schema |
03f314e32058
import some doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
257 |