mercurial/obsolete.py
changeset 20207 cd62532c62a1
parent 20206 cdcbe103b69a
child 20277 c05b968d05eb
equal deleted inserted replaced
20206:cdcbe103b69a 20207:cd62532c62a1
    82   additional encoding. Keys cannot contain '\0' or ':' and values
    82   additional encoding. Keys cannot contain '\0' or ':' and values
    83   cannot contain '\0'.
    83   cannot contain '\0'.
    84 """
    84 """
    85 import struct
    85 import struct
    86 import util, base85, node
    86 import util, base85, node
       
    87 import phases
    87 from i18n import _
    88 from i18n import _
    88 
    89 
    89 _pack = struct.pack
    90 _pack = struct.pack
    90 _unpack = struct.unpack
    91 _unpack = struct.unpack
    91 
    92 
   784 
   785 
   785 
   786 
   786 @cachefor('bumped')
   787 @cachefor('bumped')
   787 def _computebumpedset(repo):
   788 def _computebumpedset(repo):
   788     """the set of revs trying to obsolete public revisions"""
   789     """the set of revs trying to obsolete public revisions"""
   789     # get all possible bumped changesets
   790     bumped = set()
   790     tonode = repo.changelog.node
   791     # utils function (avoid attribut lookup in the loop)
   791     publicnodes = (tonode(r) for r in repo.revs('public()'))
   792     phase = repo._phasecache.phase # would be faster to grab the full list
   792     successors = allsuccessors(repo.obsstore, publicnodes,
   793     public = phases.public
   793                                ignoreflags=bumpedfix)
   794     cl = repo.changelog
   794     # revision public or already obsolete don't count as bumped
   795     torev = cl.nodemap.get
   795     query = '%ld - obsolete() - public()'
   796     obs = getrevs(repo, 'obsolete')
   796     return set(repo.revs(query, _knownrevs(repo, successors)))
   797     for rev in repo:
       
   798         # We only evaluate mutable, non-obsolete revision
       
   799         if (public < phase(repo, rev)) and (rev not in obs):
       
   800             node = cl.node(rev)
       
   801             # (future) A cache of precursors may worth if split is very common
       
   802             for pnode in allprecursors(repo.obsstore, [node],
       
   803                                        ignoreflags=bumpedfix):
       
   804                 prev = torev(pnode) # unfiltered! but so is phasecache
       
   805                 if (prev is not None) and (phase(repo, prev) <= public):
       
   806                     # we have a public precursors
       
   807                     bumped.add(rev)
       
   808                     break # Next draft!
       
   809     return bumped
   797 
   810 
   798 @cachefor('divergent')
   811 @cachefor('divergent')
   799 def _computedivergentset(repo):
   812 def _computedivergentset(repo):
   800     """the set of rev that compete to be the final successors of some revision.
   813     """the set of rev that compete to be the final successors of some revision.
   801     """
   814     """