bundle2: part id is an int, use %d to make it bytes
Differential Revision: https://phab.mercurial-scm.org/D2446
bundle2: **strkwargs love on various kwargs constructions
Differential Revision: https://phab.mercurial-scm.org/D2445
http: drop custom http client logic
Eight and a half years ago, as my starter bug on code.google.com, I
investigated a mysterious "broken pipe" error from seemingly random
clients[0]. That investigation revealed a tragic story: the Python
standard library's httplib was (and remains) barely functional. During
large POSTs, if a server responds early with an error (even a
permission denied error!) the client only notices that the server
closed the connection and everything breaks. Such server behavior is
implicitly legal under RFC 2616 (the latest HTTP RFC as of when I was
last working on this), and my understanding is that later RFCs have
made it explicitly legal to respond early with any status code outside
the 2xx range.
I embarked, probably foolishly, on a journey to write a new http
library with better overall behavior. The http library appears to work
well in most cases, but it can get confused in the presence of
proxies, and it depends on select(2) which limits its utility if a lot
of file descriptors are open. I haven't touched the http library in
almost two years, and in the interim the Python community has
discovered a better way[1] of writing network code. In theory some day
urllib3 will have its own home-grown http library built on h11[2], or
we could do that. Either way, it's time to declare our current
confusingly-named "http2" client logic and move on. I do hope to
revisit this some day: it's still garbage that we can't even respond
with a 401 or 403 without reading the entire POST body from the
client, but the goalposts on writing a new http client library have
moved substantially. We're almost certainly better off just switching
to requests and eventually picking up their http fixes than trying to
live with something that realistically only we'll ever use. Another
approach would be to write an adapter so that Mercurial can use pycurl
if it's installed. Neither of those approaches seem like they should
be investigated prior to a release of Mercurial that works on Python
3: that's where the mindshare is going to be for any improvements to
the state of the http client art.
0: http://web.archive.org/web/
20130501031801/http://code.google.com/p/support/issues/detail?id=2716
1: http://sans-io.readthedocs.io/
2: https://github.com/njsmith/h11
Differential Revision: https://phab.mercurial-scm.org/D2444
statichttprepo: move HTTPRangeHandler from byterange and delete the latter
It turns out we've been toting around 472 lines of Python just for
this 20-ish line class that teaches urllib how to handle '206 Partial
Content'. byterange.py showed up in my \sstr\( Python 3 dragnet, and
found itself having overstayed its welcome in our codebase.
# no-check-commit because we're moving code that has to have foo_bar naming.
Differential Revision: https://phab.mercurial-scm.org/D2443
filemerge: do what the context __bytes__ does, but locally
str() here is clearly the wrong thing, and I think the code is clearer
when it doesn't just depend on the magic __{str,bytes}__ behavior.
I decided to grep around for \sstr\( and see what low-hanging fruit
that showed me. This was part of that hunt. That grep pattern still
has some things worth exploring.
Differential Revision: https://phab.mercurial-scm.org/D2442
py3: convert known-int values to bytes using %d
I decided to grep around for \sstr\( and see what low-hanging fruit
that showed me. This was part of that hunt. That grep pattern still
has some things worth exploring.
Differential Revision: https://phab.mercurial-scm.org/D2441
py3: hunt down str(exception) instances and use util.forcebytestr
I decided to grep around for \sstr\( and see what low-hanging fruit
that showed me. This was part of that hunt. That grep pattern still
has some things worth exploring.
Differential Revision: https://phab.mercurial-scm.org/D2440
subrepo: use util.forcebytestr() instead of str() on exception
Differential Revision: https://phab.mercurial-scm.org/D2437
tests: add missing b prefixes in test-commit.t
# skip-blame just some b prefixes
Differential Revision: https://phab.mercurial-scm.org/D2436
commitextras: fix on Python 3 by using sysstrs for __dict__ ops
I'm dubious of the __dict__ shenanigans in use here, but lack the
enthusiasm for figuring out why that was done right now.
# skip-blame just some r prefixes
Differential Revision: https://phab.mercurial-scm.org/D2435