10 |
10 |
11 The mutable concept is based on **obsolete markers**. Creating an obsolete |
11 The mutable concept is based on **obsolete markers**. Creating an obsolete |
12 marker registers a relation between an old obsoleted changeset and its newer |
12 marker registers a relation between an old obsoleted changeset and its newer |
13 version. |
13 version. |
14 |
14 |
15 Old changesets are called **precursors** while their new versions are called |
15 Old changesets are called **predecessors** while their new versions are called |
16 **successors**. A marker always registers a single *precursor* and: |
16 **successors**. A marker always registers a single *predecessor* and: |
17 |
17 |
18 - no *successor*: the *precursor* is just discarded. |
18 - no *successor*: the *predecessor* is just discarded. |
19 - one *successor*: the *precursor* has been rewritten |
19 - one *successor*: the *predecessor* has been rewritten |
20 - multiple *successors*: the *precursor* were splits in multiple |
20 - multiple *successors*: the *predecessor* were splits in multiple |
21 changesets. |
21 changesets. |
22 |
22 |
23 .. The *precursors* and *successors* terms can be used on changeset directly: |
23 .. The *predecessors* and *successors* terms can be used on changeset directly: |
24 |
24 |
25 .. :precursors: of a changeset `A` are changesets used as *precursors* by |
25 .. :predecessors: of a changeset `A` are changesets used as *predecessors* by |
26 .. obsolete marker using changeset `A` as *successors* |
26 .. obsolete marker using changeset `A` as *successors* |
27 |
27 |
28 .. :successors: of a changeset `B` are changesets used as *successors* by |
28 .. :successors: of a changeset `B` are changesets used as *successors* by |
29 .. obsolete marker using changeset `B` as *precursors* |
29 .. obsolete marker using changeset `B` as *predecessors* |
30 |
30 |
31 Chaining obsolete markers is allowed to rewrite a changeset that is already a |
31 Chaining obsolete markers is allowed to rewrite a changeset that is already a |
32 *successor*. This is a kind of *second order version control*. |
32 *successor*. This is a kind of *second order version control*. |
33 To clarify ambiguous situations one can use **direct precursors** or |
33 To clarify ambiguous situations one can use **direct predecessors** or |
34 **direct successors** to name changesets that are directly related. |
34 **direct successors** to name changesets that are directly related. |
35 |
35 |
36 The set of all *obsolete markers* forms a direct acyclic graph the same way |
36 The set of all *obsolete markers* forms a direct acyclic graph the same way |
37 standard *parents*/*children* relation does. In this graph we have: |
37 standard *parents*/*children* relation does. In this graph we have: |
38 |
38 |
39 :any precursors: are transitive precursors of a changeset: *direct precursors* |
39 :any predecessors: are transitive predecessors of a changeset: *direct predecessors* |
40 and *precursors* of *precursors*. |
40 and *predecessors* of *predecessors*. |
41 |
41 |
42 :any successors: are transitive successors of a changeset: *direct successors* |
42 :any successors: are transitive successors of a changeset: *direct successors* |
43 and *successors* of *successors*) |
43 and *successors* of *successors*) |
44 |
44 |
45 Obsolete markers may refer changesets that are not known locally. |
45 Obsolete markers may refer changesets that are not known locally. |
46 So, *direct precursors* of a changeset may be unknown locally. |
46 So, *direct predecessors* of a changeset may be unknown locally. |
47 This is why we usually focus on the **first known precursors** of the rewritten |
47 This is why we usually focus on the **first known predecessors** of the rewritten |
48 changeset. The same apply for *successors*. |
48 changeset. The same apply for *successors*. |
49 |
49 |
50 Changeset in *any successors* which are not **obsolete** are called |
50 Changeset in *any successors* which are not **obsolete** are called |
51 **newest successors**.. |
51 **newest successors**.. |
52 |
52 |
64 +---------------------+--------------------------+-----------------------------+ |
64 +---------------------+--------------------------+-----------------------------+ |
65 | **mutable** | **obsolete** | **extinct** | |
65 | **mutable** | **obsolete** | **extinct** | |
66 | | | | |
66 | | | | |
67 | Changeset in either | Obsolete changeset is | *extinct* changeset is | |
67 | Changeset in either | Obsolete changeset is | *extinct* changeset is | |
68 | *draft* or *secret* | *mutable* used as a | *obsolete* which has only | |
68 | *draft* or *secret* | *mutable* used as a | *obsolete* which has only | |
69 | phase. | *precursor*. | *obsolete* descendants. | |
69 | phase. | *predecessor*. | *obsolete* descendants. | |
70 | | | | |
70 | | | | |
71 | | A changeset is used as | They can safely be: | |
71 | | A changeset is used as | They can safely be: | |
72 | | a *precursor* when at | | |
72 | | a *predecessor* when at | | |
73 | | least one obsolete | - hidden in the UI, | |
73 | | least one obsolete | - hidden in the UI, | |
74 | | marker refers to it | - silently excluded from | |
74 | | marker refers to it | - silently excluded from | |
75 | | as precursors. | pull and push operations | |
75 | | as predecessors. | pull and push operations | |
76 | | | - mostly ignored | |
76 | | | - mostly ignored | |
77 | | | - garbage collected | |
77 | | | - garbage collected | |
78 | | | | |
78 | | | | |
79 | | +-----------------------------+ |
79 | | +-----------------------------+ |
80 | | | | |
80 | | | | |
128 | | | **divergent** | |
128 | | | **divergent** | |
129 | | | | |
129 | | | | |
130 | | | *divergent* is changeset | |
130 | | | *divergent* is changeset | |
131 | | | that appears when multiple | |
131 | | | that appears when multiple | |
132 | | | changesets are successors | |
132 | | | changesets are successors | |
133 | | | of the same precursor. | |
133 | | | of the same predecessor. | |
134 | | | | |
134 | | | | |
135 | | | *divergent* are solved | |
135 | | | *divergent* are solved | |
136 | | | through a three ways merge | |
136 | | | through a three ways merge | |
137 | | | between the two | |
137 | | | between the two | |
138 | | | *divergent* , | |
138 | | | *divergent* , | |
166 | | |
166 | | |
167 | Changesets in the *public* phases. | |
167 | Changesets in the *public* phases. | |
168 | | |
168 | | |
169 | Rewriting operation refuse to work on immutable changeset. | |
169 | Rewriting operation refuse to work on immutable changeset. | |
170 | | |
170 | | |
171 | Obsolete markers that refer an immutable changeset as precursors have | |
171 | Obsolete markers that refer an immutable changeset as predecessors have | |
172 | no effect on the precursors but may have effect on the successors. | |
172 | no effect on the predecessors but may have effect on the successors. | |
173 | | |
173 | | |
174 | When a *mutable* changeset becomes *immutable* (changing its phase from draft| |
174 | When a *mutable* changeset becomes *immutable* (changing its phase from draft| |
175 | to public) it is just *immutable* and loose any property of it's former | |
175 | to public) it is just *immutable* and loose any property of it's former | |
176 | state. | |
176 | state. | |
177 | | |
177 | | |