tools/mpremote: Support OSError's on targets without errno.
Targets without the `errno` module enabled will not render `OSError`s with the name of the error. Instead they just print the numeric error code. Add support for such targets by explicitly recognising certain error codes. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
53
tools/mpremote/mpremote/mp_errno.py
Normal file
53
tools/mpremote/mpremote/mp_errno.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import errno
|
||||||
|
|
||||||
|
# This table maps numeric values defined by `py/mperrno.h` to host errno code.
|
||||||
|
MP_ERRNO_TABLE = {
|
||||||
|
1: errno.EPERM,
|
||||||
|
2: errno.ENOENT,
|
||||||
|
3: errno.ESRCH,
|
||||||
|
4: errno.EINTR,
|
||||||
|
5: errno.EIO,
|
||||||
|
6: errno.ENXIO,
|
||||||
|
7: errno.E2BIG,
|
||||||
|
8: errno.ENOEXEC,
|
||||||
|
9: errno.EBADF,
|
||||||
|
10: errno.ECHILD,
|
||||||
|
11: errno.EAGAIN,
|
||||||
|
12: errno.ENOMEM,
|
||||||
|
13: errno.EACCES,
|
||||||
|
14: errno.EFAULT,
|
||||||
|
15: errno.ENOTBLK,
|
||||||
|
16: errno.EBUSY,
|
||||||
|
17: errno.EEXIST,
|
||||||
|
18: errno.EXDEV,
|
||||||
|
19: errno.ENODEV,
|
||||||
|
20: errno.ENOTDIR,
|
||||||
|
21: errno.EISDIR,
|
||||||
|
22: errno.EINVAL,
|
||||||
|
23: errno.ENFILE,
|
||||||
|
24: errno.EMFILE,
|
||||||
|
25: errno.ENOTTY,
|
||||||
|
26: errno.ETXTBSY,
|
||||||
|
27: errno.EFBIG,
|
||||||
|
28: errno.ENOSPC,
|
||||||
|
29: errno.ESPIPE,
|
||||||
|
30: errno.EROFS,
|
||||||
|
31: errno.EMLINK,
|
||||||
|
32: errno.EPIPE,
|
||||||
|
33: errno.EDOM,
|
||||||
|
34: errno.ERANGE,
|
||||||
|
95: errno.EOPNOTSUPP,
|
||||||
|
97: errno.EAFNOSUPPORT,
|
||||||
|
98: errno.EADDRINUSE,
|
||||||
|
103: errno.ECONNABORTED,
|
||||||
|
104: errno.ECONNRESET,
|
||||||
|
105: errno.ENOBUFS,
|
||||||
|
106: errno.EISCONN,
|
||||||
|
107: errno.ENOTCONN,
|
||||||
|
110: errno.ETIMEDOUT,
|
||||||
|
111: errno.ECONNREFUSED,
|
||||||
|
113: errno.EHOSTUNREACH,
|
||||||
|
114: errno.EALREADY,
|
||||||
|
115: errno.EINPROGRESS,
|
||||||
|
125: errno.ECANCELED,
|
||||||
|
}
|
||||||
@@ -24,8 +24,9 @@
|
|||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
# THE SOFTWARE.
|
# THE SOFTWARE.
|
||||||
|
|
||||||
import ast, errno, hashlib, os, sys
|
import ast, errno, hashlib, os, re, sys
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from .mp_errno import MP_ERRNO_TABLE
|
||||||
|
|
||||||
|
|
||||||
def stdout_write_bytes(b):
|
def stdout_write_bytes(b):
|
||||||
@@ -62,6 +63,16 @@ def _convert_filesystem_error(e, info):
|
|||||||
]:
|
]:
|
||||||
if estr in e.error_output:
|
if estr in e.error_output:
|
||||||
return OSError(code, info)
|
return OSError(code, info)
|
||||||
|
|
||||||
|
# Some targets don't render OSError with the name of the errno, so in these
|
||||||
|
# cases support an explicit mapping of errnos to known numeric codes.
|
||||||
|
error_lines = e.error_output.splitlines()
|
||||||
|
match = re.match(r"OSError: (\d+)$", error_lines[-1])
|
||||||
|
if match:
|
||||||
|
value = int(match.group(1), 10)
|
||||||
|
if value in MP_ERRNO_TABLE:
|
||||||
|
return OSError(MP_ERRNO_TABLE[value], info)
|
||||||
|
|
||||||
return e
|
return e
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user