mercurial/revlogutils/nodemap.py
changeset 44497 3265c92f7d13
parent 44494 283fd803afa5
child 44515 6c906eaedd0d
equal deleted inserted replaced
44496:897f0ce4b484 44497:3265c92f7d13
    71     if revlog.nodemap_file is None:
    71     if revlog.nodemap_file is None:
    72         return  # we do not use persistent_nodemap on this revlog
    72         return  # we do not use persistent_nodemap on this revlog
    73     callback_id = b"revlog-persistent-nodemap-%s" % revlog.nodemap_file
    73     callback_id = b"revlog-persistent-nodemap-%s" % revlog.nodemap_file
    74     if tr.hasfinalize(callback_id):
    74     if tr.hasfinalize(callback_id):
    75         return  # no need to register again
    75         return  # no need to register again
    76     tr.addfinalize(
    76     tr.addfinalize(callback_id, lambda tr: _persist_nodemap(tr, revlog))
    77         callback_id, lambda tr: _persist_nodemap(tr.addpostclose, revlog)
    77 
    78     )
    78 
       
    79 class _NoTransaction(object):
       
    80     """transaction like object to update the nodemap outside a transaction
       
    81     """
       
    82 
       
    83     def __init__(self):
       
    84         self._postclose = {}
       
    85 
       
    86     def addpostclose(self, callback_id, callback_func):
       
    87         self._postclose[callback_id] = callback_func
    79 
    88 
    80 
    89 
    81 def update_persistent_nodemap(revlog):
    90 def update_persistent_nodemap(revlog):
    82     """update the persistent nodemap right now
    91     """update the persistent nodemap right now
    83 
    92 
    84     To be used for updating the nodemap on disk outside of a normal transaction
    93     To be used for updating the nodemap on disk outside of a normal transaction
    85     setup (eg, `debugupdatecache`).
    94     setup (eg, `debugupdatecache`).
    86     """
    95     """
    87     cleanups = []
    96     notr = _NoTransaction()
    88     _persist_nodemap((lambda x, y: cleanups.append(y)), revlog)
    97     _persist_nodemap(notr, revlog)
    89     for c in cleanups:
    98     for k in sorted(notr._postclose):
    90         c(None)
    99         notr._postclose[k](None)
    91 
   100 
    92 
   101 
    93 def _persist_nodemap(cleaner, revlog):
   102 def _persist_nodemap(tr, revlog):
    94     """Write nodemap data on disk for a given revlog
   103     """Write nodemap data on disk for a given revlog
    95     """
   104     """
    96     if getattr(revlog, 'filteredrevs', ()):
   105     if getattr(revlog, 'filteredrevs', ()):
    97         raise error.ProgrammingError(
   106         raise error.ProgrammingError(
    98             "cannot persist nodemap of a filtered changelog"
   107             "cannot persist nodemap of a filtered changelog"
   175         def cleanup(tr):
   184         def cleanup(tr):
   176             for oldfile in olds:
   185             for oldfile in olds:
   177                 realvfs.tryunlink(oldfile)
   186                 realvfs.tryunlink(oldfile)
   178 
   187 
   179         callback_id = b"revlog-cleanup-nodemap-%s" % revlog.nodemap_file
   188         callback_id = b"revlog-cleanup-nodemap-%s" % revlog.nodemap_file
   180         cleaner(callback_id, cleanup)
   189         tr.addpostclose(callback_id, cleanup)
   181 
   190 
   182 
   191 
   183 ### Nodemap docket file
   192 ### Nodemap docket file
   184 #
   193 #
   185 # The nodemap data are stored on disk using 2 files:
   194 # The nodemap data are stored on disk using 2 files: