diff mercurial/phases.py @ 22052:793f9276aeb9

pushkey: wrap pushkey phase movement in a transaction Phases are not yet inside the transaction, but we need to prepare for it. So we wrap the phase movement inside a transaction.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Wed, 06 Aug 2014 00:54:58 -0700
parents 1716a2671ec7
children 616a455b02ca
line wrap: on
line diff
--- a/mercurial/phases.py	Wed Aug 06 00:54:15 2014 -0700
+++ b/mercurial/phases.py	Wed Aug 06 00:54:58 2014 -0700
@@ -331,13 +331,16 @@
 def pushphase(repo, nhex, oldphasestr, newphasestr):
     """List phases root for serialization over pushkey"""
     repo = repo.unfiltered()
+    tr = None
     lock = repo.lock()
     try:
         currentphase = repo[nhex].phase()
         newphase = abs(int(newphasestr)) # let's avoid negative index surprise
         oldphase = abs(int(oldphasestr)) # let's avoid negative index surprise
         if currentphase == oldphase and newphase < oldphase:
+            tr = repo.transaction('pushkey-phase')
             advanceboundary(repo, newphase, [bin(nhex)])
+            tr.close()
             return 1
         elif currentphase == newphase:
             # raced, but got correct result
@@ -345,6 +348,8 @@
         else:
             return 0
     finally:
+        if tr:
+            tr.release()
         lock.release()
 
 def analyzeremotephases(repo, subset, roots):