hgext/obsolete.py
changeset 144 f387658d6d22
parent 143 0599fb01dc41
child 148 8e93e1f67205
equal deleted inserted replaced
143:0599fb01dc41 144:f387658d6d22
   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: