wireprotoserver: ensure that output stream gets flushed on exception
Previously flush was happening due to Python finalizer being run on
`BufferedWriter`. With upgrade to Python 3.11 this started randomly
failing.
My guess is that the finalizer on the raw `FileIO` object may
be running before the finalizer of `BufferedWriter` has a chance to run.
At any rate, since we're not relying on finalizers in the happy case
we should also not rely on them in case of exception.
#require rust
$ cat >> $HGRCPATH << EOF
> [format]
> use-dirstate-v2=1
> [storage]
> dirstate-v2.slow-path=allow
> EOF
$ hg init t
$ cd t
$ for i in 1 2 3 4 5 6 7 8 9 10; do touch foobar$i; done
$ hg add .
adding foobar1
adding foobar10
adding foobar2
adding foobar3
adding foobar4
adding foobar5
adding foobar6
adding foobar7
adding foobar8
adding foobar9
$ hg commit -m "1"
Check that there's no space leak on debugrebuilddirstate
$ f --size .hg/dirstate*
.hg/dirstate: size=133
.hg/dirstate.88698448: size=511
$ hg debugrebuilddirstate
$ f --size .hg/dirstate*
.hg/dirstate: size=133
.hg/dirstate.6b8ab34b: size=511
$ hg debugrebuilddirstate
$ f --size .hg/dirstate*
.hg/dirstate: size=133
.hg/dirstate.b875dfc5: size=511