hbisect.py: don't rely on __del__ to write the current state.
authorAlexis S. L. Carvalho <alexis@cecm.usp.br>
Fri, 28 Jul 2006 21:20:41 -0300
changeset 2735 07026da25ed8
parent 2734 0b7206a65325
child 2736 eb1bde9560bc
hbisect.py: don't rely on __del__ to write the current state. This is yet another page of the "Thou shalt not do too much inside __del__ methods" book, in the "demandload and __del__ don't go well together" chapter. The bisect extension is broken in 0.9.1: $ hg bisect init $ hg bisect bad Fatal Python error: Interpreter not initialized (version mismatch?) Aborted (yes, I tripled checked my instalation to make sure the problem is not there) It's been broken since revision fe1689273f84 moved the import of the binascii module into a demandload. (In details: the first time that "hg bisect bad" (or good) is called, there are still no revisions saved in .hg/bisect/*, so bisect.__init__ doesn't call hg.bin on anything. So, when we reach __del__, the binascii module still hasn't been imported and we get that "nice" message above.)
hgext/hbisect.py
--- a/hgext/hbisect.py	Sat Jul 29 01:58:12 2006 +0200
+++ b/hgext/hbisect.py	Fri Jul 28 21:20:41 2006 -0300
@@ -50,7 +50,7 @@
             if r:
                 self.badrev = hg.bin(r.pop(0))
 
-    def __del__(self):
+    def write(self):
         if not os.path.isdir(self.path):
             return
         f = self.opener(self.good_path, "w")
@@ -288,7 +288,10 @@
     if len(args) > bisectcmdtable[cmd][1]:
         ui.warn(_("bisect: Too many arguments\n"))
         return help_()
-    return bisectcmdtable[cmd][0](*args)
+    try:
+        return bisectcmdtable[cmd][0](*args)
+    finally:
+        b.write()
 
 cmdtable = {
     "bisect": (bisect_run, [], _("hg bisect [help|init|reset|next|good|bad]")),