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.)
import mercurial.util
def dumbdecode(s, cmd):
return s.replace('\n', '\r\n')
def dumbencode(s, cmd):
return s.replace('\r\n', '\n')
def clevertest(s, cmd):
if '\0' in s: return False
return True
def cleverdecode(s, cmd):
if clevertest(s, cmd):
return dumbdecode(s, cmd)
return s
def cleverencode(s, cmd):
if clevertest(s, cmd):
return dumbencode(s, cmd)
return s
mercurial.util.filtertable.update({
'dumbdecode:': dumbdecode,
'dumbencode:': dumbencode,
'cleverdecode:': cleverdecode,
'cleverencode:': cleverencode,
})