Mercurial > evolve
annotate hgext/obsolete.py @ 285:691cb55358b0
obsolete: do not obsolete rebase --detach nullmerge revs
Rebase state contains the changesets to rebase as well as 'nullmerge'
entries used drive the merge strategy. These nullmerge were not rebased
and should be ignored, and certainly not be marked obsolete.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Wed, 20 Jun 2012 14:43:20 +0200 |
parents | 05ab164c6593 |
children | 590ac023c536 |
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 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
104 |
160
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
105 try: |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
106 from mercurial.localrepo import storecache |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
107 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
|
108 except (TypeError, ImportError): |
160
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
109 def storecache(*args): |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
110 return scmutil.filecache(*args, instore=True) |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
111 |
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
112 |
72
774932a6cc0d
[obsolete] rationalize doc header.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
71
diff
changeset
|
113 ### Patch changectx |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
114 ############################# |
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 def obsolete(ctx): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
117 """is the changeset obsolete by other""" |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
118 if ctx.node()is None: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
119 return False |
112
eae9be0ee00e
adapt obsolete to phase.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
109
diff
changeset
|
120 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
|
121 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 context.changectx.obsolete = obsolete |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
123 |
148
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
124 def unstable(ctx): |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
125 """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
|
126 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
|
127 return False |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
128 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
|
129 |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
130 context.changectx.unstable = unstable |
8e93e1f67205
obsolete: define an unstable property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
144
diff
changeset
|
131 |
213
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
132 def extinct(ctx): |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
133 """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
|
134 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
|
135 return False |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
136 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
|
137 |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
138 context.changectx.extinct = extinct |
ea4aa1890b16
obsolete: add an extinct property on context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
212
diff
changeset
|
139 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
140 |
72
774932a6cc0d
[obsolete] rationalize doc header.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
71
diff
changeset
|
141 ### revset |
39 | 142 ############################# |
143 | |
112
eae9be0ee00e
adapt obsolete to phase.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
109
diff
changeset
|
144 |
39 | 145 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
|
146 """obsolete changesets""" |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
147 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
|
148 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
|
149 |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
150 # 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
|
151 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
|
152 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
|
153 """obsolete changesets""" |
470232cea503
[obsolete] fix new api: use the new phase cache api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
228
diff
changeset
|
154 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
|
155 return [r for r in subset if r in repo._obsoleteset and repo._phaserev[r] > 0] |
39 | 156 |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
157 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
|
158 """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
|
159 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
|
160 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
|
161 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
162 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
|
163 """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
|
164 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
|
165 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
|
166 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
167 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
|
168 """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
|
169 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
|
170 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
|
171 |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
172 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
173 def _obsparents(repo, s): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
174 """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
|
175 cs = set() |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
176 nm = repo.changelog.nodemap |
224 | 177 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
|
178 for r in s: |
224 | 179 for p in markerbysubj.get(repo[r].node(), ()): |
180 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
|
181 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
|
182 cs.add(pr) |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
183 return cs |
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
184 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
185 def revsetobsparents(repo, subset, x): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
186 """obsolete parents""" |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
187 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
|
188 cs = _obsparents(repo, s) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
189 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
|
190 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
191 def _obsancestors(repo, s): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
192 """obsolete ancestors of a subset""" |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
193 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
|
194 seen = set() |
224 | 195 allsubjects = repo.obsoletestore.subjects |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
196 while toproceed: |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
197 nc = toproceed.pop() |
224 | 198 for mark in allsubjects.get(nc, ()): |
199 np = mark['object'] | |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
200 if np not in seen: |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
201 seen.add(np) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
202 toproceed.append(np) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
203 nm = repo.changelog.nodemap |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
204 cs = set() |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
205 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
|
206 pr = nm.get(p) |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
207 if pr is not None: |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
208 cs.add(pr) |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
209 return cs |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
210 |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
211 def revsetobsancestors(repo, subset, x): |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
212 """obsolete parents""" |
143
0599fb01dc41
add an obsolete parent revset and related alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
135
diff
changeset
|
213 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
|
214 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
|
215 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
|
216 |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
217 |
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
218 |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
219 ### Other Extension compat |
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
220 ############################ |
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
221 |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
222 |
253
8ee6c5b98d73
[obsolete] fix new api: be more flexible on rebase's buildstate signature
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
252
diff
changeset
|
223 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
|
224 """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
|
225 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
|
226 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
|
227 |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
228 def defineparents(orig, repo, rev, target, state, *args, **kwargs): |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
229 rebasestate = getattr(repo, '_rebasestate', None) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
230 if rebasestate is not None: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
231 repo._rebasestate = dict(state) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
232 repo._rebasetarget = target |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
233 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
|
234 |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
235 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
|
236 """wrapper for rebase 's concludenode that set obsolete relation""" |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
237 newrev = orig(repo, rev, p1, *args, **kwargs) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
238 rebasestate = getattr(repo, '_rebasestate', None) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
239 if rebasestate is not None: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
240 if newrev is not None: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
241 nrev = repo[newrev].rev() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
242 else: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
243 nrev = p1 |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
244 repo._rebasestate[rev] = nrev |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
245 return newrev |
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
246 |
274
6622a24f3b0f
obsolete: fix rebase wrapping
Patrick Mezard <patrick@mezard.eu>
parents:
273
diff
changeset
|
247 def cmdrebase(orig, ui, repo, *args, **kwargs): |
275
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
248 if kwargs.get('keep', False): |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
249 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
|
250 'extension'), hint=_("see 'hg help obsolete'")) |
336210dada95
obsolete: make rebase abort with --keep
Patrick Mezard <patrick@mezard.eu>
parents:
274
diff
changeset
|
251 kwargs = dict(kwargs) |
84
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
252 kwargs['keep'] = True |
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
253 |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
254 # 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
|
255 # replacements if any. Doing it in concludenode() prevents |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
256 # aborting the rebase, and is not called with all relevant |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
257 # revisions in --collapse case. Instead, we try to track the |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
258 # rebase state structure by sampling/updating it in |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
259 # defineparents() and concludenode(). The obsolete markers are |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
260 # added from this state after a successful call. |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
261 repo._rebasestate = {} |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
262 repo._rebasetarget = None |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
263 maxrev = len(repo) - 1 |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
264 try: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
265 res = orig(ui, repo, *args, **kwargs) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
266 if not res and not kwargs.get('abort') and repo._rebasetarget: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
267 # We have to tell rewritten revisions from removed |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
268 # ones. When collapsing, removed revisions are considered |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
269 # to be collapsed onto the final one, while in the normal |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
270 # case their are marked obsolete without successor. |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
271 emptynode = nullid |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
272 if kwargs.get('collapse'): |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
273 emptynode = repo[max(repo._rebasestate.values())].node() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
274 # Rebased revisions are assumed to be descendants of |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
275 # targetrev. If a source revision is mapped to targetrev |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
276 # or to another rebased revision, it must have been |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
277 # removed. |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
278 targetrev = repo[repo._rebasetarget].rev() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
279 newrevs = set([targetrev]) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
280 for rev, newrev in sorted(repo._rebasestate.items()): |
285
691cb55358b0
obsolete: do not obsolete rebase --detach nullmerge revs
Patrick Mezard <patrick@mezard.eu>
parents:
282
diff
changeset
|
281 if newrev == -2: # nullmerge |
691cb55358b0
obsolete: do not obsolete rebase --detach nullmerge revs
Patrick Mezard <patrick@mezard.eu>
parents:
282
diff
changeset
|
282 continue |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
283 oldnode = repo[rev].node() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
284 if newrev not in newrevs and newrev >= 0: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
285 newnode = repo[newrev].node() |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
286 newrevs.add(newrev) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
287 else: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
288 newnode = emptynode |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
289 repo.addobsolete(newnode, oldnode) |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
290 return res |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
291 finally: |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
292 delattr(repo, '_rebasestate') |
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
293 delattr(repo, '_rebasetarget') |
84
c4cc5f3bcf12
[obsolete] rebase always keep changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
83
diff
changeset
|
294 |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
295 |
39 | 296 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
|
297 |
39 | 298 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
|
299 revset.symbols["unstable"] = revsetunstable |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
300 revset.symbols["suspended"] = revsetsuspended |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
301 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
|
302 revset.symbols["obsparents"] = revsetobsparents |
144
f387658d6d22
Add a bosancestors revset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
143
diff
changeset
|
303 revset.symbols["obsancestors"] = revsetobsancestors |
46
3b0364fc822f
Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
44
diff
changeset
|
304 |
3b0364fc822f
Do not propagate obsolete changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
44
diff
changeset
|
305 |
42
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
306 try: |
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
307 rebase = extensions.find('rebase') |
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
308 if rebase: |
150
f12fd2410a60
obsolete: improve rebase compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
148
diff
changeset
|
309 extensions.wrapfunction(rebase, 'buildstate', buildstate) |
282
05ab164c6593
obsolete: handle rebase --collapse
Patrick Mezard <patrick@mezard.eu>
parents:
279
diff
changeset
|
310 extensions.wrapfunction(rebase, 'defineparents', defineparents) |
42
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
311 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
|
312 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
|
313 except KeyError: |
eb6a06d7eae3
Make rebase set-obsolete relation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
41
diff
changeset
|
314 pass # rebase not found |
39 | 315 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
316 # Pushkey mechanism for mutable |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
317 ######################################### |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
318 |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
319 def pushobsolete(repo, key, old, raw): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
320 """push obsolete relation through pushkey""" |
224 | 321 assert key == "markers" |
322 l = repo.lock() | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
323 try: |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
324 tmp = StringIO() |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
325 tmp.write(raw) |
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
326 tmp.seek(0) |
224 | 327 repo.obsoletestore.load(tmp) |
328 repo.obsoletestore._dirty = True # XXX meh | |
329 return 1 | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
330 finally: |
224 | 331 l.release() |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
332 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
333 def listobsolete(repo): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
334 """dump all obsolete relation in |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
335 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
336 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
|
337 tmp = StringIO() |
224 | 338 repo.obsoletestore.save(tmp) |
339 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
|
340 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
341 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
|
342 |
214
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
343 ### Discovery wrapping |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
344 ############################# |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
345 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
346 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
|
347 """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
|
348 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
349 def __nonzero__(self): |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
350 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
|
351 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
352 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
|
353 """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
|
354 |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
355 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
|
356 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
|
357 """ |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
358 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
|
359 orig = outgoing.excluded |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
360 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
|
361 # 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
|
362 # 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
|
363 # 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
|
364 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
|
365 return outgoing |
a140d1857931
obsolete: do not warn about unpushed extinct changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
213
diff
changeset
|
366 |
217
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
367 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
|
368 """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
|
369 |
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
|
370 * 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
|
371 * 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
|
372 """ |
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
|
373 # 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
|
374 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
|
375 # 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
|
376 # 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
|
377 ctx = repo[h] |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
378 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
|
379 if ctx.unstable(): |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
380 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
|
381 hint=hint) |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
382 if ctx.obsolete(): |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
383 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
|
384 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
|
385 ### 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
|
386 # 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
|
387 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
|
388 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
|
389 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
|
390 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
|
391 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
|
392 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
|
393 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
|
394 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
|
395 ): |
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 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
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 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
|
404 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
|
405 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
|
406 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
|
407 n = nodes.pop() |
224 | 408 if n in repo.obsoletestore.objects: |
409 markers = repo.obsoletestore.objects[n] | |
410 for mark in markers: | |
411 for newernode in mark['subjects']: | |
412 if newernode is not None: | |
413 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
|
414 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
|
415 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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 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
|
425 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
|
426 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
|
427 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
|
428 |
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 # 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
|
430 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
|
431 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
|
432 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 |
786eb34d93ea
obsolete: refuse to push unstable changeset without -f
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
215
diff
changeset
|
439 |
71
19e1930587a0
[obsolete] Move extension compat code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
70
diff
changeset
|
440 ### New commands |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
441 ############################# |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
442 |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
443 cmdtable = {} |
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
444 command = cmdutil.command(cmdtable) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
445 |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
446 @command('debugobsolete', [], _('SUBJECT OBJECT')) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
447 def cmddebugobsolete(ui, repo, subject, object): |
278
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
448 """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
|
449 |
278
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
450 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
|
451 """ |
224 | 452 lock = repo.lock() |
453 try: | |
454 sub = repo[subject] | |
455 obj = repo[object] | |
456 repo.addobsolete(sub.node(), obj.node()) | |
457 finally: | |
458 lock.release() | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
459 return 0 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
460 |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
461 @command('debugconvertobsolete', [], '') |
224 | 462 def cmddebugconvertobsolete(ui, repo): |
278
fa0b9b8a83c0
obsolete: add or fix debug commands help
Patrick Mezard <patrick@mezard.eu>
parents:
277
diff
changeset
|
463 """import markers from an .hg/obsolete-relations file""" |
224 | 464 cnt = 0 |
465 l = repo.lock() | |
466 try: | |
467 repo._importoldobsolete = True | |
468 store = repo.obsoletestore | |
469 try: | |
470 f = repo.opener('obsolete-relations') | |
471 try: | |
472 for line in f: | |
473 subhex, objhex = line.split() | |
474 sub = bin(subhex) | |
475 obj = bin(objhex) | |
476 newmarker = { | |
477 'subjects': (sub==nullid) and [] or [sub], | |
478 'object': obj, | |
479 'date': util.makedate(), | |
480 'user': ui.username(), | |
481 'reason': 'import from older format.', | |
482 } | |
483 store.new(newmarker) | |
484 store._dirty = True | |
485 cnt += 1 | |
486 finally: | |
487 f.close() | |
488 util.unlink(repo.join('obsolete-relations')) | |
489 except IOError: | |
490 ui.warn('nothing to do\n') | |
491 pass | |
492 finally: | |
493 del repo._importoldobsolete | |
494 l.release() | |
495 ui.status('%i obsolete marker converted\n' % cnt) | |
496 | |
276
f26e9bc5f7fc
obsolete: use new-style command registration
Patrick Mezard <patrick@mezard.eu>
parents:
275
diff
changeset
|
497 @command('debugsuccessors', [], '') |
273
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
498 def cmddebugsuccessors(ui, repo): |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
499 """dump obsolete changesets and their successors |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
500 |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
501 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
|
502 obsolete changeset identifier, followed by it successors. |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
503 """ |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
504 lock = repo.lock() |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
505 try: |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
506 allsuccessors = repo.obsoletestore.objects |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
507 for old in sorted(allsuccessors): |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
508 successors = [sorted(m['subjects']) for m in allsuccessors[old]] |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
509 for i, group in enumerate(sorted(successors)): |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
510 ui.write('%s' % short(old)) |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
511 for new in group: |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
512 ui.write(' %s' % short(new)) |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
513 ui.write('\n') |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
514 finally: |
87e4d1eec5e8
obsolete: add debugsuccessors command
Patrick Mezard <patrick@mezard.eu>
parents:
254
diff
changeset
|
515 lock.release() |
224 | 516 |
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
|
517 ### 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
|
518 ############################# |
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
|
519 |
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
|
520 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
|
521 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
|
522 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
|
523 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
|
524 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
|
525 |
224 | 526 def noextinctsvisibleheads(orig, repo): |
527 repo._turn_extinct_secret() | |
528 return orig(repo) | |
529 | |
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
|
530 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
|
531 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
|
532 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
|
533 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
|
534 extensions.wrapfunction(discovery, 'checkheads', wrapcheckheads) |
224 | 535 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
|
536 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
|
537 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
|
538 |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
539 ### serialisation |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
540 ############################# |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
541 |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
542 def _obsserialise(obssubrels, flike): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
543 """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
|
544 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
545 this is for subject -> [objects] mapping |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
546 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
547 format is:: |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
548 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
549 <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
|
550 for sub, objs in obssubrels.iteritems(): |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
551 for obj in objs: |
80
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
552 if sub is None: |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
553 sub = nullid |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
554 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
|
555 |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
556 def _obsdeserialise(flike): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
557 """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
|
558 |
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
559 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
|
560 rels = {} |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
561 for line in flike: |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
562 subhex, objhex = line.split() |
80
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
563 subnode = bin(subhex) |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
564 if subnode == nullid: |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
565 subnode = None |
5d029a358252
[obsolete] add kill support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
79
diff
changeset
|
566 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
|
567 return rels |
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
568 |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
569 ### diagnostique tools |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
570 ############################# |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
571 |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
572 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
|
573 """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
|
574 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
|
575 |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
576 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
|
577 """Return the newer version of an obsolete changeset""" |
224 | 578 toproceed = set([(obs,)]) |
579 # 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
|
580 newer = set() |
224 | 581 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
|
582 while toproceed: |
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
583 current = toproceed.pop() |
224 | 584 assert len(current) <= 1, 'splitting not handled yet. %r' % current |
585 if current: | |
586 n, = current | |
587 if n in objectrels: | |
588 markers = objectrels[n] | |
589 for mark in markers: | |
590 toproceed.add(tuple(mark['subjects'])) | |
591 else: | |
592 newer.add(tuple(current)) | |
132
64d16f07d67f
obsolete: alter newerversion return
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
131
diff
changeset
|
593 else: |
64d16f07d67f
obsolete: alter newerversion return
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
131
diff
changeset
|
594 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
|
595 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
|
596 |
224 | 597 ### obsolete relation storage |
598 ############################# | |
599 def add2set(d, key, mark): | |
600 """add <mark> to a `set` in <d>[<key>]""" | |
601 d.setdefault(key, []).append(mark) | |
602 | |
603 def markerid(marker): | |
604 KEYS = ['subjects', "object", "date", "user", "reason"] | |
605 for key in KEYS: | |
606 assert key in marker | |
607 keys = sorted(marker.keys()) | |
608 a = util.sha1() | |
609 for key in keys: | |
610 if key == 'subjects': | |
611 for sub in sorted(marker[key]): | |
612 a.update(sub) | |
613 elif key == 'id': | |
614 pass | |
615 else: | |
616 a.update(str(marker[key])) | |
617 a.update('\0') | |
618 return a.digest() | |
619 | |
620 class obsoletestore(object): | |
621 """Store obsolete relations | |
622 | |
623 Relation are stored in three mapping. All mapping have "obsolete markers" | |
624 as values:: | |
625 | |
626 {'id': "unique id of the obsolete marker" | |
627 'subjects': "0-N newer version of changeset in "object" (as ordered list) | |
628 'object': "old and obsolete version" | |
629 'date': "When was this marker created ?" | |
630 'user': "Who did that ?" | |
631 'reason': "Why was it done" | |
632 } | |
633 | |
634 Three keys exists | |
635 | |
636 :self._markers: "id" -> marker | |
637 | |
638 :self.subjects: "subject" -> set(marker) | |
639 | |
640 :self.objects: "object" -> set(marker) | |
641 """ | |
642 | |
643 def __init__(self): | |
644 self._markers = {} | |
645 self.subjects = {} | |
646 self.objects = {} | |
647 self._dirty = False # should be on repo | |
648 | |
649 def new(self, marker): | |
650 """Add a *new* marker to the store. computing it's ID""" | |
651 mid = marker['id'] = markerid(marker) | |
652 self._insert(marker) | |
653 self._dirty = True | |
654 return mid | |
655 | |
656 def _insert(self, marker): | |
657 if marker['id'] not in self._markers: | |
658 self._markers[marker['id']] = marker | |
659 add2set(self.objects, marker['object'], marker) | |
660 for subj in marker['subjects']: | |
661 add2set(self.subjects, subj, marker) | |
662 | |
663 def save(self, stream): | |
664 markers = [] | |
665 for mark in self._markers.itervalues(): | |
666 jmark = mark.copy() | |
667 jmark['id'] = hex(jmark['id']) | |
668 jmark['subjects'] = [hex(n) for n in jmark['subjects']] | |
669 jmark['object'] = hex(jmark['object']) | |
670 markers.append(jmark) | |
226
0892b91947ef
obsolete: export pretty printed json
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
224
diff
changeset
|
671 json.dump(markers, stream, indent=4) |
224 | 672 |
673 def load(self, stream): | |
674 for mark in json.load(stream): | |
675 mark['id'] = bin(mark['id']) | |
676 mark['subjects'] = [bin(n) for n in mark['subjects']] | |
677 mark['object'] = bin(mark['object']) | |
678 self._insert(mark) | |
679 | |
680 def writeobsolete(repo): | |
681 """wire obsolete data on disk""" | |
682 f = repo.sopener('obsoletemarkers', 'w', atomictemp=True) | |
683 try: | |
684 repo.obsoletestore.save(f) | |
685 repo._dirty = False | |
686 finally: | |
687 f.close() | |
688 | |
87
246b8fefd0a5
[evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
86
diff
changeset
|
689 |
86
7f763bada042
[obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
85
diff
changeset
|
690 ### repo subclassing |
7f763bada042
[obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
85
diff
changeset
|
691 ############################# |
7f763bada042
[obsolete] code section comment for repo subclassing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
85
diff
changeset
|
692 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
693 def reposetup(ui, repo): |
47
b73b3e3c9560
Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
46
diff
changeset
|
694 if not repo.local(): |
b73b3e3c9560
Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
46
diff
changeset
|
695 return |
b73b3e3c9560
Don't overwrite non local repo.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
46
diff
changeset
|
696 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
697 opull = repo.pull |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
698 opush = repo.push |
224 | 699 olock = repo.lock |
202
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
700 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
|
701 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
|
702 |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
703 # /!\ 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
|
704 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
|
705 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
|
706 o_writejournal = repo._writejournal |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
707 |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
708 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
709 class obsoletingrepo(repo.__class__): |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
710 |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
711 ### Public method |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
712 def obsoletedby(self, node): |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
713 """return the set of node that make <node> obsolete (obj)""" |
224 | 714 others = set() |
715 for marker in self.obsoletestore.objects.get(node, []): | |
716 others.update(marker['subjects']) | |
717 return others | |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
718 |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
719 def obsolete(self, node): |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
720 """return the set of node that <node> make obsolete (sub)""" |
224 | 721 return set(marker['object'] for marker in self.obsoletestore.subjects.get(node, [])) |
722 | |
723 @util.propertycache | |
724 def obsoletestore(self): | |
725 if not getattr(self, '_importoldobsolete', False): | |
726 try: | |
727 f = self.opener('obsolete-relations') | |
728 f.close() | |
729 raise util.Abort('old format of obsolete marker detected!\n' | |
730 'run `hg debugconvertobsolete` once.') | |
731 except IOError: | |
732 pass | |
733 store = obsoletestore() | |
734 try: | |
735 f = self.sopener('obsoletemarkers') | |
736 store.load(f) | |
737 except IOError: | |
738 pass | |
739 return store | |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
740 |
109
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
741 @util.propertycache |
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
742 def _obsoleteset(self): |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
743 """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
|
744 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
|
745 nm = self.changelog.nodemap |
224 | 746 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
|
747 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
|
748 rev = nm.get(obj) |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
749 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
|
750 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
|
751 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
|
752 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
|
753 return obs |
a2e8057117d3
obsolete: smarter initialisation of obsolete stuff from disk.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
95
diff
changeset
|
754 |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
755 @util.propertycache |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
756 def _unstableset(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
757 """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
|
758 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
|
759 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
760 @util.propertycache |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
761 def _suspendedset(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
762 """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
|
763 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
|
764 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
765 @util.propertycache |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
766 def _extinctset(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
767 """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
|
768 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
|
769 |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
770 def _clearobsoletecache(self): |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
771 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
|
772 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
|
773 self._clearunstablecache() |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
774 |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
775 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
|
776 o_updatebranchcache() |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
777 self._clearunstablecache() |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
778 |
168ea7d200a0
obsolete: blindly obsolete unstability cache when changeset are added
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
205
diff
changeset
|
779 def _clearunstablecache(self): |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
780 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
|
781 del self._unstableset |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
782 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
|
783 del self._suspendedset |
254
3ff969da57ef
obsolete: fix error in cache invalidation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
253
diff
changeset
|
784 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
|
785 del self._extinctset |
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
786 |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
787 def addobsolete(self, sub, obj): |
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
788 """Add a relation marking that node <sub> is a new version of <obj>""" |
224 | 789 assert sub != obj |
790 if not repo[obj].phase(): | |
791 if sub is None: | |
792 self.ui.warn( | |
793 _("trying to kill immutable changeset %(obj)s\n") | |
794 % {'obj': short(obj)}) | |
795 if sub is not None: | |
796 self.ui.warn( | |
797 _("%(sub)s try to obsolete immutable changeset %(obj)s\n") | |
798 % {'sub': short(sub), 'obj': short(obj)}) | |
799 lock = self.lock() | |
53
0bcbf690dfca
reorganise code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
52
diff
changeset
|
800 try: |
224 | 801 newmarker = { |
802 'subjects': (sub==nullid) and [] or [sub], | |
803 'object': obj, | |
804 'date': util.makedate(), | |
805 'user': ui.username(), | |
806 'reason': 'unknown', | |
807 } | |
808 mid = self.obsoletestore.new(newmarker) | |
809 self._clearobsoletecache() | |
810 self._turn_extinct_secret() | |
811 return mid | |
812 finally: | |
813 lock.release() | |
814 | |
815 def _turn_extinct_secret(self): | |
816 """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
|
817 self._clearobsoletecache() |
224 | 818 # this is mainly for safety purpose |
819 # both pull and push | |
820 expobs = [c.node() for c in repo.set('extinct() - secret()')] | |
821 phases.retractboundary(repo, 2, expobs) | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
822 |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
823 ### Disk IO |
224 | 824 |
825 def lock(self, *args, **kwargs): | |
826 l = olock(*args, **kwargs) | |
827 if not getattr(l.releasefn, 'obspatched', False): | |
828 oreleasefn = l.releasefn | |
829 def releasefn(*args, **kwargs): | |
830 if self.obsoletestore._dirty: | |
831 writeobsolete(self) | |
832 oreleasefn(*args, **kwargs) | |
833 releasefn.obspatched = True | |
834 l.releasefn = releasefn | |
835 return l | |
836 | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
837 def _readobsrels(self): |
224 | 838 """Read obsolete relation on disk""" |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
839 # XXX handle lock |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
840 try: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
841 f = self.opener('obsolete-relations') |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
842 try: |
70
af4f7ef0a3c1
[obsolete] extract serialization logic.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
69
diff
changeset
|
843 return _obsdeserialise(f) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
844 finally: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
845 f.close() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
846 except IOError: |
54
ad1a4fb0fc49
Make states more resilient to missing head
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
53
diff
changeset
|
847 return {} |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
848 |
50
19b22ad56b32
clone support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
47
diff
changeset
|
849 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
850 ### pull // push support |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
851 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
852 def pull(self, remote, *args, **kwargs): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
853 """wrapper around push that push obsolete relation""" |
224 | 854 l = repo.lock() |
855 try: | |
856 result = opull(remote, *args, **kwargs) | |
857 if 'obsolete' in remote.listkeys('namespaces'): | |
858 tmp = StringIO() | |
859 rels = remote.listkeys('obsolete')['markers'] | |
860 tmp.write(base64.b64decode(rels)) | |
861 tmp.seek(0) | |
862 repo.obsoletestore.load(tmp) | |
863 repo.obsoletestore._dirty = True # XXX meh | |
864 self._clearobsoletecache() | |
865 self._turn_extinct_secret() | |
866 return result | |
867 finally: | |
868 l.release() | |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
869 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
870 def push(self, remote, *args, **opts): |
74
c7dd26dec7fc
[obsolete] update docstring
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
73
diff
changeset
|
871 """wrapper around pull that pull obsolete relation""" |
224 | 872 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
|
873 result = opush(remote, *args, **opts) |
56
27f9c0d0a996
[obsolete] Update pushkey code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
54
diff
changeset
|
874 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
|
875 tmp = StringIO() |
224 | 876 self.obsoletestore.save(tmp) |
877 remote.pushkey('obsolete', 'markers', '', tmp.getvalue()) | |
878 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
|
879 |
44
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
880 return result |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
881 |
b243c10a5fbe
Add pushkey support for pull and push
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
43
diff
changeset
|
882 |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
883 ### rollback support |
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
884 |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
885 # /!\ 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
|
886 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
|
887 def _journalfiles(self): |
224 | 888 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
|
889 |
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
890 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
|
891 """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
|
892 o_writejournal(desc) |
224 | 893 filename = 'obsoletemarkers' |
894 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
|
895 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
|
896 journalname = 'journal.' + filename |
224 | 897 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
|
898 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
|
899 |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
900 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
|
901 def _writejournal(self, desc): |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
902 """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
|
903 entries = list(o_writejournal(desc)) |
224 | 904 filename = 'obsoletemarkers' |
905 filepath = self.sjoin(filename) | |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
906 if os.path.exists(filepath): |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
907 journalname = 'journal.' + filename |
224 | 908 journalpath = self.sjoin(journalname) |
203
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
909 util.copyfile(filepath, journalpath) |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
910 entries.append(journalpath) |
9799d0aa53c8
[obsolete] add supprt for futur Hg 2.2
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
202
diff
changeset
|
911 return tuple(entries) |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
912 |
205
7ba30bd95a88
obsolete: fix rollback wrapper for 2.2-rc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
204
diff
changeset
|
913 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
|
914 """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
|
915 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
|
916 if not (ret or dryrun): #rollback did not failed |
224 | 917 src = self.sjoin('undo.obsoletemarkers') |
918 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
|
919 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
|
920 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
|
921 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
|
922 # 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
|
923 os.unlink(dst) |
83b7e2c62ac3
[obsolete] simplify by using the Hg 2.1 api
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
197
diff
changeset
|
924 # invalidate cache |
224 | 925 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
|
926 return ret |
52
62bdc2567099
Rollback support
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
51
diff
changeset
|
927 |
160
24346b78cd99
mercurial 2.1.2 compat
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
150
diff
changeset
|
928 @storecache('00changelog.i') |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
929 def changelog(self): |
228
5a17c0d41a00
proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
226
diff
changeset
|
930 # << copy pasted from mercurial source |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
931 c = changelog.changelog(self.sopener) |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
932 if 'HG_PENDING' in os.environ: |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
933 p = os.environ['HG_PENDING'] |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
934 if p.startswith(self.root): |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
935 c.readpending('00changelog.i.a') |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
936 # >> end of the copy paste |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
937 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
|
938 if old: |
c75a73209f1e
Locking while writing obsolete data.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
121
diff
changeset
|
939 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
|
940 def _sethidden(c, value): |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
941 assert not value |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
942 |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
943 |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
944 class hchangelog(c.__class__): |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
945 @util.propertycache |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
946 def hiddenrevs(c): |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
947 shown = ['not obsolete()', '.', 'bookmark()', 'tagged()', |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
948 'public()'] |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
949 basicquery = 'obsolete() - (::(%s))' % (' or '.join(shown)) |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
950 # !!! self is repo not changelog |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
951 result = set(scmutil.revrange(self, [basicquery])) |
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
952 return result |
215
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
953 c.__class__ = hchangelog |
0eceb5a48485
obsolete: fix changelog reload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
214
diff
changeset
|
954 return c |
114
1a64195e2b09
nicer hiddenrevs init
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
112
diff
changeset
|
955 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
956 repo.__class__ = obsoletingrepo |
135
1a08daef8a53
obsolete: add revset for various error case
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
132
diff
changeset
|
957 |
224 | 958 if False: |
959 expobs = [c.node() for c in repo.set('extinct() - secret()')] | |
960 if expobs: # do not lock in nothing move. locking for peanut make hgview reload on any command | |
961 lock = repo.lock() | |
962 try: | |
963 expobs = [c.node() for c in repo.set('extinct() - secret()')] | |
964 phases.retractboundary(repo, 2, expobs) | |
965 finally: | |
966 lock.release() |