obsolete: smarter initialisation of obsolete stuff from disk.
diff --git a/hgext/obsolete.py b/hgext/obsolete.py --- a/hgext/obsolete.py +++ b/hgext/obsolete.py @@ -116,8 +116,8 @@ def hidden(ctx): shown = ['not obsolete()', '.', 'bookmark()', 'tagged()', 'publishedheads()'] basicquery = 'obsolete() - (::(%s))' % (' or '.join(shown)) - for rev in scmutil.revrange(ctx._repo, [basicquery]): - ctx._repo.changelog.hiddenrevs.add(rev) + ctx._repo.changelog.hiddenrevs.update( + scmutil.revrange(ctx._repo, [basicquery])) ctx._repo.changelog.hiddeninit = True return ohidden(ctx) @@ -130,7 +130,7 @@ def revsetobsolete(repo, subset, x): """filter obsolet entry""" args = revset.getargs(x, 0, 0, 'publicheads takes no arguments') # XXX slow stop using context - return [r for r in subset if repo[r].obsolete()] + return [r for r in subset if r in repo._obsoleteset] ### Other Extension compat ############################ @@ -331,6 +331,16 @@ def reposetup(ui, repo): """return the set of node that <node> make obsolete (sub)""" return self._obssubrels.get(node, set()) + @util.propertycache + def _obsoleteset(self): + obs = set() + for obj in self._obsobjrels: + try: + obs.add(self.changelog.rev(obj)) + except error.LookupError: + pass + return obs + def addobsolete(self, sub, obj): """Add a relation marking that node <sub> is a new version of <obj>""" if sub == nullid: @@ -351,6 +361,12 @@ def reposetup(ui, repo): except (error.RepoLookupError, error.LookupError): pass #unknow revision (but keep propagating the data self._writeobsrels() + if '_obsobjrels' in vars(self): + del self._obsobjrels + if '_obssubrels' in vars(self): + del self._obssubrels + if '_obsoleteset' in vars(self): + del self._obsoleteset ### obsolete storage @util.propertycache