Mercurial > evolve
annotate docs/concepts.rst @ 6478:059c9b657c08 stable
Added tag 11.0.1 for changeset 33f24dd8cfa2
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Thu, 23 Mar 2023 10:46:48 -0300 |
parents | 8784dfc6537c |
children |
rev | line source |
---|---|
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
1 .. Copyright 2014 Greg Ward <greg@gerg.ca> |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
2 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
3 ---------------- |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
4 Evolve: Concepts |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
5 ---------------- |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
6 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
7 Getting the most out of software requires an accurate understanding of |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
8 the concepts underlying it. For example, you cannot use Mercurial to |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
9 its full potential without understanding the DAG (directed acyclic |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
10 graph) of changesets and the meaning of parent/child relationships |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
11 between nodes in that graph. Mercurial with changeset evolution adds |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
12 some additional concepts to the graph of changesets. Understanding |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
13 those concepts will make you an informed and empowered user of |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
14 ``evolve``. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
15 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
16 .. note:: This document contains math! If you have a pathological fear |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
17 of set theory and the associated notation, you might be |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
18 better off just reading the `user guide`_. But if you |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
19 appreciate the theoretical rigour underlying core Mercurial, |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
20 you will be happy to know that it continues right into |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
21 changeset evolution. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
22 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
23 .. note:: This document is incomplete! (The formatting of the math |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
24 isn't quite right yet, and the diagrams are missing for |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
25 malformatted.) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
26 |
1288
c3ecf6871872
docs: format concepts guide better, with literal blocks
Greg Ward <greg@gerg.ca>
parents:
980
diff
changeset
|
27 This document follows standard set theory notation:: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
28 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
29 x ∈ A: x is a member of A |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
30 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
31 A ∪ B: union of A and B: { x | x ∈ A or x ∈ B } |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
32 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
33 A ∖ B: set difference: { x | x ∈ A and x ∉ B } |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
34 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
35 A ⊇ B: superset: if x ∈ B, then x ∈ A |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
36 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
37 .. _`user guide`: user-guide.html |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
38 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
39 Phases |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
40 ------ |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
41 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
42 First, every changeset in a Mercurial repository (since 2.3) has a |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
43 *phase*. Phases are independent of ``evolve`` and they affect |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
44 Mercurial usage with or without changeset evolution. However, they |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
45 were implemented in order to support evolution, and are a critical |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
46 foundation of ``evolve``. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
47 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
48 Phases are strictly ordered: |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
49 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
50 secret > draft > public |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
51 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
52 Changesets generally only move from a higher phase to a lower phase. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
53 Typically, changesets start life in *draft* phase, and move to |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
54 *public* phase when they are pushed to a public repository. (You can |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
55 set the default phase of new commits in Mercurial configuration.) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
56 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
57 The purpose of phases is to prevent modifying published history. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
58 ``evolve`` will therefore only let you rewrite changesets in one of |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
59 the two *mutable* phases (secret or draft). |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
60 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
61 Run ``hg help phases`` for more information on phases. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
62 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
63 Obsolete changesets |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
64 ------------------- |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
65 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
66 *Obsolescence* is they key concept at the heart of changeset |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
67 evolution. Everything else in this document depends on understanding |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
68 obsolescence. So: what does it mean for a changeset to be obsolete? |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
69 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
70 In implementation terms, there is an *obsolescence marker* associated |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
71 with changesets: every changeset is either obsolete or not. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
72 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
73 The simplest way that a changeset becomes obsolete is by *pruning* it. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
74 The ``hg prune`` command simply marks the specified changesets |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
75 obsolete, as long as they are mutable. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
76 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
77 More commonly, a changeset *A* becomes obsolete by *amending* it. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
78 Amendment creates a new changeset *A'* that replaces *A*, which is now |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
79 obsolete. *A'* is the successor of *A*, and *A* the predecessor of *A'*: |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
80 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
81 [diagram: A and A' with pred/succ edge] |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
82 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
83 The predecessor/successor relationship forms an additional |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
84 *obsolescence graph* overlaid on top of the traditional DAG formed by |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
85 changesets and their parent/child relationships. In fact, the |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
86 obsolescence graph is second-order version control. Where the |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
87 traditional parent/child DAG tracks changes to your source code, the |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
88 obsolescence graph tracks changes to your changesets. It tracks the |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
89 evolution of your changesets. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
90 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
91 (If you prefer a calculus metaphor to set theory, it might help to |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
92 think of the traditional parent/child DAG as the first derivative of |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
93 your source code, and the obsolescence DAG as the second derivative.) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
94 |
4621
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
95 Unstable changesets (orphan, phase-divergent, content-divergent) |
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
96 ---------------------------------------------------------------- |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
97 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
98 Evolving history can introduce problems that need to be solved. For |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
99 example, if you prune a changeset *P* but not its descendants, those |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
100 descendants are now on thin ice. To push a changeset to another |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
101 repository *R*, all of its ancestors must be present in *R* or pushed |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
102 at the same time. But Mercurial does not push obsolete changesets like |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
103 *P*, so it cannot push the descendants of *P*. Any non-obsolete |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
104 changeset that is a descendant of an obsolete changeset is said to be |
4618
803d32f4e498
docs: change `unstable` references to `orphan`
Matt Harbison <matt_harbison@yahoo.com>
parents:
1288
diff
changeset
|
105 an *orphan*. |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
106 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
107 [diagram: obsolete cset with non-obsolete descendant] |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
108 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
109 Another sort of trouble occurs when two developers, Alice and Bob, |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
110 collaborate via a shared non-publishing repository. (This is how |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
111 developers can safely `share mutable history`_.) Say Alice and Bob |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
112 both start the day with changeset *C* in *draft* phase. If Alice |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
113 pushes *C* to their public repository, then it is now published and |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
114 therefore immutable. But Bob is working from a desert island and |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
115 cannot pull this change in *C*'s phase. For Bob, *C* is still in draft |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
116 phase and therefore mutable. So Bob amends *C*, which marks it |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
117 obsolete and replaces it with *C'*. When he is back online and pulls |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
118 from the public repository, Mercurial learns that *C* is public, which |
4621
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
119 means it cannot be obsolete. We say that *C'* is *phase-divergent*, since it is |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
120 the successor of a public changeset. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
121 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
122 .. _`share mutable history`: sharing.html |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
123 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
124 (Incidentally, the terminology here comes from airline overbooking: if |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
125 two people have bought tickets for the same seat on a plane and they |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
126 both show up at the airport, only one of them gets on the plane. The |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
127 passenger who is left behind in the airport terminal has been |
4621
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
128 "phase-divergent".) |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
129 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
130 The third sort of trouble is when Alice and Bob both amend the same |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
131 changeset *C* to have different successors. When this happens, the |
4620
a05bfdf372fb
docs: change `divergent` references to `content-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4619
diff
changeset
|
132 successors are both called *content-divergent* (unless one of them is in |
a05bfdf372fb
docs: change `divergent` references to `content-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4619
diff
changeset
|
133 public phase; only mutable changesets are content-divergent). |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
134 |
4621
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
135 The collective term for orphan, phase-divergent, and content-divergent |
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
136 changeset is *unstable*:: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
137 |
4621
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
138 unstable = orphan ∪ phase-divergent ∪ content-divergent |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
139 |
4619
93514c421528
docs: change `troubled` references to `unstable`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4618
diff
changeset
|
140 It is possible for a changeset to be in any of the unstable categories |
4621
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
141 at the same time: it might be an orphan and content-divergent, or |
8784dfc6537c
docs: change `bumped` references to `phase-divergent`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4620
diff
changeset
|
142 phase-divergent and content-divergent, or whatever. |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
143 |
4619
93514c421528
docs: change `troubled` references to `unstable`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4618
diff
changeset
|
144 [diagram: Venn diagram of unstable changesets, showing overlap] |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
145 |
4619
93514c421528
docs: change `troubled` references to `unstable`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4618
diff
changeset
|
146 The presence of unstable changesets indicates the need to run ``hg |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
147 evolve``. |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
148 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
149 Hidden (and visible) changesets |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
150 ------------------------------- |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
151 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
152 Some obsolete changesets are *hidden*: deliberately suppressed by |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
153 Mercurial and usually not visible through the UI. (As of Mercurial |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
154 2.9, there are still some commands that inadvertently reveal hidden |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
155 changesets; these are bugs and will be fixed in due course.) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
156 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
157 All hidden changesets are obsolete, and all obsolete changesets are |
1288
c3ecf6871872
docs: format concepts guide better, with literal blocks
Greg Ward <greg@gerg.ca>
parents:
980
diff
changeset
|
158 part of your repository. Mathematically speaking:: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
159 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
160 repo ⊇ obsolete ⊇ hidden |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
161 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
162 Or, putting it visually: |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
163 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
164 [diagram: Venn diagram showing nested strict subsets] |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
165 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
166 However, the presence of obsolete but not hidden changesets should be |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
167 temporary. The desired end state for any history mutation operation is |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
168 that all obsolete changesets are hidden, i.e.: |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
169 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
170 repo ⊇ obsolete, obsolete = hidden |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
171 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
172 Visually: |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
173 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
174 [diagram: Venn diagram showing obsolete = hidden, subset of repo] |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
175 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
176 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
177 Why is this changeset visible? |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
178 ------------------------------ |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
179 |
1288
c3ecf6871872
docs: format concepts guide better, with literal blocks
Greg Ward <greg@gerg.ca>
parents:
980
diff
changeset
|
180 Any changeset which is not hidden is *visible*. That is, :: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
181 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
182 visible = repo ∖ hidden |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
183 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
184 (Recall that ∖ means set difference: *visible* is the set of |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
185 changesets that are in *repo* but not in *hidden*.) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
186 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
187 After amending or pruning a changeset, you might expect it to be |
1288
c3ecf6871872
docs: format concepts guide better, with literal blocks
Greg Ward <greg@gerg.ca>
parents:
980
diff
changeset
|
188 hidden. It doesn't always work out that way. The precise rules are:: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
189 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
190 hideable = obsolete |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
191 blockers = bookmarks ∪ parents(workingcopy) ∪ localtags |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
192 hidden = hideable ∖ ancestors((repo ∖ hideable) ∪ blockers) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
193 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
194 This will probably be clearer with a worked example. First, here's a |
4619
93514c421528
docs: change `troubled` references to `unstable`
Matt Harbison <matt_harbison@yahoo.com>
parents:
4618
diff
changeset
|
195 repository with some obsolete changesets, some unstable changesets, |
1288
c3ecf6871872
docs: format concepts guide better, with literal blocks
Greg Ward <greg@gerg.ca>
parents:
980
diff
changeset
|
196 one bookmark, a working copy, and some hidden changesets:: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
197 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
198 x-x |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
199 / |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
200 -o-o-o-o |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
201 \ |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
202 x-x-o |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
203 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
204 Here's the computation required to determine which changesets are |
1288
c3ecf6871872
docs: format concepts guide better, with literal blocks
Greg Ward <greg@gerg.ca>
parents:
980
diff
changeset
|
205 hidden:: |
980
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
206 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
207 repo = { 0, 1, 2, 3, 4, 5, 6, 7, 8 } |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
208 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
209 hideable = obsolete = { 2, 4, 5, 8 } |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
210 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
211 blockers = { 6 } ∪ { 4 } ∪ {} |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
212 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
213 blockers = { 4, 6 } |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
214 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
215 hidden = hideable ∖ ancestors((repo ∖ { 2, 4, 5, 8 }) ∪ { 4, 6 }) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
216 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
217 hidden = hideable ∖ ancestors({ 0, 1, 3, 6, 7 } ∪ { 4, 6 }) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
218 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
219 hidden = hideable ∖ ancestors({ 0, 1, 3, 4, 6, 7 }) |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
220 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
221 hidden = { 2, 4, 5, 8 } ∖ { 0, 1, 2, 3, 4, 5, 6, 7 } |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
222 |
64a2e940e1b2
docs: add concepts guide (the set theory behind obsolescence)
Greg Ward <greg@gerg.ca>
parents:
diff
changeset
|
223 hidden = { 8 } |