author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
Tue, 20 Sep 2011 18:17:08 +0200 | |
changeset 93 | 1b962aaf0c7d |
parent 90 | a5f6194eb05c |
child 96 | d5170cc7881c |
permissions | -rw-r--r-- |
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 |
|
76
e68f6821ae84
mention plan for hook in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
68
diff
changeset
|
230 |
XXX We are going to need hooks (pre and post) hook on state transition too. |
e68f6821ae84
mention plan for hook in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
68
diff
changeset
|
231 |
|
59
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
232 |
Template |
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
233 |
........ |
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 |
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
|
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 |
Revset |
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
238 |
...... |
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
239 |
|
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
|
240 |
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
|
241 |
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
|
242 |
|
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
|
243 |
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
|
244 |
|
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
|
245 |
- 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
|
246 |
_``<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
|
247 |
|
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
|
248 |
- 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
|
249 |
|
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 |
- 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
|
251 |
|
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
|
252 |
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
|
253 |
....... |
59
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
254 |
|
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
|
255 |
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
|
256 |
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
|
257 |
|
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
258 |
Other extensions |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
259 |
................ |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
260 |
|
64
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
261 |
:rebase: can't rebase immutable changeset. |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
262 |
: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
|
263 |
|
66
b1e64d8783f0
[states] add a todo related to MQ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
65
diff
changeset
|
264 |
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
|
265 |
|
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
266 |
|
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
267 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
268 |
Implementation |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
269 |
============== |
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 |
State definition |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
272 |
................ |
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 |
Conceptually: |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
275 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
276 |
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
|
277 |
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
|
278 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
279 |
.. 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
|
280 |
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
|
281 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
282 |
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
|
283 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
284 |
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
|
285 |
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
|
286 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
287 |
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
|
288 |
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
|
289 |
name. |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
290 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
291 |
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
|
292 |
repo. |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
293 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
294 |
: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
|
295 |
: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
|
296 |
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
|
297 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
298 |
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
|
299 |
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
|
300 |
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
|
301 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
302 |
Storage |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
303 |
....... |
59
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
304 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
305 |
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
|
306 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
307 |
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
|
308 |
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
|
309 |
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
|
310 |
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
|
311 |
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
|
312 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
313 |
``.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
|
314 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
315 |
_NOSHARE filtering |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
316 |
.................. |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
317 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
318 |
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
|
319 |
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
|
320 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
321 |
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
|
322 |
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
|
323 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
324 |
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
|
325 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
326 |
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
|
327 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
328 |
Internal plumbery |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
329 |
----------------- |
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 |
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
|
332 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
333 |
* 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
|
334 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
335 |
* repo.__class__ is extended |
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 |
* discovery is wrapped up |
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 |
* wire protocol is patched |
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 |
* 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
|
342 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
343 |
* 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
|
344 |
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
|
345 |
|
02fba620d139
move part of the readme about states in states itself.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
57
diff
changeset
|
346 |
|
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
347 |
''' |
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
348 |
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
|
349 |
from functools import partial |
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
350 |
|
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
|
351 |
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
|
352 |
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
|
353 |
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
|
354 |
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
|
355 |
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
|
356 |
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
|
357 |
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
|
358 |
from mercurial import node |
9
1f84a74df837
introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7
diff
changeset
|
359 |
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
|
360 |
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
|
361 |
from mercurial import extensions |
7
cc592295900f
Add write protocol support for private.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5
diff
changeset
|
362 |
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
|
363 |
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
|
364 |
from mercurial import error |
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
365 |
from mercurial.lock import release |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
366 |
|
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
367 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
368 |
# states property constante |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
369 |
_NOSHARE=2 |
9
1f84a74df837
introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7
diff
changeset
|
370 |
_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
|
371 |
|
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
372 |
class state(object): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
373 |
"""State of changeset |
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 |
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
|
376 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
377 |
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
|
378 |
- It's name |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
379 |
- 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
|
380 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
381 |
- It's next state. |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
382 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
383 |
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
|
384 |
""" |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
385 |
|
67
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
386 |
# plumbery utily |
19
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
387 |
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
|
388 |
self.name = name |
19
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
389 |
self.properties = properties |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
390 |
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
|
391 |
self.next = next |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
392 |
@util.propertycache |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
393 |
def trackheads(self): |
11
47ba990eff0e
update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
10
diff
changeset
|
394 |
"""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
|
395 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
396 |
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
|
397 |
return self.next is not None |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
398 |
|
67
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
399 |
# public utility |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
400 |
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
|
401 |
"""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
|
402 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
403 |
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
|
404 |
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
|
405 |
# 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
|
406 |
""" |
19
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
407 |
return cmp(self.properties, other.properties) |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
408 |
|
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
|
409 |
@property |
67
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
410 |
def mutable(self): |
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
411 |
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
|
412 |
|
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
413 |
# display code |
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
414 |
def __repr__(self): |
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
415 |
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
|
416 |
|
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
417 |
def __str__(self): |
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
418 |
return self.name |
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
419 |
|
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
420 |
|
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
421 |
# revset utility |
e62ffb77bf8c
[state] add mutable property to state object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
66
diff
changeset
|
422 |
@util.propertycache |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
423 |
def _revsetheads(self): |
11
47ba990eff0e
update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
10
diff
changeset
|
424 |
"""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
|
425 |
assert self.trackheads |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
426 |
def revsetheads(repo, subset, x): |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
427 |
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
|
428 |
heads = [] |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
429 |
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
|
430 |
try: |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
431 |
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
|
432 |
except error.LookupError: |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
433 |
pass |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
434 |
heads.sort() |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
435 |
return heads |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
436 |
return revsetheads |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
437 |
|
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
438 |
@util.propertycache |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
439 |
def headssymbol(self): |
11
47ba990eff0e
update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
10
diff
changeset
|
440 |
"""name of the revset symbols""" |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
441 |
if self.trackheads: |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
442 |
return "%sheads" % self.name |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
443 |
else: |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
444 |
return 'heads' |
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
445 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
446 |
# Actual state definition |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
447 |
|
12
6312fc525a54
rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
11
diff
changeset
|
448 |
ST2 = state('draft', _NOSHARE | _MUTABLE) |
6312fc525a54
rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
11
diff
changeset
|
449 |
ST1 = state('ready', _MUTABLE, next=ST2) |
6312fc525a54
rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
11
diff
changeset
|
450 |
ST0 = state('published', next=ST1) |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
451 |
|
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 |
12
6312fc525a54
rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
11
diff
changeset
|
453 |
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
|
454 |
# 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
|
455 |
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
|
456 |
|
21
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
457 |
@util.cachefunc |
19
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
458 |
def laststatewithout(prop): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
459 |
"""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
|
460 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
461 |
(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
|
462 |
for state in STATES: |
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
463 |
if not state.properties & prop: |
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
464 |
candidate = state |
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
465 |
else: |
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
466 |
return candidate |
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
467 |
|
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
|
468 |
# 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
|
469 |
############################# |
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 |
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
|
471 |
"""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
|
472 |
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
|
473 |
scmutil.revrange(repo, revsets)) |
0
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 |
# Patch changectx |
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
476 |
############################# |
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
477 |
|
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
478 |
def state(ctx): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
479 |
"""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
|
480 |
if ctx.node()is None: |
31906bc290ff
Working directory is draft.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
26
diff
changeset
|
481 |
return STATES[-1] |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
482 |
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
|
483 |
context.changectx.state = state |
0
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 |
# improve template |
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
486 |
############################# |
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
487 |
|
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
488 |
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
|
489 |
"""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
|
490 |
return ctx.state() |
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
491 |
|
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
|
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 |
# 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
|
494 |
############################# |
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
|
495 |
|
26
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
496 |
|
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
497 |
def cmdstates(ui, repo, *states, **opt): |
33
dca86448d736
Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
31
diff
changeset
|
498 |
"""view and modify activated states. |
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 no argument, list activated state. |
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, activate 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 |
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
|
505 |
|
dca86448d736
Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
31
diff
changeset
|
506 |
note: published state are alway activated.""" |
dca86448d736
Add some doc.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
31
diff
changeset
|
507 |
|
26
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
508 |
if not states: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
509 |
for st in sorted(repo._enabledstates): |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
510 |
ui.write('%s\n' % st) |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
511 |
else: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
512 |
off = opt.get('off', False) |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
513 |
for state_name in states: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
514 |
for st in STATES: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
515 |
if st.name == state_name: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
516 |
break |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
517 |
else: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
518 |
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
|
519 |
return 1 |
90
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
520 |
if off: |
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
521 |
if st in repo._enabledstates: |
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
522 |
repo._enabledstates.remove(st) |
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
523 |
else: |
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
524 |
ui.write_err(_('state %s already deactivated\n') % |
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
525 |
state_name) |
a5f6194eb05c
[states] do not activate deactivated state with ``hg states --off <state>``
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
83
diff
changeset
|
526 |
|
26
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
527 |
else: |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
528 |
repo._enabledstates.add(st) |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
529 |
repo._writeenabledstates() |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
530 |
return 0 |
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
531 |
|
c9da15600775
add a states command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
25
diff
changeset
|
532 |
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
|
533 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
534 |
# 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
|
535 |
def makecmd(state): |
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
536 |
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
|
537 |
"""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
|
538 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
539 |
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
|
540 |
""" % state |
18
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
541 |
revs = scmutil.revrange(repo, changesets) |
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
542 |
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
|
543 |
return 0 |
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
544 |
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
|
545 |
|
18
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
546 |
for state in STATES: |
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
547 |
if state.trackheads: |
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
548 |
cmdmoveheads = makecmd(state) |
9ffe946febc0
Autogenerate command table.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17
diff
changeset
|
549 |
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
|
550 |
|
21
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
551 |
# 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
|
552 |
######################################### |
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
|
553 |
|
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 |
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
|
555 |
"""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
|
556 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
557 |
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
|
558 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
559 |
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
|
560 |
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
|
561 |
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
|
562 |
w = repo.wlock() |
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
563 |
try: |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
564 |
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
|
565 |
try: |
62f2fe22bd42
Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
55
diff
changeset
|
566 |
repo[newhead] |
62f2fe22bd42
Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
55
diff
changeset
|
567 |
except error.RepoLookupError: |
62f2fe22bd42
Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
55
diff
changeset
|
568 |
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
|
569 |
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
|
570 |
return True |
21
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
571 |
finally: |
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
572 |
w.release() |
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
573 |
|
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
|
574 |
def liststatesheads(repo): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
575 |
"""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
|
576 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
577 |
{"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
|
578 |
""" |
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
|
579 |
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
|
580 |
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
|
581 |
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
|
582 |
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
|
583 |
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
|
584 |
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
|
585 |
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
|
586 |
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
|
587 |
return keys |
21
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
588 |
|
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
|
589 |
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
|
590 |
|
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
|
591 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
592 |
# Wrap discovery |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
593 |
#################### |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
594 |
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
|
595 |
"""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
|
596 |
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
|
597 |
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
|
598 |
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
|
599 |
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
|
600 |
"""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
|
601 |
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
|
602 |
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
|
603 |
heads = remote._reducehead(heads) |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
604 |
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
|
605 |
|
62
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
606 |
# 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
|
607 |
##################### |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
608 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
609 |
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
|
610 |
"""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
|
611 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
612 |
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
|
613 |
heads = [nullid] |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
614 |
try: |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
615 |
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
|
616 |
try: |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
617 |
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
|
618 |
finally: |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
619 |
f.close() |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
620 |
except IOError: |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
621 |
pass |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
622 |
return heads |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
623 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
624 |
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
|
625 |
"""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
|
626 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
627 |
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
|
628 |
statesheads = {} |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
629 |
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
|
630 |
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
|
631 |
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
|
632 |
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
|
633 |
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
|
634 |
return statesheads |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
635 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
636 |
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
|
637 |
"""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
|
638 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
639 |
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
|
640 |
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
|
641 |
try: |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
642 |
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
|
643 |
f.write(hex(h) + '\n') |
83
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
644 |
try: |
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
645 |
f.rename() |
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
646 |
except AttributeError: # old version |
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
647 |
f.close() |
62
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
648 |
finally: |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
649 |
f.close() |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
650 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
651 |
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
|
652 |
"""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
|
653 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
654 |
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
|
655 |
# XXX transaction! |
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
656 |
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
|
657 |
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
|
658 |
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
|
659 |
_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
|
660 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
661 |
# WireProtocols |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
662 |
#################### |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
663 |
def wireheads(repo, proto): |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
664 |
"""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
|
665 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
666 |
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
|
667 |
st = laststatewithout(_NOSHARE) |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
668 |
h = repo.stateheads(st) |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
669 |
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
|
670 |
|
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
671 |
# Other extension support |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
672 |
######################### |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
673 |
|
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
674 |
def wraprebasebuildstate(orig, repo, *args, **kwargs): |
78
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
675 |
"""Wrapped rebuild state that check for immutable changeset |
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
676 |
|
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
677 |
buildstate are the best place i found to hook :-/""" |
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
678 |
result = orig(repo, *args, **kwargs) |
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
679 |
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
|
680 |
# 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
|
681 |
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
|
682 |
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
|
683 |
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
|
684 |
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
|
685 |
if not state.mutable: |
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
686 |
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
|
687 |
% node.short(base), |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
688 |
hint=_('see `hg help --extension states` for details')) |
78
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
689 |
return result |
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
690 |
|
64
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
691 |
def wrapmqqimport(orig, queue, repo, *args, **kwargs): |
78
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
692 |
"""Wrapper for rebuild state that deny importing immutable changeset |
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
693 |
""" |
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
694 |
if 'rev' in kwargs: |
77
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
695 |
# we can take the min as non linear import will break |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
696 |
# anyway |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
697 |
revs = scmutil.revrange(repo, kwargs['rev']) |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
698 |
if revs: |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
699 |
base = min(revs) |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
700 |
basenode = repo.changelog.node(base) |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
701 |
state = repo.nodestate(basenode) |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
702 |
if not state.mutable: |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
703 |
raise util.Abort(_('can not qimport published changeset %s') |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
704 |
% node.short(basenode), |
45afdbf062f4
[states] update qimport code so it doesn't fails on qimport without -r
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
76
diff
changeset
|
705 |
hint=_('see `hg help --extension states` for details')) |
78
ddcc4bb6c4d4
[states] add some documentation for extension wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
77
diff
changeset
|
706 |
return orig(queue, repo, *args, **kwargs) |
64
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
707 |
|
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
708 |
|
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
|
709 |
def uisetup(ui): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
710 |
""" |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
711 |
* 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
|
712 |
* add template keyword |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
713 |
""" |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
714 |
# patch discovery |
2
166694e62daf
hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
1
diff
changeset
|
715 |
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
|
716 |
extensions.wrapfunction(discovery, 'findcommonincoming', filterprivatein) |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
717 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
718 |
# patch wireprotocol |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
719 |
wireproto.commands['heads'] = (wireheads, '') |
7
cc592295900f
Add write protocol support for private.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
5
diff
changeset
|
720 |
|
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
721 |
# add template keyword |
17
6aa349f47e7c
add templatekeyword in a proper location
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
16
diff
changeset
|
722 |
templatekw.keywords['state'] = showstate |
6aa349f47e7c
add templatekeyword in a proper location
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
16
diff
changeset
|
723 |
|
14
f5e1055a3f68
reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
13
diff
changeset
|
724 |
def extsetup(ui): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
725 |
"""Extension setup |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
726 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
727 |
* add revset entry""" |
14
f5e1055a3f68
reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
13
diff
changeset
|
728 |
for state in STATES: |
f5e1055a3f68
reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
13
diff
changeset
|
729 |
if state.trackheads: |
f5e1055a3f68
reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
13
diff
changeset
|
730 |
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
|
731 |
# wrap rebase |
63
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
732 |
try: |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
733 |
rebase = extensions.find('rebase') |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
734 |
if rebase: |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
735 |
extensions.wrapfunction(rebase, 'buildstate', wraprebasebuildstate) |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
736 |
except KeyError: |
f47a5f990eb2
[states] add rebase support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
62
diff
changeset
|
737 |
pass # rebase not found |
64
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
738 |
# wrap mq |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
739 |
try: |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
740 |
mq = extensions.find('mq') |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
741 |
if mq: |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
742 |
extensions.wrapfunction(mq.queue, 'qimport', wrapmqqimport) |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
743 |
except KeyError: |
6a7dc5ca05b8
[states] add mq support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
63
diff
changeset
|
744 |
pass # mq not found |
14
f5e1055a3f68
reorder extsetup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
13
diff
changeset
|
745 |
|
62
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
746 |
|
bd33e749dfcc
[states] move IO logic outside the repository subclass
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
61
diff
changeset
|
747 |
|
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
748 |
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
|
749 |
"""Repository setup |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
750 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
751 |
* extend repo class with states logic""" |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
752 |
|
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
753 |
if not repo.local(): |
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
754 |
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
|
755 |
|
21
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
756 |
ocancopy =repo.cancopy |
22
93dd72d028a1
Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
21
diff
changeset
|
757 |
opull = repo.pull |
93dd72d028a1
Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
21
diff
changeset
|
758 |
opush = repo.push |
93dd72d028a1
Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
21
diff
changeset
|
759 |
o_tag = repo._tag |
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
760 |
orollback = repo.rollback |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
761 |
o_writejournal = repo._writejournal |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
762 |
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
|
763 |
"""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
|
764 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
765 |
- nodestate |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
766 |
- stateheads |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
767 |
""" |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
768 |
|
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
769 |
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
|
770 |
"""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
|
771 |
rev = self.changelog.rev(node) |
29
52c227772dad
fix nodestate computation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
28
diff
changeset
|
772 |
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
|
773 |
# 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
|
774 |
if state.next is not None: |
30
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
775 |
ancestors = map(self.changelog.rev, self.stateheads(state)) |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
776 |
ancestors.extend(self.changelog.ancestors(*ancestors)) |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
777 |
if rev in ancestors: |
29
52c227772dad
fix nodestate computation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
28
diff
changeset
|
778 |
break |
13
e95e8cf7988f
Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
12
diff
changeset
|
779 |
return state |
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
780 |
|
12
6312fc525a54
rename state related attributes
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
11
diff
changeset
|
781 |
|
9
1f84a74df837
introduce a third state
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7
diff
changeset
|
782 |
|
13
e95e8cf7988f
Get ride of dedicated heads property.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
12
diff
changeset
|
783 |
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
|
784 |
"""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
|
785 |
# 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
|
786 |
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
|
787 |
state = state.next |
9983f240ac63
Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19
diff
changeset
|
788 |
# 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
|
789 |
if state.trackheads: |
20
9983f240ac63
Smarter states heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19
diff
changeset
|
790 |
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
|
791 |
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
|
792 |
|
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 |
@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
|
794 |
def _statesheads(self): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
795 |
"""{ 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
|
796 |
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
|
797 |
|
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 |
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
|
799 |
"""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
|
800 |
|
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
|
801 |
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
|
802 |
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
|
803 |
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
|
804 |
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
|
805 |
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
|
806 |
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
|
807 |
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
|
808 |
if olds != heads: |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
809 |
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
|
810 |
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
|
811 |
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
|
812 |
_writestateshead(self) |
10
91169d2d7f1b
state are now object.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
9
diff
changeset
|
813 |
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
|
814 |
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
|
815 |
|
2
166694e62daf
hide private changeset to inc and pull.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
1
diff
changeset
|
816 |
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
|
817 |
"""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
|
818 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
819 |
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
|
820 |
heads(::candidates - _NOSHARE) |
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
821 |
""" |
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
|
822 |
selected = set() |
19
8784a989a572
introduce a ``laststatewithout`` method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18
diff
changeset
|
823 |
st = laststatewithout(_NOSHARE) |
30
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
824 |
candidates = set(map(self.changelog.rev, candidates)) |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
825 |
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
|
826 |
shareable = set(self.changelog.ancestors(*heads)) |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
827 |
shareable.update(heads) |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
828 |
selected = candidates & shareable |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
829 |
unselected = candidates - shareable |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
830 |
for rev in unselected: |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
831 |
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
|
832 |
if self.changelog.descendant(revh, rev): |
30
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
833 |
selected.add(revh) |
a2189159e92f
fix outgoing filtering.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
29
diff
changeset
|
834 |
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
|
835 |
|
24
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
836 |
### 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
|
837 |
|
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
838 |
@util.propertycache |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
839 |
def _enabledstates(self): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
840 |
"""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
|
841 |
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
|
842 |
|
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
843 |
def _readenabledstates(self): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
844 |
"""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
|
845 |
states = set() |
28
0918e3b54f0b
published is always enabled.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
27
diff
changeset
|
846 |
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
|
847 |
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
|
848 |
try: |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
849 |
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
|
850 |
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
|
851 |
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
|
852 |
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
|
853 |
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
|
854 |
finally: |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
855 |
return states |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
856 |
|
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
857 |
def _writeenabledstates(self): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
858 |
"""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
|
859 |
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
|
860 |
try: |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
861 |
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
|
862 |
f.write(st.name + '\n') |
83
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
863 |
try: |
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
864 |
f.rename() |
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
865 |
except AttributeError: # old version |
97a5c943db19
Compat with mercurial 1.9.2
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
78
diff
changeset
|
866 |
f.close() |
24
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
867 |
finally: |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
868 |
f.close() |
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
869 |
|
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
870 |
### 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
|
871 |
|
5 | 872 |
def cancopy(self): |
60
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
873 |
"""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
|
874 |
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
|
875 |
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
|
876 |
|
24
20ac7fa3fd29
Move state activitation in a dedicated file repo-side
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
23
diff
changeset
|
877 |
### 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
|
878 |
|
21
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
879 |
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
|
880 |
"""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
|
881 |
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
|
882 |
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
|
883 |
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
|
884 |
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
|
885 |
return result |
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
886 |
|
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
887 |
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
|
888 |
"""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
|
889 |
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
|
890 |
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
|
891 |
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
|
892 |
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
|
893 |
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
|
894 |
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
|
895 |
return result |
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
896 |
|
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
|
897 |
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
|
898 |
"""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
|
899 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
900 |
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
|
901 |
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
|
902 |
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
|
903 |
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
|
904 |
while missing: |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
905 |
h = missing.pop() |
57
62f2fe22bd42
Use dedicated mechanism to report pushkey success
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
55
diff
changeset
|
906 |
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
|
907 |
if not ok: |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
908 |
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
|
909 |
|
aa0870d093b8
Add pull and push support for relevant heads.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20
diff
changeset
|
910 |
|
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
|
911 |
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
|
912 |
"""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
|
913 |
|
14a4499d2cd6
small refactoring and big doc update.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
59
diff
changeset
|
914 |
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
|
915 |
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
|
916 |
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
|
917 |
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
|
918 |
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
|
919 |
'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
|
920 |
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
|
921 |
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
|
922 |
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
|
923 |
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
|
924 |
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
|
925 |
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
|
926 |
return remoteheads |
5 | 927 |
|
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
928 |
### Tag support |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
929 |
|
22
93dd72d028a1
Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
21
diff
changeset
|
930 |
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
|
931 |
"""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
|
932 |
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
|
933 |
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
|
934 |
self.setstate(ST0, [node, tagnode]) |
22
93dd72d028a1
Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
21
diff
changeset
|
935 |
return tagnode |
93dd72d028a1
Automatically publish on tag.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
21
diff
changeset
|
936 |
|
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
937 |
### rollback support |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
938 |
|
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
939 |
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
|
940 |
"""extended _writejournal that also save states""" |
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
941 |
entries = list(o_writejournal(desc)) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
942 |
for state in STATES: |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
943 |
if state.trackheads: |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
944 |
filename = 'states/%s-heads' % state.name |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
945 |
filepath = self.join(filename) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
946 |
if os.path.exists(filepath): |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
947 |
journalname = 'states/journal.%s-heads' % state.name |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
948 |
journalpath = self.join(journalname) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
949 |
util.copyfile(filepath, journalpath) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
950 |
entries.append(journalpath) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
951 |
return tuple(entries) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
952 |
|
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
953 |
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
|
954 |
"""extended rollback that also restore states""" |
23
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
955 |
wlock = lock = None |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
956 |
try: |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
957 |
wlock = self.wlock() |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
958 |
lock = self.lock() |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
959 |
ret = orollback(dryrun) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
960 |
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
|
961 |
for state in STATES: |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
962 |
if state.trackheads: |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
963 |
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
|
964 |
dest = self.join('states/%s-heads') % state.name |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
965 |
if os.path.exists(src): |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
966 |
util.rename(src, dest) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
967 |
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
|
968 |
os.unlink(dest) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
969 |
self.__dict__.pop('_statesheads', None) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
970 |
return ret |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
971 |
finally: |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
972 |
release(lock, wlock) |
423c62a146c7
add rollback support.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
22
diff
changeset
|
973 |
|
0
bbeef801409c
minimalistic state concept.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
974 |
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
|
975 |