mercurial/transaction.py
changeset 28830 a5009789960c
parent 27924 24361fb68cba
child 28960 14e683d6b273
--- a/mercurial/transaction.py	Thu Apr 07 11:11:55 2016 +0000
+++ b/mercurial/transaction.py	Thu Apr 07 14:10:49 2016 -0700
@@ -23,6 +23,19 @@
 
 version = 2
 
+# These are the file generators that should only be executed after the
+# finalizers are done, since they rely on the output of the finalizers (like
+# the changelog having been written).
+postfinalizegenerators = set([
+    'bookmarks',
+    'dirstate'
+])
+
+class GenerationGroup(object):
+    ALL='all'
+    PREFINALIZE='prefinalize'
+    POSTFINALIZE='postfinalize'
+
 def active(func):
     def _active(self, *args, **kwds):
         if self.count == 0:
@@ -276,12 +289,19 @@
         # but for bookmarks that are handled outside this mechanism.
         self._filegenerators[genid] = (order, filenames, genfunc, location)
 
-    def _generatefiles(self, suffix=''):
+    def _generatefiles(self, suffix='', group=GenerationGroup.ALL):
         # write files registered for generation
         any = False
-        for entry in sorted(self._filegenerators.values()):
+        for id, entry in sorted(self._filegenerators.iteritems()):
             any = True
             order, filenames, genfunc, location = entry
+
+            # for generation at closing, check if it's before or after finalize
+            postfinalize = group == GenerationGroup.POSTFINALIZE
+            if (group != GenerationGroup.ALL and
+                (id in postfinalizegenerators) != (postfinalize)):
+                continue
+
             vfs = self._vfsmap[location]
             files = []
             try:
@@ -407,10 +427,11 @@
         '''commit the transaction'''
         if self.count == 1:
             self.validator(self)  # will raise exception if needed
-            self._generatefiles()
+            self._generatefiles(group=GenerationGroup.PREFINALIZE)
             categories = sorted(self._finalizecallback)
             for cat in categories:
                 self._finalizecallback[cat](self)
+            self._generatefiles(group=GenerationGroup.POSTFINALIZE)
 
         self.count -= 1
         if self.count != 0: