blob: e581453fc33ae77f73bcfc985b24c54e1ec09012 [file] [log] [blame]
diff -Naur Python-3.8.0-orig/Include/pylifecycle.h Python-3.8.0/Include/pylifecycle.h
--- Python-3.8.0-orig/Include/pylifecycle.h 2019-10-14 16:34:47.000000000 +0300
+++ Python-3.8.0/Include/pylifecycle.h 2019-10-22 10:02:36.752112100 +0300
@@ -21,6 +21,12 @@
PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void);
PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *);
+PyAPI_FUNC(wchar_t) Py_GetSepW(const wchar_t *);
+PyAPI_FUNC(char) Py_GetSepA(const char *);
+
+PyAPI_FUNC(void) Py_NormalizeSepsW(wchar_t *);
+PyAPI_FUNC(void) Py_NormalizeSepsA(char *);
+
/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
* exit functions.
diff -Naur Python-3.8.0-orig/Lib/ntpath.py Python-3.8.0/Lib/ntpath.py
--- Python-3.8.0-orig/Lib/ntpath.py 2019-10-14 16:34:47.000000000 +0300
+++ Python-3.8.0/Lib/ntpath.py 2019-10-22 10:02:37.157712800 +0300
@@ -11,9 +11,7 @@
curdir = '.'
pardir = '..'
extsep = '.'
-sep = '\\'
pathsep = ';'
-altsep = '/'
defpath = '.;C:\\bin'
devnull = 'nul'
@@ -23,6 +21,15 @@
import genericpath
from genericpath import *
+if sys.platform == "win32" and "MSYSTEM" in os.environ:
+ sep = '/'
+ altsep = '\\'
+else:
+ sep = '\\'
+ altsep = '/'
+bsep = str.encode(sep)
+baltsep = str.encode(altsep)
+
__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
"basename","dirname","commonprefix","getsize","getmtime",
"getatime","getctime", "islink","exists","lexists","isdir","isfile",
@@ -33,9 +40,27 @@
def _get_bothseps(path):
if isinstance(path, bytes):
- return b'\\/'
+ return bsep+baltsep
+ else:
+ return sep+altsep
+
+def _get_sep(path):
+ if isinstance(path, bytes):
+ return bsep
+ else:
+ return sep
+
+def _get_altsep(path):
+ if isinstance(path, bytes):
+ return baltsep
+ else:
+ return altsep
+
+def _get_colon(path):
+ if isinstance(path, bytes):
+ return b':'
else:
- return '\\/'
+ return ':'
# Normalize the case of a pathname and map slashes to backslashes.
# Other normalizations (such as optimizing '../' away) are not done
@@ -47,9 +72,9 @@
Makes all characters lowercase and all slashes into backslashes."""
s = os.fspath(s)
if isinstance(s, bytes):
- return s.replace(b'/', b'\\').lower()
+ return s.replace(baltsep, bsep).lower()
else:
- return s.replace('/', '\\').lower()
+ return s.replace(altsep, sep).lower()
# Return whether a path is absolute.
@@ -68,14 +93,9 @@
# Join two (or more) paths.
def join(path, *paths):
path = os.fspath(path)
- if isinstance(path, bytes):
- sep = b'\\'
- seps = b'\\/'
- colon = b':'
- else:
- sep = '\\'
- seps = '\\/'
- colon = ':'
+ sep = _get_sep(path)
+ seps = _get_bothseps(path)
+ colon = _get_colon(path)
try:
if not paths:
path[:0] + sep #23780: Ensure compatible data type even if p is null.
@@ -134,14 +154,9 @@
"""
p = os.fspath(p)
if len(p) >= 2:
- if isinstance(p, bytes):
- sep = b'\\'
- altsep = b'/'
- colon = b':'
- else:
- sep = '\\'
- altsep = '/'
- colon = ':'
+ sep = _get_sep(p)
+ altsep = _get_altsep(p)
+ colon = _get_colon(p)
normp = p.replace(altsep, sep)
if (normp[0:2] == sep*2) and (normp[2:3] != sep):
# is a UNC path:
@@ -195,9 +210,9 @@
def splitext(p):
p = os.fspath(p)
if isinstance(p, bytes):
- return genericpath._splitext(p, b'\\', b'/', b'.')
+ return genericpath._splitext(p, bsep, baltsep, b'.')
else:
- return genericpath._splitext(p, '\\', '/', '.')
+ return genericpath._splitext(p, sep, altsep, '.')
splitext.__doc__ = genericpath._splitext.__doc__
@@ -442,15 +457,13 @@
def normpath(path):
"""Normalize path, eliminating double slashes, etc."""
path = os.fspath(path)
+ sep = _get_sep(path)
+ altsep = _get_altsep(path)
if isinstance(path, bytes):
- sep = b'\\'
- altsep = b'/'
curdir = b'.'
pardir = b'..'
special_prefixes = (b'\\\\.\\', b'\\\\?\\')
else:
- sep = '\\'
- altsep = '/'
curdir = '.'
pardir = '..'
special_prefixes = ('\\\\.\\', '\\\\?\\')
@@ -620,6 +620,7 @@
# strip the prefix anyway.
if ex.winerror == initial_winerror:
path = spath
+ path = normpath(path)
return path
@@ -645,12 +658,11 @@
def relpath(path, start=None):
"""Return a relative version of a path"""
path = os.fspath(path)
+ sep = _get_sep(path)
if isinstance(path, bytes):
- sep = b'\\'
curdir = b'.'
pardir = b'..'
else:
- sep = '\\'
curdir = '.'
pardir = '..'
@@ -705,13 +717,11 @@
raise ValueError('commonpath() arg is an empty sequence')
paths = tuple(map(os.fspath, paths))
+ sep = _get_sep(paths[0])
+ altsep = _get_altsep(paths[0])
if isinstance(paths[0], bytes):
- sep = b'\\'
- altsep = b'/'
curdir = b'.'
else:
- sep = '\\'
- altsep = '/'
curdir = '.'
try:
diff -Naur Python-3.8.0-orig/Modules/posixmodule.c Python-3.8.0/Modules/posixmodule.c
--- Python-3.8.0-orig/Modules/posixmodule.c 2019-10-22 10:00:56.988936800 +0300
+++ Python-3.8.0/Modules/posixmodule.c 2019-10-22 10:02:37.547713500 +0300
@@ -3438,6 +3438,7 @@
return PyErr_SetFromWindowsErr(0);
}
+ Py_NormalizeSepsW(wbuf2);
PyObject *resobj = PyUnicode_FromWideChar(wbuf2, len);
if (wbuf2 != wbuf) {
PyMem_RawFree(wbuf2);
@@ -3886,6 +3887,7 @@
result = GetFullPathNameW(path->wide, result, woutbufp, &wtemp);
}
if (result) {
+ Py_NormalizeSepsW(woutbufp);
v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp));
if (path->narrow)
Py_SETREF(v, PyUnicode_EncodeFSDefault(v));
@@ -3962,6 +3964,7 @@
target_path = tmp;
}
+ Py_NormalizeSepsW(target_path);
result = PyUnicode_FromWideChar(target_path, result_length);
if (result && path->narrow) {
Py_SETREF(result, PyUnicode_EncodeFSDefault(result));
diff -Naur Python-3.8.0-orig/Python/initconfig.c Python-3.8.0/Python/initconfig.c
--- Python-3.8.0-orig/Python/initconfig.c 2019-10-14 16:34:47.000000000 +0300
+++ Python-3.8.0/Python/initconfig.c 2019-10-22 10:02:37.968914200 +0300
@@ -98,7 +98,7 @@
"PYTHONDEVMODE: enable the development mode.\n"
"PYTHONPYCACHEPREFIX: root directory for bytecode cache (pyc) files.\n";
-#if defined(MS_WINDOWS)
+#if defined(_MSC_VER)
# define PYTHONHOMEHELP "<prefix>\\python{major}{minor}"
#else
# define PYTHONHOMEHELP "<prefix>/lib/pythonX.X"
@@ -1129,7 +1129,7 @@
}
/* Last fall back: hardcoded name */
-#ifdef MS_WINDOWS
+#ifdef _MSC_VER
const wchar_t *default_program_name = L"python";
#else
const wchar_t *default_program_name = L"python3";
diff -Naur Python-3.8.0-orig/Python/pathconfig.c Python-3.8.0/Python/pathconfig.c
--- Python-3.8.0-orig/Python/pathconfig.c 2019-10-14 16:34:47.000000000 +0300
+++ Python-3.8.0/Python/pathconfig.c 2019-10-22 10:02:38.358914900 +0300
@@ -13,6 +13,114 @@
extern "C" {
#endif
+#ifdef __MINGW32__
+#define wcstok wcstok_s
+#include <windows.h>
+#endif
+
+char
+Py_GetSepA(const char *name)
+{
+ char* msystem = (char*)2; /* So that non Windows use / as sep */
+ static char sep = '\0';
+#ifdef _WIN32
+ /* https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247%28v=vs.85%29.aspx
+ * The "\\?\" prefix .. indicate that the path should be passed to the system with minimal
+ * modification, which means that you cannot use forward slashes to represent path separators
+ */
+ if (name != NULL && memcmp(name, "\\\\?\\", sizeof("\\\\?\\") - sizeof(char)) == 0)
+ {
+ return '\\';
+ }
+#endif
+ if (sep != '\0')
+ return sep;
+#if defined(__MINGW32__)
+ msystem = Py_GETENV("MSYSTEM");
+#endif
+ if (msystem != NULL)
+ sep = '/';
+ else
+ sep = '\\';
+ return sep;
+}
+
+static char
+Py_GetAltSepA(const char *name)
+{
+ char sep = Py_GetSepA(name);
+ if (sep == '/')
+ return '\\';
+ return '/';
+}
+
+void
+Py_NormalizeSepsA(char *name)
+{
+ char sep = Py_GetSepA(name);
+ char altsep = Py_GetAltSepA(name);
+ char* seps;
+ if (strlen(name) > 1 && name[1] == ':') {
+ name[0] = toupper(name[0]);
+ }
+ seps = strchr(name, altsep);
+ while(seps) {
+ *seps = sep;
+ seps = strchr(seps, altsep);
+ }
+}
+
+wchar_t
+Py_GetSepW(const wchar_t *name)
+{
+ char* msystem = (char*)2; /* So that non Windows use / as sep */
+ static wchar_t sep = L'\0';
+#ifdef _WIN32
+ /* https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247%28v=vs.85%29.aspx
+ * The "\\?\" prefix .. indicate that the path should be passed to the system with minimal
+ * modification, which means that you cannot use forward slashes to represent path separators
+ */
+ if (name != NULL && memcmp(name, L"\\\\?\\", sizeof(L"\\\\?\\") - sizeof(wchar_t)) == 0)
+ {
+ return L'\\';
+ }
+#endif
+ if (sep != L'\0')
+ return sep;
+#if defined(__MINGW32__)
+ msystem = Py_GETENV("MSYSTEM");
+#endif
+ if (msystem != NULL)
+ sep = L'/';
+ else
+ sep = L'\\';
+ return sep;
+}
+
+static wchar_t
+Py_GetAltSepW(const wchar_t *name)
+{
+ char sep = Py_GetSepW(name);
+ if (sep == L'/')
+ return L'\\';
+ return L'/';
+}
+
+void
+Py_NormalizeSepsW(wchar_t *name)
+{
+ wchar_t sep = Py_GetSepW(name);
+ wchar_t altsep = Py_GetAltSepW(name);
+ wchar_t* seps;
+ if (wcslen(name) > 1 && name[1] == L':') {
+ name[0] = towupper(name[0]);
+ }
+ seps = wcschr(name, altsep);
+ while(seps) {
+ *seps = sep;
+ seps = wcschr(seps, altsep);
+ }
+}
_PyPathConfig _Py_path_config = _PyPathConfig_INIT;
#ifdef MS_WINDOWS
@@ -560,6 +668,7 @@
if (_Py_path_config.program_name == NULL) {
Py_FatalError("Py_SetProgramName() failed: out of memory");
}
+ Py_NormalizeSepsW(_Py_path_config.program_name);
}
void
diff -Naur Python-3.8.0-orig/Python/traceback.c Python-3.8.0/Python/traceback.c
--- Python-3.8.0-orig/Python/traceback.c 2019-10-14 16:34:47.000000000 +0300
+++ Python-3.8.0/Python/traceback.c 2019-10-22 10:02:39.170116300 +0300
@@ -315,7 +315,7 @@
filepath = PyBytes_AS_STRING(filebytes);
/* Search tail of filename in sys.path before giving up */
- tail = strrchr(filepath, SEP);
+ tail = strrchr(filepath, Py_GetSepA(filepath));
if (tail == NULL)
tail = filepath;
else