Mercurial > evolve
annotate obsolete.py @ 41:99c131e97bb3
Do not hide current and bookmarked
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Wed, 07 Sep 2011 18:39:02 +0200 |
parents | b9a5a596d9ef |
children | eb6a06d7eae3 |
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. |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
8 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
9 from mercurial import util |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
10 from mercurial import context |
39 | 11 from mercurial import revset |
40
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
12 from mercurial import scmutil |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
13 from mercurial.node import hex, bin |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
14 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
15 # Patch changectx |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
16 ############################# |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
17 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
18 def obsolete(ctx): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
19 """is the changeset obsolete by other""" |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
20 if ctx.node()is None: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
21 return False |
38 | 22 return bool(ctx._repo.obsoletedby(ctx.node())) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
23 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
24 context.changectx.obsolete = obsolete |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
25 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
26 ohidden = context.changectx.hidden |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
27 def hidden(ctx): |
40
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
28 # hack to fill hiddenrevs |
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
29 # compute hidden (XXX should move elsewhere) |
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
30 if not getattr(ctx._repo.changelog, 'hiddeninit', False): |
41
99c131e97bb3
Do not hide current and bookmarked
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
40
diff
changeset
|
31 basicquery = 'obsolete() - (ancestors(not obsolete() or . or bookmark()))' |
40
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
32 for rev in scmutil.revrange(ctx._repo, [basicquery]): |
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
33 ctx._repo.changelog.hiddenrevs.add(rev) |
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
34 ctx._repo.changelog.hiddeninit = True |
b9a5a596d9ef
proper computation of hidden changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
39
diff
changeset
|
35 |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
36 return ohidden(ctx) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
37 context.changectx.hidden = hidden |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
38 |
39 | 39 # revset |
40 ############################# | |
41 | |
42 def revsetobsolete(repo, subset, x): | |
43 args = revset.getargs(x, 0, 0, 'publicheads takes no arguments') | |
44 return [r for r in subset if repo[r].obsolete()] # XXX slow | |
45 | |
46 def extsetup(ui): | |
47 revset.symbols["obsolete"] = revsetobsolete | |
48 | |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
49 # New commands |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
50 ############################# |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
51 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
52 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
53 def cmddebugobsolete(ui, repo, subject, object): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
54 """Add an obsolete relation between a too node |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
55 |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
56 The subject is expected to be a newer version of the object""" |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
57 sub = repo[subject] |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
58 obj = repo[object] |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
59 repo.addobsolete(sub.node(), obj.node()) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
60 return 0 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
61 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
62 cmdtable = {'debugobsolete': (cmddebugobsolete, [], '<subject> <object>')} |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
63 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
64 def reposetup(ui, repo): |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
65 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
66 class obsoletingrepo(repo.__class__): |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
67 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
68 @util.propertycache |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
69 def hiddenrevs(self): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
70 # It's a property because It simpler that to handle the __init__ |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
71 revs = set() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
72 return revs |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
73 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
74 @util.propertycache |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
75 def _obsobjrels(self): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
76 """{<old-node> -> set(<new-node>)} |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
77 |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
78 also compute hidden revision""" |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
79 #reverse sub -> objs mapping |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
80 objrels = {} |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
81 for sub, objs in self._obssubrels.iteritems(): |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
82 for obj in objs: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
83 objrels.setdefault(obj, set()).add(sub) |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
84 |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
85 # |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
86 return objrels |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
87 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
88 @util.propertycache |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
89 def _obssubrels(self): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
90 """{<new-node> -> set(<old-node>)}""" |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
91 return self._readobsrels() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
92 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
93 |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
94 ### Disk IO |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
95 def _readobsrels(self): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
96 """Write obsolete relation on disk""" |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
97 # XXX handle lock |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
98 rels = {} |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
99 try: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
100 f = self.opener('obsolete-relations') |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
101 try: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
102 for line in f: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
103 subhex, objhex = line.split() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
104 rels.setdefault(bin(subhex), set()).add(bin(objhex)) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
105 finally: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
106 f.close() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
107 except IOError: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
108 pass |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
109 return rels |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
110 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
111 def _writeobsrels(self): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
112 """Write obsolete relation on disk""" |
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
113 # XXX handle lock |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
114 f = self.opener('obsolete-relations', 'w', atomictemp=True) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
115 try: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
116 for sub, objs in self._obssubrels.iteritems(): |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
117 for obj in objs: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
118 f.write('%s %s\n' % (hex(sub), hex(obj))) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
119 f.rename() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
120 finally: |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
121 f.close() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
122 |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
123 ### Public method |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
124 def obsoletedby(self, node): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
125 """return the set of node that make <node> obsolete (obj)""" |
38 | 126 return self._obsobjrels.get(node, set()) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
127 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
128 def obsolete(self, node): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
129 """return the set of node that <node> make obsolete (sub)""" |
38 | 130 return self._obssubrels.get(node, set()) |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
131 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
132 def addobsolete(self, sub, obj): |
37
9493ffa68633
Documentation !
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
32
diff
changeset
|
133 """Add a relation marking that node <sub> is a new version of <obj>""" |
32
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
134 self._obssubrels.setdefault(sub, set()).add(obj) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
135 self._obsobjrels.setdefault(obj, set()).add(sub) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
136 self.changelog.hiddenrevs.add(repo[obj].rev()) |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
137 self._writeobsrels() |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
138 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
139 repo.__class__ = obsoletingrepo |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
140 |
c27491be4431
obsolet: basic support (hide changeset)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff
changeset
|
141 |