py3: paper over differences in future exception handling
It looks like Python 3's futures library lacks set_exception_info
entirely. We'll just give up and use set_exception in that case.
# no-check-commit because the underbar naming is just saner here
Differential Revision: https://phab.mercurial-scm.org/D3336
--- a/mercurial/httppeer.py Sat Apr 14 02:06:03 2018 +0530
+++ b/mercurial/httppeer.py Fri Apr 13 18:17:45 2018 -0400
@@ -754,7 +754,8 @@
try:
result.append(decoder.decode())
except Exception:
- f.set_exception_info(*sys.exc_info()[1:])
+ pycompat.future_set_exception_info(
+ f, sys.exc_info()[1:])
continue
else:
result.append(meta['data'])
--- a/mercurial/localrepo.py Sat Apr 14 02:06:03 2018 +0530
+++ b/mercurial/localrepo.py Fri Apr 13 18:17:45 2018 -0400
@@ -184,7 +184,7 @@
try:
result = fn(**args)
except Exception:
- f.set_exception_info(*sys.exc_info()[1:])
+ pycompat.future_set_exception_info(f, sys.exc_info()[1:])
else:
f.set_result(result)
--- a/mercurial/pycompat.py Sat Apr 14 02:06:03 2018 +0530
+++ b/mercurial/pycompat.py Fri Apr 13 18:17:45 2018 -0400
@@ -28,6 +28,9 @@
import xmlrpclib
from .thirdparty.concurrent import futures
+
+ def future_set_exception_info(f, exc_info):
+ f.set_exception_info(*exc_info)
else:
import concurrent.futures as futures
import http.cookiejar as cookielib
@@ -37,6 +40,9 @@
import socketserver
import xmlrpc.client as xmlrpclib
+ def future_set_exception_info(f, exc_info):
+ f.set_exception(exc_info[0])
+
empty = _queue.Empty
queue = _queue.Queue
--- a/mercurial/wireprotov1peer.py Sat Apr 14 02:06:03 2018 +0530
+++ b/mercurial/wireprotov1peer.py Fri Apr 13 18:17:45 2018 -0400
@@ -209,7 +209,7 @@
try:
result = fn(**pycompat.strkwargs(args))
except Exception:
- f.set_exception_info(*sys.exc_info()[1:])
+ pycompat.future_set_exception_info(f, sys.exc_info()[1:])
else:
f.set_result(result)
@@ -234,14 +234,14 @@
batchable = fn.batchable(fn.__self__,
**pycompat.strkwargs(args))
except Exception:
- f.set_exception_info(*sys.exc_info()[1:])
+ pycompat.future_set_exception_info(f, sys.exc_info()[1:])
return
# Encoded arguments and future holding remote result.
try:
encodedargs, fremote = next(batchable)
except Exception:
- f.set_exception_info(*sys.exc_info()[1:])
+ pycompat.future_set_exception_info(f, sys.exc_info()[1:])
return
requests.append((command, encodedargs))
@@ -304,7 +304,7 @@
try:
result = next(batchable)
except Exception:
- f.set_exception_info(*sys.exc_info()[1:])
+ pycompat.future_set_exception_info(f, sys.exc_info()[1:])
else:
f.set_result(result)