mercurial/transaction.py
changeset 48685 21ac6aedd5e5
parent 48684 568f63b5a30f
child 48875 6000f5b25c9b
equal deleted inserted replaced
48684:568f63b5a30f 48685:21ac6aedd5e5
    22     util,
    22     util,
    23 )
    23 )
    24 from .utils import stringutil
    24 from .utils import stringutil
    25 
    25 
    26 version = 2
    26 version = 2
    27 
       
    28 # These are the file generators that should only be executed after the
       
    29 # finalizers are done, since they rely on the output of the finalizers (like
       
    30 # the changelog having been written).
       
    31 postfinalizegenerators = {
       
    32     b'bookmarks',
       
    33     b'dirstate-0-key-pre',
       
    34     b'dirstate-1-main',
       
    35     b'dirstate-2-key-post',
       
    36 }
       
    37 
    27 
    38 GEN_GROUP_ALL = b'all'
    28 GEN_GROUP_ALL = b'all'
    39 GEN_GROUP_PRE_FINALIZE = b'prefinalize'
    29 GEN_GROUP_PRE_FINALIZE = b'prefinalize'
    40 GEN_GROUP_POST_FINALIZE = b'postfinalize'
    30 GEN_GROUP_POST_FINALIZE = b'postfinalize'
    41 
    31 
   337         """
   327         """
   338         self._addbackupentry((location, b'', tmpfile, False))
   328         self._addbackupentry((location, b'', tmpfile, False))
   339 
   329 
   340     @active
   330     @active
   341     def addfilegenerator(
   331     def addfilegenerator(
   342         self, genid, filenames, genfunc, order=0, location=b''
   332         self,
       
   333         genid,
       
   334         filenames,
       
   335         genfunc,
       
   336         order=0,
       
   337         location=b'',
       
   338         post_finalize=False,
   343     ):
   339     ):
   344         """add a function to generates some files at transaction commit
   340         """add a function to generates some files at transaction commit
   345 
   341 
   346         The `genfunc` argument is a function capable of generating proper
   342         The `genfunc` argument is a function capable of generating proper
   347         content of each entry in the `filename` tuple.
   343         content of each entry in the `filename` tuple.
   360         generator will be executed.
   356         generator will be executed.
   361 
   357 
   362         The `location` arguments may be used to indicate the files are located
   358         The `location` arguments may be used to indicate the files are located
   363         outside of the the standard directory for transaction. It should match
   359         outside of the the standard directory for transaction. It should match
   364         one of the key of the `transaction.vfsmap` dictionary.
   360         one of the key of the `transaction.vfsmap` dictionary.
       
   361 
       
   362         The `post_finalize` argument can be set to `True` for file generation
       
   363         that must be run after the transaction has been finalized.
   365         """
   364         """
   366         # For now, we are unable to do proper backup and restore of custom vfs
   365         # For now, we are unable to do proper backup and restore of custom vfs
   367         # but for bookmarks that are handled outside this mechanism.
   366         # but for bookmarks that are handled outside this mechanism.
   368         self._filegenerators[genid] = (order, filenames, genfunc, location)
   367         entry = (order, filenames, genfunc, location, post_finalize)
       
   368         self._filegenerators[genid] = entry
   369 
   369 
   370     @active
   370     @active
   371     def removefilegenerator(self, genid):
   371     def removefilegenerator(self, genid):
   372         """reverse of addfilegenerator, remove a file generator function"""
   372         """reverse of addfilegenerator, remove a file generator function"""
   373         if genid in self._filegenerators:
   373         if genid in self._filegenerators:
   383             skip_pre = group == GEN_GROUP_POST_FINALIZE
   383             skip_pre = group == GEN_GROUP_POST_FINALIZE
   384             skip_post = group == GEN_GROUP_PRE_FINALIZE
   384             skip_post = group == GEN_GROUP_PRE_FINALIZE
   385 
   385 
   386         for id, entry in sorted(pycompat.iteritems(self._filegenerators)):
   386         for id, entry in sorted(pycompat.iteritems(self._filegenerators)):
   387             any = True
   387             any = True
   388             order, filenames, genfunc, location = entry
   388             order, filenames, genfunc, location, post_finalize = entry
   389 
   389 
   390             # for generation at closing, check if it's before or after finalize
   390             # for generation at closing, check if it's before or after finalize
   391             is_post = id in postfinalizegenerators
   391             if skip_post and post_finalize:
   392             if skip_post and is_post:
       
   393                 continue
   392                 continue
   394             elif skip_pre and not is_post:
   393             elif skip_pre and not post_finalize:
   395                 continue
   394                 continue
   396 
   395 
   397             vfs = self._vfsmap[location]
   396             vfs = self._vfsmap[location]
   398             files = []
   397             files = []
   399             try:
   398             try: