216 lines
6.9 KiB
Diff
216 lines
6.9 KiB
Diff
diff -Naur Python-2.7.9-orig/Lib/ntpath.py Python-2.7.9/Lib/ntpath.py
|
|
--- Python-2.7.9-orig/Lib/ntpath.py 2014-12-10 18:59:39.000000000 +0300
|
|
+++ Python-2.7.9/Lib/ntpath.py 2014-12-11 13:50:46.238600000 +0300
|
|
@@ -24,9 +24,22 @@
|
|
curdir = '.'
|
|
pardir = '..'
|
|
extsep = '.'
|
|
-sep = '\\'
|
|
+# Generally we prefer forwards slashes for MinGW-w64 Python,
|
|
+# but should probably defer to the C code and a set of #defines
|
|
+# with the following precedence and logic:
|
|
+# DIRSEP_MSYSTEM = If MSYSTEM env. var is set then / otherwise \.
|
|
+# DIRSEP_ARGV0 = Whichever of / and \ is more prevalent in argv0
|
|
+# (if equal DIRSEP_FORWARDS or DIRSEP_BACKWARDS)
|
|
+# DIRSEP_FORWARDS = Always /
|
|
+# DIRSEP_BACKWARDS = Always \
|
|
+# .. note, UNC paths are always converted to backslashes.
|
|
+if sys.platform == "win32" and "MSYSTEM" in os.environ:
|
|
+ sep = '/'
|
|
+ altsep = '\\'
|
|
+else:
|
|
+ sep = '\\'
|
|
+ altsep = '/'
|
|
pathsep = ';'
|
|
-altsep = '/'
|
|
defpath = '.;C:\\bin'
|
|
if 'ce' in sys.builtin_module_names:
|
|
defpath = '\\Windows'
|
|
@@ -60,7 +73,7 @@
|
|
|
|
# Join two (or more) paths.
|
|
def join(path, *paths):
|
|
- """Join two or more pathname components, inserting "\\" as needed."""
|
|
+ """Join two or more pathname components, inserting sep as needed."""
|
|
result_drive, result_path = splitdrive(path)
|
|
for p in paths:
|
|
p_drive, p_path = splitdrive(p)
|
|
@@ -80,7 +93,7 @@
|
|
result_drive = p_drive
|
|
# Second path is relative to the first
|
|
if result_path and result_path[-1] not in '\\/':
|
|
- result_path = result_path + '\\'
|
|
+ result_path = result_path + sep
|
|
result_path = result_path + p_path
|
|
## add separator between UNC and non-absolute path
|
|
if (result_path and result_path[0] not in '\\/' and
|
|
@@ -415,13 +428,19 @@
|
|
"""Normalize path, eliminating double slashes, etc."""
|
|
# Preserve unicode (if path is unicode)
|
|
backslash, dot = (u'\\', u'.') if isinstance(path, _unicode) else ('\\', '.')
|
|
+ isUNC = path.startswith('\\\\')
|
|
+ this_sep = sep
|
|
+ other_sep = altsep
|
|
+ if isUNC:
|
|
+ this_sep = backslash
|
|
+ other_sep = '/'
|
|
if path.startswith(('\\\\.\\', '\\\\?\\')):
|
|
# in the case of paths with these prefixes:
|
|
# \\.\ -> device names
|
|
# \\?\ -> literal paths
|
|
# do not do any normalization, but return the path unchanged
|
|
return path
|
|
- path = path.replace("/", "\\")
|
|
+ path = path.replace(other_sep, this_sep)
|
|
prefix, path = splitdrive(path)
|
|
# We need to be careful here. If the prefix is empty, and the path starts
|
|
# with a backslash, it could either be an absolute path on the current
|
|
@@ -434,15 +453,15 @@
|
|
# is any better behaviour for such edge cases.
|
|
if prefix == '':
|
|
# No drive letter - preserve initial backslashes
|
|
- while path[:1] == "\\":
|
|
- prefix = prefix + backslash
|
|
+ while path[:1] == this_sep:
|
|
+ prefix = prefix + this_sep
|
|
path = path[1:]
|
|
else:
|
|
# We have a drive letter - collapse initial backslashes
|
|
- if path.startswith("\\"):
|
|
- prefix = prefix + backslash
|
|
- path = path.lstrip("\\")
|
|
- comps = path.split("\\")
|
|
+ if path.startswith(sep):
|
|
+ prefix = prefix + this_sep
|
|
+ path = path.lstrip(this_sep)
|
|
+ comps = path.split(this_sep)
|
|
i = 0
|
|
while i < len(comps):
|
|
if comps[i] in ('.', ''):
|
|
@@ -451,7 +470,7 @@
|
|
if i > 0 and comps[i-1] != '..':
|
|
del comps[i-1:i+1]
|
|
i -= 1
|
|
- elif i == 0 and prefix.endswith("\\"):
|
|
+ elif i == 0 and prefix.endswith(this_sep):
|
|
del comps[i]
|
|
else:
|
|
i += 1
|
|
@@ -460,7 +479,7 @@
|
|
# If the path is now empty, substitute '.'
|
|
if not prefix and not comps:
|
|
comps.append(dot)
|
|
- return prefix + backslash.join(comps)
|
|
+ return prefix + this_sep.join(comps)
|
|
|
|
|
|
# Return an absolute path.
|
|
--- Python-2.7.10/Include/pythonrun.h.orig 2015-05-23 17:09:00.000000000 +0100
|
|
+++ Python-2.7.10/Include/pythonrun.h 2015-12-31 03:30:18.917684800 +0000
|
|
@@ -104,6 +104,7 @@
|
|
PyAPI_FUNC(char *) Py_GetPrefix(void);
|
|
PyAPI_FUNC(char *) Py_GetExecPrefix(void);
|
|
PyAPI_FUNC(char *) Py_GetPath(void);
|
|
+PyAPI_FUNC(void) Py_NormalizeSepsA(char *name);
|
|
|
|
/* In their own files */
|
|
PyAPI_FUNC(const char *) Py_GetVersion(void);
|
|
--- Python-2.7.10/Python/pythonrun.c.orig 2015-12-31 04:09:05.267647200 +0000
|
|
+++ Python-2.7.10/Python/pythonrun.c 2015-12-31 04:06:39.381327400 +0000
|
|
@@ -667,13 +667,67 @@
|
|
PyInterpreterState_Delete(interp);
|
|
}
|
|
|
|
-static char *progname = "python";
|
|
+ static char progname[PATH_MAX+1] = "python";
|
|
+
|
|
+char
|
|
+Py_GetSepA(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 wchar_t
|
|
+Py_GetAltSepA(char *name)
|
|
+{
|
|
+ char sep = Py_GetSepA(name);
|
|
+ if (sep == '/')
|
|
+ return '\\';
|
|
+ return '/';
|
|
+}
|
|
|
|
void
|
|
-Py_SetProgramName(char *pn)
|
|
+Py_NormalizeSepsA(char *name)
|
|
{
|
|
- if (pn && *pn)
|
|
- progname = pn;
|
|
+ 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);
|
|
+ }
|
|
+}
|
|
+
|
|
+ void
|
|
+ Py_SetProgramName(char *pn)
|
|
+ {
|
|
+ if (pn && *pn)
|
|
+ strncpy(progname, pn, PATH_MAX);
|
|
+ pn = &progname[0];
|
|
+ Py_NormalizeSepsA(pn);
|
|
}
|
|
|
|
char *
|
|
--- Python-2.7.10/Modules/posixmodule.c.orig 2015-12-31 04:14:46.133487100 +0000
|
|
+++ Python-2.7.10/Modules/posixmodule.c 2015-12-31 04:31:31.496990600 +0000
|
|
@@ -2220,6 +2220,8 @@
|
|
if (res == NULL)
|
|
return posix_error();
|
|
|
|
+ Py_NormalizeSepsA(tmpbuf);
|
|
+
|
|
dynamic_return = PyString_FromString(tmpbuf);
|
|
free(tmpbuf);
|
|
|
|
--- Python-2.7.11/Lib/ntpath.py.orig 2016-01-09 20:49:07.348817600 +0000
|
|
+++ Python-2.7.11/Lib/ntpath.py 2016-02-22 09:38:39.978263400 +0000
|
|
@@ -56,8 +56,8 @@
|
|
def normcase(s):
|
|
"""Normalize case of pathname.
|
|
|
|
- Makes all characters lowercase and all slashes into backslashes."""
|
|
- return s.replace("/", "\\").lower()
|
|
+ Makes all characters lowercase and all os.altsep into os.sep."""
|
|
+ return s.replace(os.altsep, os.sep).lower()
|
|
|
|
|
|
# Return whether a path is absolute.
|