Mercurial > evolve
annotate hgext/obsolete.py @ 299:eda6491ca269
obsolete: add 'obsolete' keyword
The obsolete keyword displays the node status among 'stable',
'unstable', 'suspended', 'extinct'.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Fri, 22 Jun 2012 18:04:43 +0200 |
parents | f597421662f7 |
children | 3b1f326878e5 |
rev | line source |
---|---|
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
1 # obsolete.py - introduce the obsolete concept in mercurial. |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
2 # |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
3 # Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
4 # Logilab SA <contact@logilab.fr> |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
5 # |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
7 # GNU General Public License version 2 or any later version. |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
8 """Introduce the Obsolete concept to mercurial |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
9 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
10 General concept |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
11 =============== |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
12 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
13 This extension introduces the *obsolete* concept. It adds a new *obsolete* |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
14 relation between two changesets. A relation ``<changeset B> obsolete <changeset |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
15 A>`` is set to denote that ``<changeset B>`` is new version of ``<changeset |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
16 A>``. |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
17 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
18 The *obsolete* relation act as a **perpendicular history** to the standard |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
19 changeset history. Standard changeset history versions files. The *obsolete* |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
20 relation versions changesets. |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
21 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
22 :obsolete: a changeset that has been replaced by another one. |
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
23 :unstable: a changeset that is not obsolete but has an obsolete ancestor. |
85
531058dbd703
[obsolete] vocabulary update suggestion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
84
diff
changeset
|
24 :suspended: an obsolete changeset with unstable descendant. |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
25 :extinct: an obsolete changeset without unstable descendant. |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
26 (subject to garbage collection) |
85
531058dbd703
[obsolete] vocabulary update suggestion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
84
diff
changeset
|
27 |
531058dbd703
[obsolete] vocabulary update suggestion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
84
diff
changeset
|
28 Another name for unstable could be out of sync. |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
29 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
30 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
31 Usage and Feature |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
32 ================= |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
33 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
34 Display and Exchange |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
35 -------------------- |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
36 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
37 obsolete changesets are hidden. (except if they have non obsolete changeset) |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
38 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
39 obsolete changesets are not exchanged. This will probably change later but it |
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
40 was the simpler solution for now. |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
41 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
42 New commands |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
43 ------------ |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
44 |
275
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
45 Note that rebased changesets are not marked obsolete rather than being stripped |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
46 In this experimental extensions, this is done forcing the --keep option. Trying |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
47 to use the --keep option of rebase with this extensionn this experimental |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
48 extension will cause such a call to abort. Until better releasen please use |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
49 graft command to rebase and copy changesets. |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
50 |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
51 Context object |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
52 -------------- |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
53 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
54 Context gains a ``obsolete`` method that will return True if a changeset is |
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
55 obsolete False otherwise. |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
56 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
57 revset |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
58 ------ |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
59 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
60 Add an ``obsolete()`` entry. |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
61 |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
62 repo extension |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
63 -------------- |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
64 |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
65 To Do |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
66 ~~~~~ |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
67 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
68 - refuse to obsolete published changesets |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
69 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
70 - handle split |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
71 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
72 - handle conflict |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
73 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
74 - handle unstable // out of sync |
69
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
75 |
aee53d546849
[obsolete] update doc
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
58
diff
changeset
|
76 """ |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
77 |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
78 import os |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
79 try: |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
80 from cStringIO import StringIO |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
81 except ImportError: |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
82 from StringIO import StringIO |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
83 |
75
d7b11772f0b5
[obsolete] published changeset can't be obsoleted
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
74
diff
changeset
|
84 from mercurial.i18n import _ |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
85 |
89
757153438e58
[obsolet] base64 encore obsolete rel for pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
87
diff
changeset
|
86 import base64 |
224 | 87 import json |
89
757153438e58
[obsolet] base64 encore obsolete rel for pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
87
diff
changeset
|
88 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
89 from mercurial import util |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
90 from mercurial import context |
39 | 91 from mercurial import revset |
40
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
92 from mercurial import scmutil |
42
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
93 from mercurial import extensions |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
94 from mercurial import pushkey |
46
3b0364fc822f
Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
44
diff
changeset
|
95 from mercurial import discovery |
3b0364fc822f
Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
44
diff
changeset
|
96 from mercurial import error |
79
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
97 from mercurial import commands |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
98 from mercurial import changelog |
115
d60eddda9546
add an option to ensure unstable are secret
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
114
diff
changeset
|
99 from mercurial import phases |
80
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
100 from mercurial.node import hex, bin, short, nullid |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
101 from mercurial.lock import release |
252
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
102 from mercurial import localrepo |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
103 from mercurial import cmdutil |
299
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
104 from mercurial import templatekw |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
105 |
160
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
106 try: |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
107 from mercurial.localrepo import storecache |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
108 storecache('babar') # to trigger import |
197
c2d692c8f599
stronger try except for store cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
160
diff
changeset
|
109 except (TypeError, ImportError): |
160
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
110 def storecache(*args): |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
111 return scmutil.filecache(*args, instore=True) |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
112 |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
113 |
72
774932a6cc0d
[obsolete] rationalize doc header.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
71
diff
changeset
|
114 ### Patch changectx |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
115 ############################# |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
116 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
117 def obsolete(ctx): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
118 """is the changeset obsolete by other""" |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
119 if ctx.node()is None: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
120 return False |
112
eae9be0ee00e
adapt obsolete to phase.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
109
diff
changeset
|
121 return bool(ctx._repo.obsoletedby(ctx.node())) and ctx.phase() |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
123 context.changectx.obsolete = obsolete |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
124 |
148
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
125 def unstable(ctx): |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
126 """is the changeset unstable (have obsolete ancestor)""" |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
127 if ctx.node() is None: |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
128 return False |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
129 return ctx.rev() in ctx._repo._unstableset |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
130 |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
131 context.changectx.unstable = unstable |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
132 |
213
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
133 def extinct(ctx): |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
134 """is the changeset extinct by other""" |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
135 if ctx.node() is None: |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
136 return False |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
137 return ctx.rev() in ctx._repo._extinctset |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
138 |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
139 context.changectx.extinct = extinct |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
140 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
141 |
72
774932a6cc0d
[obsolete] rationalize doc header.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
71
diff
changeset
|
142 ### revset |
39 | 143 ############################# |
144 | |
112
eae9be0ee00e
adapt obsolete to phase.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
109
diff
changeset
|
145 |
39 | 146 def revsetobsolete(repo, subset, x): |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
147 """obsolete changesets""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
148 args = revset.getargs(x, 0, 0, 'obsolete takes no argument') |
252
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
149 return [r for r in subset if r in repo._obsoleteset and repo._phasecache.phase(repo, r) > 0] |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
150 |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
151 # XXX Backward compatibility, to be removed once stabilized |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
152 if '_phasecache' not in vars(localrepo.localrepository): # new api |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
153 def revsetobsolete(repo, subset, x): |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
154 """obsolete changesets""" |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
155 args = revset.getargs(x, 0, 0, 'obsolete takes no argument') |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
156 return [r for r in subset if r in repo._obsoleteset and repo._phaserev[r] > 0] |
39 | 157 |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
158 def revsetunstable(repo, subset, x): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
159 """non obsolete changesets descendant of obsolete one""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
160 args = revset.getargs(x, 0, 0, 'unstable takes no arguments') |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
161 return [r for r in subset if r in repo._unstableset] |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
162 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
163 def revsetsuspended(repo, subset, x): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
164 """obsolete changesets with non obsolete descendants""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
165 args = revset.getargs(x, 0, 0, 'unstable takes no arguments') |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
166 return [r for r in subset if r in repo._suspendedset] |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
167 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
168 def revsetextinct(repo, subset, x): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
169 """obsolete changesets without obsolete descendants""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
170 args = revset.getargs(x, 0, 0, 'unstable takes no arguments') |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
171 return [r for r in subset if r in repo._extinctset] |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
172 |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
173 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
174 def _obsparents(repo, s): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
175 """obsolete parents of a subset""" |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
176 cs = set() |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
177 nm = repo.changelog.nodemap |
224 | 178 markerbysubj = repo.obsoletestore.subjects |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
179 for r in s: |
224 | 180 for p in markerbysubj.get(repo[r].node(), ()): |
181 pr = nm.get(p['object']) | |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
182 if pr is not None: |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
183 cs.add(pr) |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
184 return cs |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
185 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
186 def revsetobsparents(repo, subset, x): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
187 """obsolete parents""" |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
188 s = revset.getset(repo, range(len(repo)), x) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
189 cs = _obsparents(repo, s) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
190 return [r for r in subset if r in cs] |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
191 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
192 def _obsancestors(repo, s): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
193 """obsolete ancestors of a subset""" |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
194 toproceed = [repo[r].node() for r in s] |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
195 seen = set() |
224 | 196 allsubjects = repo.obsoletestore.subjects |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
197 while toproceed: |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
198 nc = toproceed.pop() |
224 | 199 for mark in allsubjects.get(nc, ()): |
200 np = mark['object'] | |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
201 if np not in seen: |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
202 seen.add(np) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
203 toproceed.append(np) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
204 nm = repo.changelog.nodemap |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
205 cs = set() |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
206 for p in seen: |
204
50039b9b535e
2.2 compat: nodemap.get take a single argument now.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
203
diff
changeset
|
207 pr = nm.get(p) |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
208 if pr is not None: |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
209 cs.add(pr) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
210 return cs |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
211 |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
212 def revsetobsancestors(repo, subset, x): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
213 """obsolete parents""" |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
214 s = revset.getset(repo, range(len(repo)), x) |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
215 cs = _obsancestors(repo, s) |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
216 return [r for r in subset if r in cs] |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
217 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
218 |
299
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
219 ### template keywords |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
220 ##################### |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
221 |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
222 def obsoletekw(repo, ctx, templ, **args): |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
223 """:obsolete: String. The obsolescence level of the node, could be |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
224 ``stable``, ``unstable``, ``suspended`` or ``extinct``. |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
225 """ |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
226 rev = ctx.rev() |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
227 if rev in repo._extinctset: |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
228 return 'extinct' |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
229 if rev in repo._suspendedset: |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
230 return 'suspended' |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
231 if rev in repo._unstableset: |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
232 return 'unstable' |
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
233 return 'stable' |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
234 |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
235 ### Other Extension compat |
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
236 ############################ |
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
237 |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
238 |
253
8ee6c5b98d73
[obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
252
diff
changeset
|
239 def buildstate(orig, repo, dest, rebaseset, *ags, **kws): |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
240 """wrapper for rebase 's buildstate that exclude obsolete changeset""" |
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
241 rebaseset = repo.revs('%ld - extinct()', rebaseset) |
253
8ee6c5b98d73
[obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
252
diff
changeset
|
242 return orig(repo, dest, rebaseset, *ags, **kws) |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
243 |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
244 def defineparents(orig, repo, rev, target, state, *args, **kwargs): |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
245 rebasestate = getattr(repo, '_rebasestate', None) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
246 if rebasestate is not None: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
247 repo._rebasestate = dict(state) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
248 repo._rebasetarget = target |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
249 return orig(repo, rev, target, state, *args, **kwargs) |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
250 |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
251 def concludenode(orig, repo, rev, p1, *args, **kwargs): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
252 """wrapper for rebase 's concludenode that set obsolete relation""" |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
253 newrev = orig(repo, rev, p1, *args, **kwargs) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
254 rebasestate = getattr(repo, '_rebasestate', None) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
255 if rebasestate is not None: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
256 if newrev is not None: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
257 nrev = repo[newrev].rev() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
258 else: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
259 nrev = p1 |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
260 repo._rebasestate[rev] = nrev |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
261 return newrev |
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
262 |
274
6622a24f3b0f
obsolete: fix rebase wrapping
Patrick Mezard <patrick@mezard.eu>
parents:
273
diff
changeset
|
263 def cmdrebase(orig, ui, repo, *args, **kwargs): |
275
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
264 if kwargs.get('keep', False): |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
265 raise util.Abort(_('rebase --keep option is unsupported with obsolete ' |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
266 'extension'), hint=_("see 'hg help obsolete'")) |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
267 kwargs = dict(kwargs) |
84
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
268 kwargs['keep'] = True |
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
269 |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
270 # We want to mark rebased revision as obsolete and set their |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
271 # replacements if any. Doing it in concludenode() prevents |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
272 # aborting the rebase, and is not called with all relevant |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
273 # revisions in --collapse case. Instead, we try to track the |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
274 # rebase state structure by sampling/updating it in |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
275 # defineparents() and concludenode(). The obsolete markers are |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
276 # added from this state after a successful call. |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
277 repo._rebasestate = {} |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
278 repo._rebasetarget = None |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
279 maxrev = len(repo) - 1 |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
280 try: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
281 res = orig(ui, repo, *args, **kwargs) |
297
590ac023c536
rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents:
285
diff
changeset
|
282 # Filter nullmerge or unrebased entries |
590ac023c536
rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents:
285
diff
changeset
|
283 repo._rebasestate = dict(p for p in repo._rebasestate.iteritems() |
590ac023c536
rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents:
285
diff
changeset
|
284 if p[1] >= 0) |
590ac023c536
rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents:
285
diff
changeset
|
285 if not res and not kwargs.get('abort') and repo._rebasestate: |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
286 # Rebased revisions are assumed to be descendants of |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
287 # targetrev. If a source revision is mapped to targetrev |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
288 # or to another rebased revision, it must have been |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
289 # removed. |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
290 targetrev = repo[repo._rebasetarget].rev() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
291 newrevs = set([targetrev]) |
298
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
292 replacements = {} |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
293 for rev, newrev in sorted(repo._rebasestate.items()): |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
294 oldnode = repo[rev].node() |
297
590ac023c536
rebase: improve invalid revisions filtering
Patrick Mezard <patrick@mezard.eu>
parents:
285
diff
changeset
|
295 if newrev not in newrevs: |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
296 newnode = repo[newrev].node() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
297 newrevs.add(newrev) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
298 else: |
298
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
299 newnode = nullid |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
300 replacements[oldnode] = newnode |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
301 |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
302 if kwargs.get('collapse'): |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
303 newnodes = set(n for n in replacements.values() if n != nullid) |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
304 if newnodes: |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
305 # Collapsing into more than one revision? |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
306 assert len(newnodes) == 1, newnodes |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
307 newnode = newnodes.pop() |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
308 else: |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
309 newnode = nullid |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
310 repo.addcollapsedobsolete(replacements, newnode) |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
311 else: |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
312 for oldnode, newnode in replacements.iteritems(): |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
313 repo.addobsolete(newnode, oldnode) |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
314 return res |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
315 finally: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
316 delattr(repo, '_rebasestate') |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
317 delattr(repo, '_rebasetarget') |
84
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
318 |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
319 |
39 | 320 def extsetup(ui): |
75
d7b11772f0b5
[obsolete] published changeset can't be obsoleted
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
74
diff
changeset
|
321 |
39 | 322 revset.symbols["obsolete"] = revsetobsolete |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
323 revset.symbols["unstable"] = revsetunstable |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
324 revset.symbols["suspended"] = revsetsuspended |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
325 revset.symbols["extinct"] = revsetextinct |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
326 revset.symbols["obsparents"] = revsetobsparents |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
327 revset.symbols["obsancestors"] = revsetobsancestors |
46
3b0364fc822f
Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
44
diff
changeset
|
328 |
299
eda6491ca269
obsolete: add 'obsolete' keyword
Patrick Mezard <patrick@mezard.eu>
parents:
298
diff
changeset
|
329 templatekw.keywords['obsolete'] = obsoletekw |
46
3b0364fc822f
Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
44
diff
changeset
|
330 |
42
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
331 try: |
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
332 rebase = extensions.find('rebase') |
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
333 if rebase: |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
334 extensions.wrapfunction(rebase, 'buildstate', buildstate) |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
335 extensions.wrapfunction(rebase, 'defineparents', defineparents) |
42
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
336 extensions.wrapfunction(rebase, 'concludenode', concludenode) |
84
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
337 extensions.wrapcommand(rebase.cmdtable, "rebase", cmdrebase) |
42
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
338 except KeyError: |
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
339 pass # rebase not found |
39 | 340 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
341 # Pushkey mechanism for mutable |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
342 ######################################### |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
343 |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
344 def pushobsolete(repo, key, old, raw): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
345 """push obsolete relation through pushkey""" |
224 | 346 assert key == "markers" |
347 l = repo.lock() | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
348 try: |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
349 tmp = StringIO() |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
350 tmp.write(raw) |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
351 tmp.seek(0) |
224 | 352 repo.obsoletestore.load(tmp) |
353 repo.obsoletestore._dirty = True # XXX meh | |
354 return 1 | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
355 finally: |
224 | 356 l.release() |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
357 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
358 def listobsolete(repo): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
359 """dump all obsolete relation in |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
360 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
361 XXX this have be improved""" |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
362 tmp = StringIO() |
224 | 363 repo.obsoletestore.save(tmp) |
364 return {'markers': base64.b64encode(tmp.getvalue())} | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
365 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
366 pushkey.register('obsolete', pushobsolete, listobsolete) |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
367 |
214
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
368 ### Discovery wrapping |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
369 ############################# |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
370 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
371 class blist(list, object): |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
372 """silly class to have non False but empty list""" |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
373 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
374 def __nonzero__(self): |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
375 return bool(len(self.orig)) |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
376 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
377 def wrapfindcommonoutgoing(orig, repo, *args, **kwargs): |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
378 """wrap mercurial.discovery.findcommonoutgoing to remove extinct changeset |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
379 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
380 Such excluded changeset are removed from excluded and will *not* appear |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
381 are excluded secret changeset. |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
382 """ |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
383 outgoing = orig(repo, *args, **kwargs) |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
384 orig = outgoing.excluded |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
385 outgoing.excluded = blist(n for n in orig if not repo[n].extinct()) |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
386 # when no revision is specified (push everything) a shortcut is taken when |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
387 # nothign was exclude. taking this code path when extinct changeset have |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
388 # been excluded leads to repository corruption. |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
389 outgoing.excluded.orig = orig |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
390 return outgoing |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
391 |
217
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
392 def wrapcheckheads(orig, repo, remote, outgoing, *args, **kwargs): |
218
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
393 """wrap mercurial.discovery.checkheads |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
394 |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
395 * prevent unstability to be pushed |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
396 * patch remote to ignore obsolete heads on remote |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
397 """ |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
398 # do not push instability |
217
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
399 for h in outgoing.missingheads: |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
400 # checking heads only is enought because any thing base on obsolete |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
401 # changeset is either obsolete or unstable. |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
402 ctx = repo[h] |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
403 hint = _("use 'hg stabilize' to get a stable history (or --force to proceed)") |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
404 if ctx.unstable(): |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
405 raise util.Abort(_("Trying to push unstable changeset: %s!") % ctx, |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
406 hint=hint) |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
407 if ctx.obsolete(): |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
408 raise util.Abort(_("Trying to push obsolete changeset: %s!") % ctx, |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
409 hint=hint) |
218
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
410 ### patch remote branch map |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
411 # do not read it this burn eyes |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
412 try: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
413 if 'oldbranchmap' not in vars(remote): |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
414 remote.oldbranchmap = remote.branchmap |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
415 def branchmap(): |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
416 newbm = {} |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
417 oldbm = None |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
418 if (util.safehasattr(phases, 'visiblebranchmap') |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
419 and not util.safehasattr(remote, 'ignorevisiblebranchmap') |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
420 ): |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
421 remote.ignorevisiblebranchmap = False |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
422 remote.branchmap = remote.oldbranchmap |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
423 oldbm = phases.visiblebranchmap(remote) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
424 remote.branchmap = remote.newbranchmap |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
425 remote.ignorevisiblebranchmap = True |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
426 if oldbm is None: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
427 oldbm = remote.oldbranchmap() |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
428 for branch, nodes in oldbm.iteritems(): |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
429 nodes = list(nodes) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
430 new = set() |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
431 while nodes: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
432 n = nodes.pop() |
224 | 433 if n in repo.obsoletestore.objects: |
434 markers = repo.obsoletestore.objects[n] | |
435 for mark in markers: | |
436 for newernode in mark['subjects']: | |
437 if newernode is not None: | |
438 nodes.append(newernode) | |
218
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
439 else: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
440 new.add(n) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
441 if new: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
442 newbm[branch] = list(new) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
443 return newbm |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
444 remote.ignorevisiblebranchmap = True |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
445 remote.branchmap = branchmap |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
446 remote.newbranchmap = branchmap |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
447 return orig(repo, remote, outgoing, *args, **kwargs) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
448 finally: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
449 remote.__dict__.pop('branchmap', None) # restore class one |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
450 remote.__dict__.pop('oldbranchmap', None) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
451 remote.__dict__.pop('newbranchmap', None) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
452 remote.__dict__.pop('ignorevisiblebranchmap', None) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
453 |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
454 # eye are still burning |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
455 def wrapvisiblebranchmap(orig, repo): |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
456 ignore = getattr(repo, 'ignorevisiblebranchmap', None) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
457 if ignore is None: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
458 return orig(repo) |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
459 elif ignore: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
460 return repo.branchmap() |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
461 else: |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
462 return None # break recursion |
217
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
463 |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
464 |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
465 ### New commands |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
466 ############################# |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
467 |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
468 cmdtable = {} |
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
469 command = cmdutil.command(cmdtable) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
470 |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
471 @command('debugobsolete', [], _('SUBJECT OBJECT')) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
472 def cmddebugobsolete(ui, repo, subject, object): |
278
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
473 """add an obsolete relation between two nodes |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
474 |
278
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
475 The subject is expected to be a newer version of the object. |
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
476 """ |
224 | 477 lock = repo.lock() |
478 try: | |
479 sub = repo[subject] | |
480 obj = repo[object] | |
481 repo.addobsolete(sub.node(), obj.node()) | |
482 finally: | |
483 lock.release() | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
484 return 0 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
485 |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
486 @command('debugconvertobsolete', [], '') |
224 | 487 def cmddebugconvertobsolete(ui, repo): |
278
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
488 """import markers from an .hg/obsolete-relations file""" |
224 | 489 cnt = 0 |
490 l = repo.lock() | |
491 try: | |
492 repo._importoldobsolete = True | |
493 store = repo.obsoletestore | |
494 try: | |
495 f = repo.opener('obsolete-relations') | |
496 try: | |
497 for line in f: | |
498 subhex, objhex = line.split() | |
499 sub = bin(subhex) | |
500 obj = bin(objhex) | |
501 newmarker = { | |
502 'subjects': (sub==nullid) and [] or [sub], | |
503 'object': obj, | |
504 'date': util.makedate(), | |
505 'user': ui.username(), | |
506 'reason': 'import from older format.', | |
507 } | |
508 store.new(newmarker) | |
509 store._dirty = True | |
510 cnt += 1 | |
511 finally: | |
512 f.close() | |
513 util.unlink(repo.join('obsolete-relations')) | |
514 except IOError: | |
515 ui.warn('nothing to do\n') | |
516 pass | |
517 finally: | |
518 del repo._importoldobsolete | |
519 l.release() | |
520 ui.status('%i obsolete marker converted\n' % cnt) | |
521 | |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
522 @command('debugsuccessors', [], '') |
273
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
523 def cmddebugsuccessors(ui, repo): |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
524 """dump obsolete changesets and their successors |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
525 |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
526 Each line matches an existing marker, the first identifier is the |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
527 obsolete changeset identifier, followed by it successors. |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
528 """ |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
529 lock = repo.lock() |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
530 try: |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
531 allsuccessors = repo.obsoletestore.objects |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
532 for old in sorted(allsuccessors): |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
533 successors = [sorted(m['subjects']) for m in allsuccessors[old]] |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
534 for i, group in enumerate(sorted(successors)): |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
535 ui.write('%s' % short(old)) |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
536 for new in group: |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
537 ui.write(' %s' % short(new)) |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
538 ui.write('\n') |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
539 finally: |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
540 lock.release() |
224 | 541 |
79
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
542 ### Altering existing command |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
543 ############################# |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
544 |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
545 def wrapmayobsoletewc(origfn, ui, repo, *args, **opts): |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
546 res = origfn(ui, repo, *args, **opts) |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
547 if repo['.'].obsolete(): |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
548 ui.warn(_('Working directory parent is obsolete\n')) |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
549 return res |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
550 |
224 | 551 def noextinctsvisibleheads(orig, repo): |
552 repo._turn_extinct_secret() | |
553 return orig(repo) | |
554 | |
79
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
555 def uisetup(ui): |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
556 extensions.wrapcommand(commands.table, "update", wrapmayobsoletewc) |
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
557 extensions.wrapcommand(commands.table, "pull", wrapmayobsoletewc) |
214
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
558 extensions.wrapfunction(discovery, 'findcommonoutgoing', wrapfindcommonoutgoing) |
217
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
559 extensions.wrapfunction(discovery, 'checkheads', wrapcheckheads) |
224 | 560 extensions.wrapfunction(phases, 'visibleheads', noextinctsvisibleheads) |
218
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
561 if util.safehasattr(phases, 'visiblebranchmap'): |
ace5608350b6
obsolete: do no complain when push create a new head but obsolete an old one.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
217
diff
changeset
|
562 extensions.wrapfunction(phases, 'visiblebranchmap', wrapvisiblebranchmap) |
79
9906560f585e
[obsolete] issue a warning when parent of current directory is obsolete.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
75
diff
changeset
|
563 |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
564 ### serialisation |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
565 ############################# |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
566 |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
567 def _obsserialise(obssubrels, flike): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
568 """serialise an obsolete relation mapping in a plain text one |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
569 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
570 this is for subject -> [objects] mapping |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
571 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
572 format is:: |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
573 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
574 <subject-full-hex> <object-full-hex>\n""" |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
575 for sub, objs in obssubrels.iteritems(): |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
576 for obj in objs: |
80
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
577 if sub is None: |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
578 sub = nullid |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
579 flike.write('%s %s\n' % (hex(sub), hex(obj))) |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
580 |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
581 def _obsdeserialise(flike): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
582 """read a file like object serialised with _obsserialise |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
583 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
584 this desierialize into a {subject -> objects} mapping""" |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
585 rels = {} |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
586 for line in flike: |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
587 subhex, objhex = line.split() |
80
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
588 subnode = bin(subhex) |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
589 if subnode == nullid: |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
590 subnode = None |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
591 rels.setdefault( subnode, set()).add(bin(objhex)) |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
592 return rels |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
593 |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
594 ### diagnostique tools |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
595 ############################# |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
596 |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
597 def unstables(repo): |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
598 """Return all unstable changeset""" |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
599 return scmutil.revrange(repo, ['obsolete():: and (not obsolete())']) |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
600 |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
601 def newerversion(repo, obs): |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
602 """Return the newer version of an obsolete changeset""" |
224 | 603 toproceed = set([(obs,)]) |
604 # XXX known optimization available | |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
605 newer = set() |
224 | 606 objectrels = repo.obsoletestore.objects |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
607 while toproceed: |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
608 current = toproceed.pop() |
224 | 609 assert len(current) <= 1, 'splitting not handled yet. %r' % current |
610 if current: | |
611 n, = current | |
612 if n in objectrels: | |
613 markers = objectrels[n] | |
614 for mark in markers: | |
615 toproceed.add(tuple(mark['subjects'])) | |
616 else: | |
617 newer.add(tuple(current)) | |
132
64d16f07d67f
obsolete: alter newerversion return
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
131
diff
changeset
|
618 else: |
64d16f07d67f
obsolete: alter newerversion return
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
131
diff
changeset
|
619 newer.add(()) |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
620 return sorted(newer) |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
621 |
224 | 622 ### obsolete relation storage |
623 ############################# | |
624 def add2set(d, key, mark): | |
625 """add <mark> to a `set` in <d>[<key>]""" | |
626 d.setdefault(key, []).append(mark) | |
627 | |
628 def markerid(marker): | |
629 KEYS = ['subjects', "object", "date", "user", "reason"] | |
630 for key in KEYS: | |
631 assert key in marker | |
632 keys = sorted(marker.keys()) | |
633 a = util.sha1() | |
634 for key in keys: | |
635 if key == 'subjects': | |
636 for sub in sorted(marker[key]): | |
637 a.update(sub) | |
638 elif key == 'id': | |
639 pass | |
640 else: | |
641 a.update(str(marker[key])) | |
642 a.update('\0') | |
643 return a.digest() | |
644 | |
645 class obsoletestore(object): | |
646 """Store obsolete relations | |
647 | |
648 Relation are stored in three mapping. All mapping have "obsolete markers" | |
649 as values:: | |
650 | |
651 {'id': "unique id of the obsolete marker" | |
652 'subjects': "0-N newer version of changeset in "object" (as ordered list) | |
653 'object': "old and obsolete version" | |
654 'date': "When was this marker created ?" | |
655 'user': "Who did that ?" | |
656 'reason': "Why was it done" | |
657 } | |
658 | |
659 Three keys exists | |
660 | |
661 :self._markers: "id" -> marker | |
662 | |
663 :self.subjects: "subject" -> set(marker) | |
664 | |
665 :self.objects: "object" -> set(marker) | |
666 """ | |
667 | |
668 def __init__(self): | |
669 self._markers = {} | |
670 self.subjects = {} | |
671 self.objects = {} | |
672 self._dirty = False # should be on repo | |
673 | |
674 def new(self, marker): | |
675 """Add a *new* marker to the store. computing it's ID""" | |
676 mid = marker['id'] = markerid(marker) | |
677 self._insert(marker) | |
678 self._dirty = True | |
679 return mid | |
680 | |
681 def _insert(self, marker): | |
682 if marker['id'] not in self._markers: | |
683 self._markers[marker['id']] = marker | |
684 add2set(self.objects, marker['object'], marker) | |
685 for subj in marker['subjects']: | |
686 add2set(self.subjects, subj, marker) | |
687 | |
688 def save(self, stream): | |
689 markers = [] | |
690 for mark in self._markers.itervalues(): | |
691 jmark = mark.copy() | |
692 jmark['id'] = hex(jmark['id']) | |
693 jmark['subjects'] = [hex(n) for n in jmark['subjects']] | |
694 jmark['object'] = hex(jmark['object']) | |
695 markers.append(jmark) | |
226
0892b91947ef
obsolete: export pretty printed json
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
224
diff
changeset
|
696 json.dump(markers, stream, indent=4) |
224 | 697 |
698 def load(self, stream): | |
699 for mark in json.load(stream): | |
700 mark['id'] = bin(mark['id']) | |
701 mark['subjects'] = [bin(n) for n in mark['subjects']] | |
702 mark['object'] = bin(mark['object']) | |
703 self._insert(mark) | |
704 | |
705 def writeobsolete(repo): | |
706 """wire obsolete data on disk""" | |
707 f = repo.sopener('obsoletemarkers', 'w', atomictemp=True) | |
708 try: | |
709 repo.obsoletestore.save(f) | |
710 repo._dirty = False | |
711 finally: | |
712 f.close() | |
713 | |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
714 |
86
7f763bada042
[obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
85
diff
changeset
|
715 ### repo subclassing |
7f763bada042
[obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
85
diff
changeset
|
716 ############################# |
7f763bada042
[obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
85
diff
changeset
|
717 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
718 def reposetup(ui, repo): |
47
b73b3e3c9560
Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
46
diff
changeset
|
719 if not repo.local(): |
b73b3e3c9560
Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
46
diff
changeset
|
720 return |
b73b3e3c9560
Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
46
diff
changeset
|
721 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
722 opull = repo.pull |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
723 opush = repo.push |
224 | 724 olock = repo.lock |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
725 o_rollback = repo._rollback |
210
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
726 o_updatebranchcache = repo.updatebranchcache |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
727 |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
728 # /!\ api change in Hg 2.2 (97efd26eb9576f39590812ea9) /!\ |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
729 if util.safehasattr(repo, '_journalfiles'): # Hg 2.2 |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
730 o_journalfiles = repo._journalfiles |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
731 o_writejournal = repo._writejournal |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
732 |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
733 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
734 class obsoletingrepo(repo.__class__): |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
735 |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
736 ### Public method |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
737 def obsoletedby(self, node): |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
738 """return the set of node that make <node> obsolete (obj)""" |
224 | 739 others = set() |
740 for marker in self.obsoletestore.objects.get(node, []): | |
741 others.update(marker['subjects']) | |
742 return others | |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
743 |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
744 def obsolete(self, node): |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
745 """return the set of node that <node> make obsolete (sub)""" |
224 | 746 return set(marker['object'] for marker in self.obsoletestore.subjects.get(node, [])) |
747 | |
748 @util.propertycache | |
749 def obsoletestore(self): | |
750 if not getattr(self, '_importoldobsolete', False): | |
751 try: | |
752 f = self.opener('obsolete-relations') | |
753 f.close() | |
754 raise util.Abort('old format of obsolete marker detected!\n' | |
755 'run `hg debugconvertobsolete` once.') | |
756 except IOError: | |
757 pass | |
758 store = obsoletestore() | |
759 try: | |
760 f = self.sopener('obsoletemarkers') | |
761 store.load(f) | |
762 except IOError: | |
763 pass | |
764 return store | |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
765 |
109
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
766 @util.propertycache |
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
767 def _obsoleteset(self): |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
768 """the set of obsolete revision""" |
109
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
769 obs = set() |
126
c083fb43daee
obsolete: stop using rev as it rebuild the cache every time there is a fault
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
125
diff
changeset
|
770 nm = self.changelog.nodemap |
224 | 771 for obj in self.obsoletestore.objects: |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
772 try: # /!\api change in Hg 2.2 (e8d37b78acfb22ae2c1fb126c2)/!\ |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
773 rev = nm.get(obj) |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
774 except TypeError: #XXX to remove while breaking Hg 2.1 support |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
775 rev = nm.get(obj, None) |
126
c083fb43daee
obsolete: stop using rev as it rebuild the cache every time there is a fault
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
125
diff
changeset
|
776 if rev is not None: |
c083fb43daee
obsolete: stop using rev as it rebuild the cache every time there is a fault
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
125
diff
changeset
|
777 obs.add(rev) |
109
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
778 return obs |
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
779 |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
780 @util.propertycache |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
781 def _unstableset(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
782 """the set of non obsolete revision with obsolete parent""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
783 return set(self.revs('(obsolete()::) - obsolete()')) |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
784 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
785 @util.propertycache |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
786 def _suspendedset(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
787 """the set of obsolete parent with non obsolete descendant""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
788 return set(self.revs('obsolete() and obsolete()::unstable()')) |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
789 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
790 @util.propertycache |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
791 def _extinctset(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
792 """the set of obsolete parent without non obsolete descendant""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
793 return set(self.revs('obsolete() - obsolete()::unstable()')) |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
794 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
795 def _clearobsoletecache(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
796 if '_obsoleteset' in vars(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
797 del self._obsoleteset |
210
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
798 self._clearunstablecache() |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
799 |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
800 def updatebranchcache(self): |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
801 o_updatebranchcache() |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
802 self._clearunstablecache() |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
803 |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
804 def _clearunstablecache(self): |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
805 if '_unstableset' in vars(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
806 del self._unstableset |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
807 if '_suspendedset' in vars(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
808 del self._suspendedset |
254
3ff969da57ef
obsolete: fix error in cache invalidation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
253
diff
changeset
|
809 if '_extinctset' in vars(self): |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
810 del self._extinctset |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
811 |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
812 def addobsolete(self, sub, obj): |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
813 """Add a relation marking that node <sub> is a new version of <obj>""" |
224 | 814 assert sub != obj |
815 if not repo[obj].phase(): | |
816 if sub is None: | |
817 self.ui.warn( | |
818 _("trying to kill immutable changeset %(obj)s\n") | |
819 % {'obj': short(obj)}) | |
820 if sub is not None: | |
821 self.ui.warn( | |
822 _("%(sub)s try to obsolete immutable changeset %(obj)s\n") | |
823 % {'sub': short(sub), 'obj': short(obj)}) | |
824 lock = self.lock() | |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
825 try: |
224 | 826 newmarker = { |
827 'subjects': (sub==nullid) and [] or [sub], | |
828 'object': obj, | |
829 'date': util.makedate(), | |
830 'user': ui.username(), | |
831 'reason': 'unknown', | |
832 } | |
833 mid = self.obsoletestore.new(newmarker) | |
834 self._clearobsoletecache() | |
835 self._turn_extinct_secret() | |
836 return mid | |
837 finally: | |
838 lock.release() | |
839 | |
298
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
840 def addcollapsedobsolete(self, oldnodes, newnode): |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
841 """Mark oldnodes as collapsed into newnode.""" |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
842 # Assume oldnodes are all descendants of a single rev |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
843 rootrevs = self.revs('roots(%ln)', oldnodes) |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
844 assert len(rootrevs) == 1, rootrevs |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
845 rootnode = self[rootrevs[0]].node() |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
846 for n in oldnodes: |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
847 if n != rootnode: |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
848 self.addobsolete(n, rootnode) |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
849 self.addobsolete(newnode, n) |
f597421662f7
obsolete: unify collapsed revisions markers handling
Patrick Mezard <patrick@mezard.eu>
parents:
297
diff
changeset
|
850 |
224 | 851 def _turn_extinct_secret(self): |
852 """ensure all extinct changeset are secret""" | |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
853 self._clearobsoletecache() |
224 | 854 # this is mainly for safety purpose |
855 # both pull and push | |
856 expobs = [c.node() for c in repo.set('extinct() - secret()')] | |
857 phases.retractboundary(repo, 2, expobs) | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
858 |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
859 ### Disk IO |
224 | 860 |
861 def lock(self, *args, **kwargs): | |
862 l = olock(*args, **kwargs) | |
863 if not getattr(l.releasefn, 'obspatched', False): | |
864 oreleasefn = l.releasefn | |
865 def releasefn(*args, **kwargs): | |
866 if self.obsoletestore._dirty: | |
867 writeobsolete(self) | |
868 oreleasefn(*args, **kwargs) | |
869 releasefn.obspatched = True | |
870 l.releasefn = releasefn | |
871 return l | |
872 | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
873 def _readobsrels(self): |
224 | 874 """Read obsolete relation on disk""" |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
875 # XXX handle lock |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
876 try: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
877 f = self.opener('obsolete-relations') |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
878 try: |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
879 return _obsdeserialise(f) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
880 finally: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
881 f.close() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
882 except IOError: |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
883 return {} |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
884 |
50
19b22ad56b32
clone support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
47
diff
changeset
|
885 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
886 ### pull // push support |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
887 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
888 def pull(self, remote, *args, **kwargs): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
889 """wrapper around push that push obsolete relation""" |
224 | 890 l = repo.lock() |
891 try: | |
892 result = opull(remote, *args, **kwargs) | |
893 if 'obsolete' in remote.listkeys('namespaces'): | |
894 tmp = StringIO() | |
895 rels = remote.listkeys('obsolete')['markers'] | |
896 tmp.write(base64.b64decode(rels)) | |
897 tmp.seek(0) | |
898 repo.obsoletestore.load(tmp) | |
899 repo.obsoletestore._dirty = True # XXX meh | |
900 self._clearobsoletecache() | |
901 self._turn_extinct_secret() | |
902 return result | |
903 finally: | |
904 l.release() | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
905 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
906 def push(self, remote, *args, **opts): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
907 """wrapper around pull that pull obsolete relation""" |
224 | 908 self._turn_extinct_secret() |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
909 result = opush(remote, *args, **opts) |
56
27f9c0d0a996
[obsolete] Update pushkey code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
54
diff
changeset
|
910 if 'obsolete' in remote.listkeys('namespaces'): |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
911 tmp = StringIO() |
224 | 912 self.obsoletestore.save(tmp) |
913 remote.pushkey('obsolete', 'markers', '', tmp.getvalue()) | |
914 self._turn_extinct_secret() | |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
915 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
916 return result |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
917 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
918 |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
919 ### rollback support |
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
920 |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
921 # /!\ api change in Hg 2.2 (97efd26eb9576f39590812ea9) /!\ |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
922 if util.safehasattr(repo, '_journalfiles'): # Hg 2.2 |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
923 def _journalfiles(self): |
224 | 924 return o_journalfiles() + (self.sjoin('journal.obsoletemarkers'),) |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
925 |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
926 def _writejournal(self, desc): |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
927 """wrapped version of _writejournal that save obsolete data""" |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
928 o_writejournal(desc) |
224 | 929 filename = 'obsoletemarkers' |
930 filepath = self.sjoin(filename) | |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
931 if os.path.exists(filepath): |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
932 journalname = 'journal.' + filename |
224 | 933 journalpath = self.sjoin(journalname) |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
934 util.copyfile(filepath, journalpath) |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
935 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
936 else: # XXX removing this bloc will break Hg 2.1 support |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
937 def _writejournal(self, desc): |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
938 """wrapped version of _writejournal that save obsolete data""" |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
939 entries = list(o_writejournal(desc)) |
224 | 940 filename = 'obsoletemarkers' |
941 filepath = self.sjoin(filename) | |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
942 if os.path.exists(filepath): |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
943 journalname = 'journal.' + filename |
224 | 944 journalpath = self.sjoin(journalname) |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
945 util.copyfile(filepath, journalpath) |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
946 entries.append(journalpath) |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
947 return tuple(entries) |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
948 |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
949 def _rollback(self, dryrun, force): |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
950 """wrapped version of _rollback that restore obsolete data""" |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
951 ret = o_rollback(dryrun, force) |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
952 if not (ret or dryrun): #rollback did not failed |
224 | 953 src = self.sjoin('undo.obsoletemarkers') |
954 dst = self.sjoin('obsoletemarkers') | |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
955 if os.path.exists(src): |
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
956 util.rename(src, dst) |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
957 elif os.path.exists(dst): |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
958 # If no state was saved because the file did not existed before. |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
959 os.unlink(dst) |
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
960 # invalidate cache |
224 | 961 self.__dict__.pop('obsoletestore', None) |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
962 return ret |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
963 |
160
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
964 @storecache('00changelog.i') |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
965 def changelog(self): |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
966 # << copy pasted from mercurial source |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
967 c = changelog.changelog(self.sopener) |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
968 if 'HG_PENDING' in os.environ: |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
969 p = os.environ['HG_PENDING'] |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
970 if p.startswith(self.root): |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
971 c.readpending('00changelog.i.a') |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
972 # >> end of the copy paste |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
973 old = c.__dict__.pop('hiddenrevs', ()) |
122
c75a73209f1e
Locking while writing obsolete data.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
121
diff
changeset
|
974 if old: |
c75a73209f1e
Locking while writing obsolete data.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
121
diff
changeset
|
975 ui.warn("old wasn't empty ? %r" % old) |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
976 def _sethidden(c, value): |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
977 assert not value |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
978 |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
979 |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
980 class hchangelog(c.__class__): |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
981 @util.propertycache |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
982 def hiddenrevs(c): |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
983 shown = ['not obsolete()', '.', 'bookmark()', 'tagged()', |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
984 'public()'] |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
985 basicquery = 'obsolete() - (::(%s))' % (' or '.join(shown)) |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
986 # !!! self is repo not changelog |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
987 result = set(scmutil.revrange(self, [basicquery])) |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
988 return result |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
989 c.__class__ = hchangelog |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
990 return c |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
991 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
992 repo.__class__ = obsoletingrepo |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
993 |
224 | 994 if False: |
995 expobs = [c.node() for c in repo.set('extinct() - secret()')] | |
996 if expobs: # do not lock in nothing move. locking for peanut make hgview reload on any command | |
997 lock = repo.lock() | |
998 try: | |
999 expobs = [c.node() for c in repo.set('extinct() - secret()')] | |
1000 phases.retractboundary(repo, 2, expobs) | |
1001 finally: | |
1002 lock.release() |