Improve error handling in osutil.c
1) In posix part set error when path is too long so instead of
SystemError: error returned without exception set
it will raise
ValueError: path too long
2) In Win32 part replace generic
PyErr_SetExcFromWindowsErrWithFilename
by
PyErr_SetFromWindowsErrWithFilename
The exception returned is WinError(based on OSError) and
some rudimentary errno translation is performed from Windows error range
to errno module friendly range so errors like ENOENT can be handled via symbolic
constant and consistently between Win32 and Posix.
--- a/mercurial/osutil.c Mon Sep 29 12:12:53 2008 +0200
+++ b/mercurial/osutil.c Wed Oct 01 08:41:18 2008 -0400
@@ -207,9 +207,7 @@
fh = FindFirstFileA(pattern, &fd);
if (fh == INVALID_HANDLE_VALUE) {
- PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
- GetLastError(),
- path);
+ PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
goto error_file;
}
@@ -244,9 +242,7 @@
} while (FindNextFileA(fh, &fd));
if (GetLastError() != ERROR_NO_MORE_FILES) {
- PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError,
- GetLastError(),
- path);
+ PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
goto error;
}
@@ -294,9 +290,10 @@
&path, &pathlen, &statflag, &skip))
goto error_parse;
- if (pathlen >= PATH_MAX)
+ if (pathlen >= PATH_MAX) {
+ PyErr_SetString(PyExc_ValueError, "path too long");
goto error_parse;
-
+ }
strncpy(fullpath, path, PATH_MAX);
fullpath[pathlen] = '/';
keepstat = statflag && PyObject_IsTrue(statflag);