133 """obsolete changesets without obsolete descendants""" |
133 """obsolete changesets without obsolete descendants""" |
134 args = revset.getargs(x, 0, 0, 'unstable takes no arguments') |
134 args = revset.getargs(x, 0, 0, 'unstable takes no arguments') |
135 return [r for r in subset if r in repo._extinctset] |
135 return [r for r in subset if r in repo._extinctset] |
136 |
136 |
137 |
137 |
138 def _obsparents(repo, narrow, s): |
138 def _obsparents(repo, s): |
|
139 """obsolete parents of a subset""" |
139 cs = set() |
140 cs = set() |
140 nm = repo.changelog.nodemap |
141 nm = repo.changelog.nodemap |
141 for r in s: |
142 for r in s: |
142 for p in repo._obssubrels.get(repo[r].node(), ()): |
143 for p in repo._obssubrels.get(repo[r].node(), ()): |
143 pr = nm.get(p, None) |
144 pr = nm.get(p, None) |
144 if pr is not None: |
145 if pr is not None: |
145 cs.add(pr) |
146 cs.add(pr) |
146 return cs |
147 return cs |
147 |
148 |
148 |
|
149 def revsetobsparents(repo, subset, x): |
149 def revsetobsparents(repo, subset, x): |
150 """obsolete parents of a changeset""" |
150 """obsolete parents""" |
151 s = revset.getset(repo, range(len(repo)), x) |
151 s = revset.getset(repo, range(len(repo)), x) |
152 cs = _obsparents(repo, subset, s) |
152 cs = _obsparents(repo, s) |
153 return [r for r in subset if r in cs] |
153 return [r for r in subset if r in cs] |
|
154 |
|
155 def _obsancestors(repo, s): |
|
156 """obsolete ancestors of a subset""" |
|
157 toproceed = [repo[r].node() for r in s] |
|
158 seen = set() |
|
159 while toproceed: |
|
160 nc = toproceed.pop() |
|
161 for np in repo._obssubrels.get(nc, ()): |
|
162 if np not in seen: |
|
163 seen.add(np) |
|
164 toproceed.append(np) |
|
165 nm = repo.changelog.nodemap |
|
166 cs = set() |
|
167 for p in seen: |
|
168 pr = nm.get(p, None) |
|
169 if pr is not None: |
|
170 cs.add(pr) |
|
171 return cs |
|
172 |
|
173 def revsetobsancestors(repo, subset, x): |
|
174 """obsolete parents""" |
|
175 s = revset.getset(repo, range(len(repo)), x) |
|
176 cs = _obsancestors(repo, s) |
|
177 return [r for r in subset if r in cs] |
|
178 |
|
179 |
154 |
180 |
155 ### Other Extension compat |
181 ### Other Extension compat |
156 ############################ |
182 ############################ |
157 |
183 |
158 def concludenode(orig, repo, rev, *args, **kwargs): |
184 def concludenode(orig, repo, rev, *args, **kwargs): |
177 revset.symbols["obsolete"] = revsetobsolete |
203 revset.symbols["obsolete"] = revsetobsolete |
178 revset.symbols["unstable"] = revsetunstable |
204 revset.symbols["unstable"] = revsetunstable |
179 revset.symbols["suspended"] = revsetsuspended |
205 revset.symbols["suspended"] = revsetsuspended |
180 revset.symbols["extinct"] = revsetextinct |
206 revset.symbols["extinct"] = revsetextinct |
181 revset.symbols["obsparents"] = revsetobsparents |
207 revset.symbols["obsparents"] = revsetobsparents |
|
208 revset.symbols["obsancestors"] = revsetobsancestors |
182 |
209 |
183 |
210 |
184 try: |
211 try: |
185 rebase = extensions.find('rebase') |
212 rebase = extensions.find('rebase') |
186 if rebase: |
213 if rebase: |