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.)
--- 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]")),