annotate hgext/states.py @ 68:6f7824dbce24

[state] Update doc on the mutable property of state (and the way it's implemented)
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Tue, 13 Sep 2011 20:24:44 +0200
parents e62ffb77bf8c
children e68f6821ae84
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
1 # states.py - introduce the state concept for mercurial changeset
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
2 #
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
3 # Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
4 # Logilab SA <contact@logilab.fr>
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
5 # Augie Fackler <durin42@gmail.com>
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
6 #
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
7 # This software may be used and distributed according to the terms of the
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
8 # GNU General Public License version 2 or any later version.
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
9
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
10 '''introduce the state concept for mercurial changeset
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
11
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
12 (see http://mercurial.selenic.com/wiki/StatesPlan)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
13
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
14 General concept
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
15 ===============
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
16
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
17 This extension adds the state concept. A changeset are now in a specific state
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
18 that control they mutability and they exchange.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
19
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
20 States properties
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
21 .................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
22
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
23 The states extension currently alter two property for changeset
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
24
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
25 :mutability: history rewritten tool should refuse to work on immutable changeset
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
26 :sharing: shared changeset are exchanged during pull and push. other are not
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
27
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
28 Here is a small summary of the current property of state existing state::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
29
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
30 || || mutable || shared ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
31 || published || || x ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
32 || ready || x || x ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
33 || draft || x || ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
34
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
35 States consistency and ordering
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
36 ...............................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
37
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
38 States of changesets have to be consistent with each other. A changeset can only have ancestors of it's state (or a compatible states)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
39
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
40 Example:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
41
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
42 A ``published`` changeset can't have a ``draft`` parent.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
43
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
44 a state is compatible with itself and all "smaller" states. Order is as follow::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
45
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
46 published < ready < draft
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
47
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
48
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
49 .. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
50
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
51 This section if probably far too conceptual for people. The result is just
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
52 that: A ``published`` changeset can only have ``published`` ancestors. A
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
53 ``ready`` changeset can only have ``published`` or ``ready`` ancestors.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
54
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
55 Moreover There is a need for a nice word to refer to "a state smaller than another"
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
56
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
57
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
58 States details
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
59 ==============
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
60
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
61
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
62 published
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
63 Changesets in the ``published`` state are the core of the history. They are
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
64 changesets that you published to the world. People can expect them to always
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
65 exist. They are changesets as you know them. **By default all changesets
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
66 are published**
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
67
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
68 - They are exchanged with other repositories (included in pull//push).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
69
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
70 - They are not mutable, extensions rewriting history should refuse to
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
71 rewrite them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
72
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
73 ready
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
74 Changesets in the ``ready`` state have not yet been accepted in the
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
75 immutable history. You can share them with others for review, testing or
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
76 improvement. Any ``ready`` changeset can either be included in the
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
77 published history (and become immutable) or be rewritten and never make it
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
78 to the published history.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
79
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
80 - They are exchanged with other repositories (included in pull//push).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
81
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
82 - They are mutable, extensions rewriting history accept to work on them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
83
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
84 draft
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
85
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
86 Changesets in the ``draft`` state are heavy work in progress you are not
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
87 yet willing to share with others.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
88
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
89 - They are not exchanged with other repositories. pull//push do not see them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
90 - They are mutable, extensions rewriting history accept to work on them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
91
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
92 --
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
93
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
94 .. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
95
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
96 The Dead states mentionned in on the wiki page are missing. There is two main reason for it:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
97
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
98 1. The ``dead`` state has a different behaviour that requires more work to be
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
99 implemented.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
100
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
101 2. I believe that the use cases of ``dead changeset`` are better covered by
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
102 the ``obsolete`` extension.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
103
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
104 --
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
105
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
106 .. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
107
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
108 I'm tempted to add a state with the same property that ``ready`` for review
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
109 workflow.::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
110
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
111 || || mutable || shared ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
112 || published || || x ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
113 || ready || x || x ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
114 || inprogress|| x || x ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
115 || draft || x || ||
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
116
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
117 The ``ready`` state would be for changeset that wait review of someone that
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
118 can "publish" them.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
119
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
120
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
121
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
122 Current Feature and usage
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
123 =========================
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
124
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
125
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
126 Enabling states
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
127 ...............
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
128
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
129 The extension adds a :hg:`hg states` command to display and choose which states
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
130 are used by a repository, see :hg:`hg states` for details.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
131
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
132 By default all changesets in the repository are ``published``. Other states
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
133 must be explicitly activated. Changeset in a remote repository that doesn't
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
134 support states are all seen as ``published``.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
135
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
136 .. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
137
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
138 When a state is not activated, changesets in this state are handled as
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
139 changesets of the previous state it (``draft`` are handled as ``ready``,
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
140 ``ready`` are handled as ``published``).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
141
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
142 TODO:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
143
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
144 - have a configuration in hgrc::
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
145
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
146 [states]
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
147 ready=(off|on)(-inherit)?
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
148 <state>=(off|on)(-inherit)?
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
149
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
150 :off: state disabled for new repo
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
151 :on: state enabled for new repo
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
152 :inherit: if present, inherit states of source on :hg:`clone`.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
153
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
154 - have a switch to select if changesets do change state on state activation.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
155
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
156 - display the number of changesets that change state when activating a state.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
157
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
158
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
159
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
160 State transition
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
161 ................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
162
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
163 Changeset you create locally will be in the ``draft`` state. (or any previous
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
164 state if draft isn't enabled)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
165
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
166 There is some situation where the state of a changeset will change
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
167 automatically. Automatic movement always go in the same direction.: ``draft ->
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
168 ``ready`` -> ``published``
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
169
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
170 1. When you pull or push boundary move. Common changeset that are ``published`` in
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
171 one of the two repository are set to ``published``. Same goes for ``ready`` etc
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
172 (states are evaluated from in increasing order XXX I bet no one understand this
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
173 parenthesis. Pull operation alter the local repository. push alter both local
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
174 and remote repository.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
175
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
176 .. note:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
177
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
178 As Repository without any specific state have all their changeset
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
179 ``published``, Pushing to such repo will ``publish`` all common changeset.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
180
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
181 2. Tagged changeset get automatically Published. The tagging changeset is
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
182 tagged too... This doesn't apply to local tag.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
183
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
184
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
185 You can also manually change changeset state with a dedicated command for each
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
186 state. See :hg:`published`, :hg:`ready` and :hg:`draft` for details.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
187
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
188 XXX maybe we can details the general behaviour here
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
189
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
190 :hg <state> revs: move boundary of state so it includes revs
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
191 ( revs included in ::<state>heads())
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
192 :hg --exact <state> revs: move boundary so that revs are exactly in state
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
193 <state> ( all([rev.state == <state> for rev in
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
194 revs]))
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
195 :hg --exact --force <state> revs: move boundary event if it create inconsistency
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
196 (with tag for example)
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
197
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
198 TODO:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
199
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
200 - implement --exact
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
201
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
202 - implement consistency check
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
203
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
204 - implement --force
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
205
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
206
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
207 Existing command change
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
208 .......................
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
209
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
210 As said in the previous section:
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
211
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
212 :commit: Create draft changeset (or the first enabled previous changeset).
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
213 :tag: Move tagged and tagging changeset in the ``published`` state.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
214 :incoming: Exclude ``draft`` changeset of remote repository.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
215 :outgoing: Exclude ``draft`` changeset of local repository.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
216 :pull: As :hg:`in` + change state of local changeset according to remote side.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
217 :push: As :hg:`out` + sync state of common changeset on both side
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
218 :rollback: rollback restore states heads as before the last transaction (see bookmark)
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
219
61
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
220 State Transition control
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
221 .........................
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
222
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
223 There is currently no way to control who can alter boundary (The most notable
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
224 usecase is about the published one).
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
225
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
226 This is probably needed quickly
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
227
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
228 XXX TODO: Proper behaviour when heads file are chmoded whould be a first step.
0dfe459c7b1c [states] add a small paragraph about controlling permision to move the boundary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 60
diff changeset
229
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
230 Template
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
231 ........
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
232
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
233 A new template keyword ``{state}`` has been added.
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
234
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
235 Revset
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
236 ......
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
237
68
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
238 We add new ``readyheads()`` and ``publishedheads()`` revset directives. This
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
239 returns the heads of each state **as if all of them were activated**.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
240
68
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
241 XXX TODO - I would like to
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
242
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
243 - move the current ``<state>heads()`` directives to
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
244 _``<state>heads()``
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
245
68
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
246 - add ``<state>heads()`` directives to that return the currently in used heads
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
247
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
248 - add ``<state>()`` directives that match all node in a state.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
249
68
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
250 Context
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
251 .......
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
252
68
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
253 The ``context`` class gain a new method ``states()`` that return a ``state`` object. The
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
254 most notable property of this states object are ```name`` and ``mutable``.
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
255
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
256 Other extensions
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
257 ................
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
258
64
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
259 :rebase: can't rebase immutable changeset.
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
260 :mq: can't qimport immutable changeset.
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
261
66
b1e64d8783f0 [states] add a todo related to MQ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 65
diff changeset
262 TODO: publishing a changeset should qfinish mq patches.
b1e64d8783f0 [states] add a todo related to MQ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 65
diff changeset
263
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
264
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
265
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
266 Implementation
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
267 ==============
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
268
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
269 State definition
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
270 ................
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
271
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
272 Conceptually:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
273
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
274 The set of node in the states are defined by the set of the state heads. This allow
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
275 easy storage, exchange and consistency.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
276
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
277 .. note: A cache of the complete set of node that belong to a states will
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
278 probably be need for performance.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
279
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
280 Code wise:
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
281
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
282 There is a ``state`` class that hold the state property and several useful
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
283 logic (name, revset entry etc).
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
284
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
285 All defined states are accessible thought the STATES tuple at the ROOT of the
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
286 module. Or the STATESMAP dictionary that allow to fetch a state from it's
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
287 name.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
288
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
289 You can get and edit the list head node that define a state with two methods on
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
290 repo.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
291
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
292 :stateheads(<state>): Returns the list of heads node that define a states
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
293 :setstate(<state>, [nodes]): Move states boundary forward to include the given
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
294 nodes in the given states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
295
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
296 Those methods handle ``node`` and not rev as it seems more resilient to me that
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
297 rev in a mutable world. Maybe it' would make more sens to have ``node`` store
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
298 on disk but revision in the code.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
299
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
300 Storage
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
301 .......
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
302
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
303 States related data are stored in the ``.hg/states/`` directory.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
304
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
305 The ``.hg/states/Enabled`` file list the states enabled in this
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
306 repository. This data is *not* stored in the .hg/hgrc because the .hg/hgrc
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
307 might be ignored for trust reason. As missing und with states can be pretty
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
308 annoying. (publishing unfinalized changeset, pulling draft one etc) we don't
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
309 want trust issue to interfer with enabled states information.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
310
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
311 ``.hg/states/<state>-heads`` file list the nodes that define a states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
312
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
313 _NOSHARE filtering
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
314 ..................
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
315
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
316 Any changeset in a state with a _NOSHARE property will be exclude from pull,
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
317 push, clone, incoming, outgoing and bundle. It is done through three mechanism:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
318
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
319 1. Wrapping the findcommonincoming and findcommonoutgoing code with (not very
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
320 efficient) logic that recompute the exchanged heads.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
321
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
322 2. Altering ``heads`` wireprotocol command to return sharead heads.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
323
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
324 3. Disabling hardlink cloning when there is _NOSHARE changeset available.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
325
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
326 Internal plumbery
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
327 -----------------
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
328
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
329 sum up of what we do:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
330
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
331 * state are object
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
332
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
333 * repo.__class__ is extended
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
334
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
335 * discovery is wrapped up
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
336
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
337 * wire protocol is patched
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
338
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
339 * transaction and rollback mechanism are wrapped up.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
340
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
341 * XXX we write new version of the boundard whenever something happen. We need a
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
342 smarter and faster way to do this.
59
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
343
02fba620d139 move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 57
diff changeset
344
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
345 '''
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
346 import os
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
347 from functools import partial
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
348
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
349 from mercurial.i18n import _
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
350 from mercurial import cmdutil
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
351 from mercurial import scmutil
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
352 from mercurial import context
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
353 from mercurial import revset
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
354 from mercurial import templatekw
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
355 from mercurial import util
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
356 from mercurial import node
9
1f84a74df837 introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7
diff changeset
357 from mercurial.node import nullid, hex, short
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
358 from mercurial import discovery
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
359 from mercurial import extensions
7
cc592295900f Add write protocol support for private.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5
diff changeset
360 from mercurial import wireproto
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
361 from mercurial import pushkey
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
362 from mercurial import error
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
363 from mercurial.lock import release
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
364
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
365
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
366 # states property constante
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
367 _NOSHARE=2
9
1f84a74df837 introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7
diff changeset
368 _MUTABLE=1
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
369
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
370 class state(object):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
371 """State of changeset
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
372
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
373 An utility object that handle several behaviour and containts useful code
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
374
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
375 A state is defined by:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
376 - It's name
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
377 - It's property (defined right above)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
378
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
379 - It's next state.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
380
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
381 XXX maybe we could stick description of the state semantic here.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
382 """
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
383
67
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
384 # plumbery utily
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
385 def __init__(self, name, properties=0, next=None):
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
386 self.name = name
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
387 self.properties = properties
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
388 assert next is None or self < next
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
389 self.next = next
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
390 @util.propertycache
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
391 def trackheads(self):
11
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
392 """Do we need to track heads of changeset in this state ?
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
393
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
394 We don't need to track heads for the last state as this is repo heads"""
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
395 return self.next is not None
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
396
67
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
397 # public utility
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
398 def __cmp__(self, other):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
399 """Use property to compare states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
400
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
401 This is a naiv approach that assume the the next state are strictly
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
402 more property than the one before
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
403 # assert min(self, other).properties = self.properties & other.properties
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
404 """
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
405 return cmp(self.properties, other.properties)
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
406
68
6f7824dbce24 [state] Update doc on the mutable property of state (and the way it's implemented)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 67
diff changeset
407 @property
67
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
408 def mutable(self):
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
409 return bool(self.properties & _MUTABLE)
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
410
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
411 # display code
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
412 def __repr__(self):
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
413 return 'state(%s)' % self.name
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
414
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
415 def __str__(self):
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
416 return self.name
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
417
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
418
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
419 # revset utility
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
420 @util.propertycache
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
421 def _revsetheads(self):
11
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
422 """function to be used by revset to finds heads of this states"""
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
423 assert self.trackheads
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
424 def revsetheads(repo, subset, x):
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
425 args = revset.getargs(x, 0, 0, 'publicheads takes no arguments')
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
426 heads = []
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
427 for h in repo._statesheads[self]:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
428 try:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
429 heads.append(repo.changelog.rev(h))
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
430 except error.LookupError:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
431 pass
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
432 heads.sort()
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
433 return heads
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
434 return revsetheads
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
435
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
436 @util.propertycache
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
437 def headssymbol(self):
11
47ba990eff0e update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 10
diff changeset
438 """name of the revset symbols"""
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
439 if self.trackheads:
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
440 return "%sheads" % self.name
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
441 else:
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
442 return 'heads'
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
443
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
444 # Actual state definition
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
445
12
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
446 ST2 = state('draft', _NOSHARE | _MUTABLE)
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
447 ST1 = state('ready', _MUTABLE, next=ST2)
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
448 ST0 = state('published', next=ST1)
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
449
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
450 # all available state
12
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
451 STATES = (ST0, ST1, ST2)
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
452 # all available state by name
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
453 STATESMAP =dict([(st.name, st) for st in STATES])
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
454
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
455 @util.cachefunc
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
456 def laststatewithout(prop):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
457 """Find the states with the most property but <prop>
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
458
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
459 (This function is necessary because the whole state stuff are abstracted)"""
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
460 for state in STATES:
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
461 if not state.properties & prop:
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
462 candidate = state
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
463 else:
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
464 return candidate
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
465
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
466 # util function
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
467 #############################
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
468 def noderange(repo, revsets):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
469 """The same as revrange but return node"""
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
470 return map(repo.changelog.node,
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
471 scmutil.revrange(repo, revsets))
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
472
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
473 # Patch changectx
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
474 #############################
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
475
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
476 def state(ctx):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
477 """return the state objet associated to the context"""
27
31906bc290ff Working directory is draft.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 26
diff changeset
478 if ctx.node()is None:
31906bc290ff Working directory is draft.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 26
diff changeset
479 return STATES[-1]
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
480 return ctx._repo.nodestate(ctx.node())
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
481 context.changectx.state = state
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
482
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
483 # improve template
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
484 #############################
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
485
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
486 def showstate(ctx, **args):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
487 """Show the name of the state associated with the context"""
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
488 return ctx.state()
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
489
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
490
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
491 # New commands
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
492 #############################
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
493
26
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
494
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
495 def cmdstates(ui, repo, *states, **opt):
33
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
496 """view and modify activated states.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
497
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
498 With no argument, list activated state.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
499
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
500 With argument, activate the state in argument.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
501
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
502 With argument plus the --off switch, deactivate the state in argument.
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
503
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
504 note: published state are alway activated."""
dca86448d736 Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 31
diff changeset
505
26
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
506 if not states:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
507 for st in sorted(repo._enabledstates):
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
508 ui.write('%s\n' % st)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
509 else:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
510 off = opt.get('off', False)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
511 for state_name in states:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
512 for st in STATES:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
513 if st.name == state_name:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
514 break
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
515 else:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
516 ui.write_err(_('no state named %s\n') % state_name)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
517 return 1
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
518 if off and st in repo._enabledstates:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
519 repo._enabledstates.remove(st)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
520 else:
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
521 repo._enabledstates.add(st)
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
522 repo._writeenabledstates()
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
523 return 0
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
524
c9da15600775 add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 25
diff changeset
525 cmdtable = {'states': (cmdstates, [ ('', 'off', False, _('desactivate the state') )], '<state>')}
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
526
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
527 # automatic generation of command that set state
18
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
528 def makecmd(state):
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
529 def cmdmoveheads(ui, repo, *changesets):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
530 """set revisions in %s state
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
531
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
532 This command also alter state of ancestors if necessary.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
533 """ % state
18
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
534 revs = scmutil.revrange(repo, changesets)
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
535 repo.setstate(state, [repo.changelog.node(rev) for rev in revs])
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
536 return 0
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
537 return cmdmoveheads
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
538
18
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
539 for state in STATES:
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
540 if state.trackheads:
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
541 cmdmoveheads = makecmd(state)
9ffe946febc0 Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17
diff changeset
542 cmdtable[state.name] = (cmdmoveheads, [], '<revset>')
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
543
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
544 # Pushkey mechanism for mutable
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
545 #########################################
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
546
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
547 def pushstatesheads(repo, key, old, new):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
548 """receive a new state for a revision via pushkey
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
549
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
550 It only move revision from a state to a <= one
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
551
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
552 Return True if the <key> revision exist in the repository
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
553 Return False otherwise. (and doesn't alter any state)"""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
554 st = STATESMAP[new]
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
555 w = repo.wlock()
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
556 try:
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
557 newhead = node.bin(key)
57
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
558 try:
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
559 repo[newhead]
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
560 except error.RepoLookupError:
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
561 return False
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
562 repo.setstate(st, [newhead])
57
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
563 return True
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
564 finally:
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
565 w.release()
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
566
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
567 def liststatesheads(repo):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
568 """List the boundary of all states.
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
569
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
570 {"node-hex" -> "comma separated list of state",}
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
571 """
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
572 keys = {}
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
573 for state in [st for st in STATES if st.trackheads]:
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
574 for head in repo.stateheads(state):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
575 head = node.hex(head)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
576 if head in keys:
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
577 keys[head] += ',' + state.name
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
578 else:
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
579 keys[head] = state.name
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
580 return keys
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
581
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
582 pushkey.register('states-heads', pushstatesheads, liststatesheads)
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
583
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
584
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
585 # Wrap discovery
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
586 ####################
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
587 def filterprivateout(orig, repo, *args,**kwargs):
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
588 """wrapper for findcommonoutgoing that remove _NOSHARE"""
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
589 common, heads = orig(repo, *args, **kwargs)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
590 if getattr(repo, '_reducehead', None) is not None:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
591 return common, repo._reducehead(heads)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
592 def filterprivatein(orig, repo, remote, *args, **kwargs):
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
593 """wrapper for findcommonincoming that remove _NOSHARE"""
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
594 common, anyinc, heads = orig(repo, remote, *args, **kwargs)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
595 if getattr(remote, '_reducehead', None) is not None:
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
596 heads = remote._reducehead(heads)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
597 return common, anyinc, heads
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
598
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
599 # states boundary IO
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
600 #####################
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
601
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
602 def _readheadsfile(repo, filename):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
603 """read head from the given file
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
604
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
605 XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
606 heads = [nullid]
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
607 try:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
608 f = repo.opener(filename)
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
609 try:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
610 heads = sorted([node.bin(n) for n in f.read().split() if n])
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
611 finally:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
612 f.close()
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
613 except IOError:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
614 pass
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
615 return heads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
616
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
617 def _readstatesheads(repo, undo=False):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
618 """read all state heads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
619
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
620 XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
621 statesheads = {}
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
622 for state in STATES:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
623 if state.trackheads:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
624 filemask = 'states/%s-heads'
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
625 filename = filemask % state.name
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
626 statesheads[state] = _readheadsfile(repo, filename)
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
627 return statesheads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
628
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
629 def _writeheadsfile(repo, filename, heads):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
630 """write given <heads> in the file with at <filename>
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
631
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
632 XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
633 f = repo.opener(filename, 'w', atomictemp=True)
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
634 try:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
635 for h in heads:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
636 f.write(hex(h) + '\n')
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
637 f.rename()
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
638 finally:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
639 f.close()
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
640
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
641 def _writestateshead(repo):
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
642 """write all heads
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
643
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
644 XXX move me elsewhere"""
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
645 # XXX transaction!
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
646 for state in STATES:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
647 if state.trackheads:
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
648 filename = 'states/%s-heads' % state.name
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
649 _writeheadsfile(repo, filename, repo._statesheads[state])
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
650
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
651 # WireProtocols
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
652 ####################
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
653 def wireheads(repo, proto):
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
654 """Altered head command that doesn't include _NOSHARE
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
655
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
656 This is a write protocol command"""
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
657 st = laststatewithout(_NOSHARE)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
658 h = repo.stateheads(st)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
659 return wireproto.encodelist(h) + "\n"
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
660
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
661 # Other extension support
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
662 #########################
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
663
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
664 def wraprebasebuildstate(orig, repo, *args, **kwargs):
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
665 result = orig(repo, *args, **kwargs)
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
666 if result is not None:
65
7c8f992d567e [states] fix a bug with rebase --detach
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 64
diff changeset
667 # rebase.nullmerge is issued in the detach case
7c8f992d567e [states] fix a bug with rebase --detach
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 64
diff changeset
668 rebase = extensions.find('rebase')
7c8f992d567e [states] fix a bug with rebase --detach
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 64
diff changeset
669 rebased = [rev for rev, rbst in result[2].items() if rbst != rebase.nullmerge]
7c8f992d567e [states] fix a bug with rebase --detach
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 64
diff changeset
670 base = repo.changelog.node(min(rebased))
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
671 state = repo.nodestate(base)
67
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
672 if not state.mutable:
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
673 raise util.Abort(_('can not rebase published changeset %s')
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
674 % node.short(base),
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
675 hint=_('see `hg help --extension states` for details'))
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
676 return result
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
677
64
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
678 def wrapmqqimport(orig, queue, repo, *args, **kwargs):
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
679 if 'rev' in kwargs:
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
680 # we can take the min as non linear import wil break
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
681 base = min(scmutil.revrange(repo, kwargs['rev']))
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
682 basenode = repo.changelog.node(base)
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
683 state = repo.nodestate(basenode)
67
e62ffb77bf8c [state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 66
diff changeset
684 if not state.mutable:
64
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
685 raise util.Abort(_('can not qimport published changeset %s')
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
686 % node.short(basenode),
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
687 hint=_('see `hg help --extension states` for details'))
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
688 return orig(queue, repo, *args, **kwargs)
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
689
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
690
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
691 def uisetup(ui):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
692 """
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
693 * patch stuff for the _NOSHARE property
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
694 * add template keyword
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
695 """
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
696 # patch discovery
2
166694e62daf hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 1
diff changeset
697 extensions.wrapfunction(discovery, 'findcommonoutgoing', filterprivateout)
166694e62daf hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 1
diff changeset
698 extensions.wrapfunction(discovery, 'findcommonincoming', filterprivatein)
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
699
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
700 # patch wireprotocol
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
701 wireproto.commands['heads'] = (wireheads, '')
7
cc592295900f Add write protocol support for private.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5
diff changeset
702
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
703 # add template keyword
17
6aa349f47e7c add templatekeyword in a proper location
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16
diff changeset
704 templatekw.keywords['state'] = showstate
6aa349f47e7c add templatekeyword in a proper location
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16
diff changeset
705
14
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
706 def extsetup(ui):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
707 """Extension setup
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
708
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
709 * add revset entry"""
14
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
710 for state in STATES:
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
711 if state.trackheads:
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
712 revset.symbols[state.headssymbol] = state._revsetheads
64
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
713 # wrap rebase
63
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
714 try:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
715 rebase = extensions.find('rebase')
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
716 if rebase:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
717 extensions.wrapfunction(rebase, 'buildstate', wraprebasebuildstate)
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
718 except KeyError:
f47a5f990eb2 [states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 62
diff changeset
719 pass # rebase not found
64
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
720 # wrap mq
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
721 try:
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
722 mq = extensions.find('mq')
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
723 if mq:
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
724 extensions.wrapfunction(mq.queue, 'qimport', wrapmqqimport)
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
725 except KeyError:
6a7dc5ca05b8 [states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 63
diff changeset
726 pass # mq not found
14
f5e1055a3f68 reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 13
diff changeset
727
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
728
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
729
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
730 def reposetup(ui, repo):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
731 """Repository setup
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
732
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
733 * extend repo class with states logic"""
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
734
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
735 if not repo.local():
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
736 return
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
737
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
738 ocancopy =repo.cancopy
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
739 opull = repo.pull
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
740 opush = repo.push
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
741 o_tag = repo._tag
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
742 orollback = repo.rollback
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
743 o_writejournal = repo._writejournal
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
744 class statefulrepo(repo.__class__):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
745 """An extension of repo class that handle state logic
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
746
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
747 - nodestate
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
748 - stateheads
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
749 """
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
750
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
751 def nodestate(self, node):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
752 """return the state object associated to the given node"""
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
753 rev = self.changelog.rev(node)
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
754
29
52c227772dad fix nodestate computation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 28
diff changeset
755 for state in STATES:
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
756 # avoid for untracked heads
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
757 if state.next is not None:
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
758 ancestors = map(self.changelog.rev, self.stateheads(state))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
759 ancestors.extend(self.changelog.ancestors(*ancestors))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
760 if rev in ancestors:
29
52c227772dad fix nodestate computation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 28
diff changeset
761 break
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
762 return state
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
763
12
6312fc525a54 rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 11
diff changeset
764
9
1f84a74df837 introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7
diff changeset
765
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
766 def stateheads(self, state):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
767 """Return the set of head that define the state"""
20
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
768 # look for a relevant state
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
769 while state.trackheads and state.next not in self._enabledstates:
20
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
770 state = state.next
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
771 # last state have no cached head.
13
e95e8cf7988f Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 12
diff changeset
772 if state.trackheads:
20
9983f240ac63 Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19
diff changeset
773 return self._statesheads[state]
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
774 return self.heads()
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
775
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
776 @util.propertycache
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
777 def _statesheads(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
778 """{ state-object -> set(defining head)} mapping"""
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
779 return _readstatesheads(self)
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
780
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
781 def setstate(self, state, nodes):
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
782 """change state of targets changeset and it's ancestors.
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
783
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
784 Simplify the list of head."""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
785 assert not isinstance(nodes, basestring), repr(nodes)
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
786 heads = self._statesheads[state]
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
787 olds = heads[:]
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
788 heads.extend(nodes)
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
789 heads[:] = set(heads)
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
790 heads.sort()
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
791 if olds != heads:
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
792 heads[:] = noderange(repo, ["heads(::%s())" % state.headssymbol])
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
793 heads.sort()
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
794 if olds != heads:
62
bd33e749dfcc [states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 61
diff changeset
795 _writestateshead(self)
10
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
796 if state.next is not None and state.next.trackheads:
91169d2d7f1b state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 9
diff changeset
797 self.setstate(state.next, nodes) # cascading
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
798
2
166694e62daf hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 1
diff changeset
799 def _reducehead(self, candidates):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
800 """recompute a set of heads so it doesn't include _NOSHARE changeset
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
801
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
802 This is basically a complicated method that compute
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
803 heads(::candidates - _NOSHARE)
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
804 """
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
805 selected = set()
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
806 st = laststatewithout(_NOSHARE)
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
807 candidates = set(map(self.changelog.rev, candidates))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
808 heads = set(map(self.changelog.rev, self.stateheads(st)))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
809 shareable = set(self.changelog.ancestors(*heads))
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
810 shareable.update(heads)
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
811 selected = candidates & shareable
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
812 unselected = candidates - shareable
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
813 for rev in unselected:
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
814 for revh in heads:
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
815 if self.changelog.descendant(revh, rev):
30
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
816 selected.add(revh)
a2189159e92f fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 29
diff changeset
817 return sorted(map(self.changelog.node, selected))
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
818
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
819 ### enable // disable logic
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
820
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
821 @util.propertycache
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
822 def _enabledstates(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
823 """The set of state enabled in this repository"""
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
824 return self._readenabledstates()
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
825
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
826 def _readenabledstates(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
827 """read enabled state from disk"""
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
828 states = set()
28
0918e3b54f0b published is always enabled.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 27
diff changeset
829 states.add(ST0)
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
830 mapping = dict([(st.name, st) for st in STATES])
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
831 try:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
832 f = self.opener('states/Enabled')
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
833 for line in f:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
834 st = mapping.get(line.strip())
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
835 if st is not None:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
836 states.add(st)
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
837 finally:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
838 return states
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
839
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
840 def _writeenabledstates(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
841 """read enabled state to disk"""
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
842 f = self.opener('states/Enabled', 'w', atomictemp=True)
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
843 try:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
844 for st in self._enabledstates:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
845 f.write(st.name + '\n')
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
846 f.rename()
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
847 finally:
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
848 f.close()
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
849
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
850 ### local clone support
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
851
5
9445ce78a935 fix clone
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 2
diff changeset
852 def cancopy(self):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
853 """deny copy if there is _NOSHARE changeset"""
19
8784a989a572 introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18
diff changeset
854 st = laststatewithout(_NOSHARE)
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
855 return ocancopy() and (self.stateheads(st) == self.heads())
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
856
24
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
857 ### pull // push support
20ac7fa3fd29 Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 23
diff changeset
858
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
859 def pull(self, remote, *args, **kwargs):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
860 """altered pull that also update states heads on local repo"""
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
861 result = opull(remote, *args, **kwargs)
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
862 remoteheads = self._pullstatesheads(remote)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
863 for st, heads in remoteheads.iteritems():
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
864 self.setstate(st, heads)
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
865 return result
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
866
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
867 def push(self, remote, *args, **opts):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
868 """altered push that also update states heads on local and remote"""
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
869 result = opush(remote, *args, **opts)
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
870 remoteheads = self._pullstatesheads(remote)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
871 for st, heads in remoteheads.iteritems():
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
872 self.setstate(st, heads)
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
873 if heads != self.stateheads(st):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
874 self._pushstatesheads(remote, st, heads)
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
875 return result
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
876
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
877 def _pushstatesheads(self, remote, state, remoteheads):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
878 """push head of a given state for remote
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
879
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
880 This handle pushing boundary that does exist on remote host
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
881 This is done a very naive way"""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
882 local = set(self.stateheads(state))
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
883 missing = local - set(remoteheads)
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
884 while missing:
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
885 h = missing.pop()
57
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
886 ok = remote.pushkey('states-heads', node.hex(h), '', state.name)
62f2fe22bd42 Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 55
diff changeset
887 if not ok:
54
ad1a4fb0fc49 Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 51
diff changeset
888 missing.update(p.node() for p in repo[h].parents())
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
889
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
890
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
891 def _pullstatesheads(self, remote):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
892 """pull all remote states boundary locally
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
893
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
894 This can only make the boundary move on a newer changeset"""
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
895 remoteheads = {}
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
896 self.ui.debug('checking for states-heads on remote server')
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
897 if 'states-heads' not in remote.listkeys('namespaces'):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
898 self.ui.debug('states-heads not enabled on the remote server, '
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
899 'marking everything as published')
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
900 remoteheads[ST0] = remote.heads()
21
aa0870d093b8 Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20
diff changeset
901 else:
55
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
902 self.ui.debug('server has states-heads enabled, merging lists')
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
903 for hex, statenames in remote.listkeys('states-heads').iteritems():
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
904 for stn in statenames.split(','):
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
905 remoteheads.setdefault(STATESMAP[stn], []).append(node.bin(hex))
cf4626a13345 Update pushkey code to be able to push ready heads too.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 54
diff changeset
906 return remoteheads
5
9445ce78a935 fix clone
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 2
diff changeset
907
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
908 ### Tag support
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
909
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
910 def _tag(self, names, node, *args, **kwargs):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
911 """Altered version of _tag that make tag (and tagging) published"""
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
912 tagnode = o_tag(names, node, *args, **kwargs)
31
1fef89f56588 tag: do not publish for local tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 30
diff changeset
913 if tagnode is not None: # do nothing for local one
1fef89f56588 tag: do not publish for local tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 30
diff changeset
914 self.setstate(ST0, [node, tagnode])
22
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
915 return tagnode
93dd72d028a1 Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 21
diff changeset
916
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
917 ### rollback support
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
918
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
919 def _writejournal(self, desc):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
920 """extended _writejournal that also save states"""
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
921 entries = list(o_writejournal(desc))
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
922 for state in STATES:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
923 if state.trackheads:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
924 filename = 'states/%s-heads' % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
925 filepath = self.join(filename)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
926 if os.path.exists(filepath):
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
927 journalname = 'states/journal.%s-heads' % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
928 journalpath = self.join(journalname)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
929 util.copyfile(filepath, journalpath)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
930 entries.append(journalpath)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
931 return tuple(entries)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
932
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
933 def rollback(self, dryrun=False):
60
14a4499d2cd6 small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 59
diff changeset
934 """extended rollback that also restore states"""
23
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
935 wlock = lock = None
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
936 try:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
937 wlock = self.wlock()
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
938 lock = self.lock()
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
939 ret = orollback(dryrun)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
940 if not (ret or dryrun): #rollback did not failed
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
941 for state in STATES:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
942 if state.trackheads:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
943 src = self.join('states/undo.%s-heads') % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
944 dest = self.join('states/%s-heads') % state.name
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
945 if os.path.exists(src):
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
946 util.rename(src, dest)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
947 elif os.path.exists(dest): #unlink in any case
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
948 os.unlink(dest)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
949 self.__dict__.pop('_statesheads', None)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
950 return ret
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
951 finally:
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
952 release(lock, wlock)
423c62a146c7 add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 22
diff changeset
953
0
bbeef801409c minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
954 repo.__class__ = statefulrepo
1
beabde937e36 Add "private" concept (2). private changeset are hiden suppose to be hidden for
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 0
diff changeset
955