MINGW-packages/mingw-w64-python3.13/0094-getpath-use-normpath-on-all-generated-paths.patch
Christoph Reiter 04c9ed3700 python3.13: Add 3.13.7
* add libb2 as dep
* remove "-Wl,--large-address-aware", default now via makepkg
* remove 2to3 logic, no longer in Python
2025-09-08 22:02:30 +02:00

155 lines
5.4 KiB
Diff

From 6815a707352d42f06ba8f16694b698221ddc5d73 Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Fri, 28 Jul 2023 20:13:58 +0200
Subject: [PATCH 094/N] getpath: use normpath on all generated paths
Instead of just calling normpath in abspath just call normpath
on all the config results. This makes sure we don't change getpath.py
too much and still cover all outputs.
This fixes sys.exec_prefix not matching sys.prefix, see
https://github.com/msys2-contrib/cpython-mingw/issues/142
---
Lib/test/test_getpath.py | 6 ++++++
Modules/getpath.c | 21 ++++++++++++++++++++-
Modules/getpath.py | 30 ++++++++++++++++--------------
3 files changed, 42 insertions(+), 15 deletions(-)
diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py
index 0c4ab74..f43877b 100644
--- a/Lib/test/test_getpath.py
+++ b/Lib/test/test_getpath.py
@@ -928,6 +928,9 @@ class MockNTNamespace(dict):
except AttributeError:
raise KeyError(key) from None
+ def normpath(self, path):
+ return ntpath.normpath(path)
+
def abspath(self, path):
if self.isabs(path):
return path
@@ -1106,6 +1109,9 @@ class MockPosixNamespace(dict):
except AttributeError:
raise KeyError(key) from None
+ def normpath(self, path):
+ return path
+
def abspath(self, path):
if self.isabs(path):
return path
diff --git a/Modules/getpath.c b/Modules/getpath.c
index 59a57fb..cf3fbdd 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -57,6 +57,25 @@
/* HELPER FUNCTIONS for getpath.py */
+static PyObject *
+getpath_normpath(PyObject *Py_UNUSED(self), PyObject *args)
+{
+ PyObject *r = NULL;
+ PyObject *pathobj;
+ wchar_t *path;
+ if (!PyArg_ParseTuple(args, "U", &pathobj)) {
+ return NULL;
+ }
+ Py_ssize_t len;
+ wchar_t *buffer = PyUnicode_AsWideCharString(pathobj, &len);
+ if (!buffer) {
+ return NULL;
+ }
+ r = PyUnicode_FromWideChar(_Py_normpath(buffer, len), -1);
+ PyMem_Free(buffer);
+ return r;
+}
+
static PyObject *
getpath_abspath(PyObject *Py_UNUSED(self), PyObject *args)
{
@@ -71,7 +90,6 @@ getpath_abspath(PyObject *Py_UNUSED(self), PyObject *args)
if (path) {
wchar_t *abs;
if (_Py_abspath((const wchar_t *)_Py_normpath(path, -1), &abs) == 0 && abs) {
- abs = _Py_normpath(abs, -1);
r = PyUnicode_FromWideChar(abs, -1);
PyMem_RawFree((void *)abs);
} else {
@@ -574,6 +592,7 @@ done:
static PyMethodDef getpath_methods[] = {
+ {"normpath", getpath_normpath, METH_VARARGS, NULL},
{"abspath", getpath_abspath, METH_VARARGS, NULL},
{"basename", getpath_basename, METH_VARARGS, NULL},
{"dirname", getpath_dirname, METH_VARARGS, NULL},
diff --git a/Modules/getpath.py b/Modules/getpath.py
index 3adcf04..e743161 100644
--- a/Modules/getpath.py
+++ b/Modules/getpath.py
@@ -235,6 +235,8 @@ def search_up(prefix, *landmarks, test=isfile):
return prefix
prefix = dirname(prefix)
+def _normpath(p):
+ return normpath(p) if p is not None else None
# ******************************************************************************
# READ VARIABLES FROM config
@@ -678,7 +680,7 @@ else:
if py_setpath:
# If Py_SetPath was called then it overrides any existing search path
- config['module_search_paths'] = py_setpath.split(DELIM)
+ config['module_search_paths'] = [_normpath(p) for p in py_setpath.split(DELIM)]
config['module_search_paths_set'] = 1
elif not pythonpath_was_set:
@@ -765,7 +767,7 @@ elif not pythonpath_was_set:
if platstdlib_dir:
pythonpath.append(platstdlib_dir)
- config['module_search_paths'] = pythonpath
+ config['module_search_paths'] = [_normpath(p) for p in pythonpath]
config['module_search_paths_set'] = 1
@@ -800,23 +802,23 @@ if pth:
warn("unsupported 'import' line in ._pth file")
else:
pythonpath.append(joinpath(pth_dir, line))
- config['module_search_paths'] = pythonpath
+ config['module_search_paths'] = [_normpath(p) for p in pythonpath]
config['module_search_paths_set'] = 1
# ******************************************************************************
# UPDATE config FROM CALCULATED VALUES
# ******************************************************************************
-config['program_name'] = program_name
-config['home'] = home
-config['executable'] = executable
-config['base_executable'] = base_executable
-config['prefix'] = prefix
-config['exec_prefix'] = exec_prefix
-config['base_prefix'] = base_prefix or prefix
-config['base_exec_prefix'] = base_exec_prefix or exec_prefix
+config['program_name'] = _normpath(program_name)
+config['home'] = _normpath(home)
+config['executable'] = _normpath(executable)
+config['base_executable'] = _normpath(base_executable)
+config['prefix'] = _normpath(prefix)
+config['exec_prefix'] = _normpath(exec_prefix)
+config['base_prefix'] = _normpath(base_prefix or prefix)
+config['base_exec_prefix'] = _normpath(base_exec_prefix or exec_prefix)
-config['platlibdir'] = platlibdir
+config['platlibdir'] = _normpath(platlibdir)
# test_embed expects empty strings, not None
-config['stdlib_dir'] = stdlib_dir or ''
-config['platstdlib_dir'] = platstdlib_dir or ''
+config['stdlib_dir'] = _normpath(stdlib_dir or '')
+config['platstdlib_dir'] = _normpath(platstdlib_dir or '')