# HG changeset patch # User Alexis S. L. Carvalho # Date 1154132441 10800 # Node ID 07026da25ed88f85b37119bbf134f828eb53874f # Parent 0b7206a6532503decb001de51c5f751ae2a1fbc0 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.) diff --git a/hgext/hbisect.py b/hgext/hbisect.py --- a/hgext/hbisect.py +++ b/hgext/hbisect.py @@ -50,7 +50,7 @@ class bisect(object): 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 @@ for subcommands see "hg bisect help\" 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]")),