!16 upgrade python3 from 3.7.4 to 3.8.3
Merge pull request !16 from hanxinke/master
This commit is contained in:
commit
5ef018e110
@ -1,5 +1,5 @@
|
|||||||
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
|
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
|
||||||
index 0258d3d..4b969bf 100644
|
index c625c95..ae4f915 100644
|
||||||
--- a/Lib/distutils/command/install.py
|
--- a/Lib/distutils/command/install.py
|
||||||
+++ b/Lib/distutils/command/install.py
|
+++ b/Lib/distutils/command/install.py
|
||||||
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
|
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
|
||||||
@ -20,10 +20,10 @@ index 0258d3d..4b969bf 100644
|
|||||||
'scripts': '$base/bin',
|
'scripts': '$base/bin',
|
||||||
'data' : '$base',
|
'data' : '$base',
|
||||||
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
|
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
|
||||||
index e07a6c8..554740d 100644
|
index b51629e..9a4892a 100644
|
||||||
--- a/Lib/distutils/sysconfig.py
|
--- a/Lib/distutils/sysconfig.py
|
||||||
+++ b/Lib/distutils/sysconfig.py
|
+++ b/Lib/distutils/sysconfig.py
|
||||||
@@ -129,8 +129,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
@@ -146,8 +146,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||||
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
||||||
|
|
||||||
if os.name == "posix":
|
if os.name == "posix":
|
||||||
@ -53,10 +53,10 @@ index 287ab19..d4c05e0 100644
|
|||||||
check_path(cmd.install_headers,
|
check_path(cmd.install_headers,
|
||||||
os.path.join(destination, "include", "python", "foopkg"))
|
os.path.join(destination, "include", "python", "foopkg"))
|
||||||
diff --git a/Lib/site.py b/Lib/site.py
|
diff --git a/Lib/site.py b/Lib/site.py
|
||||||
index 7dc1b04..85016b4 100644
|
index a065ab0..22d53fa 100644
|
||||||
--- a/Lib/site.py
|
--- a/Lib/site.py
|
||||||
+++ b/Lib/site.py
|
+++ b/Lib/site.py
|
||||||
@@ -334,11 +334,15 @@ def getsitepackages(prefixes=None):
|
@@ -335,11 +335,15 @@ def getsitepackages(prefixes=None):
|
||||||
seen.add(prefix)
|
seen.add(prefix)
|
||||||
|
|
||||||
if os.sep == '/':
|
if os.sep == '/':
|
||||||
@ -73,7 +73,7 @@ index 7dc1b04..85016b4 100644
|
|||||||
return sitepackages
|
return sitepackages
|
||||||
|
|
||||||
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
|
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
|
||||||
index 9ee4d31..53c8606 100644
|
index b9e2faf..0ae6d35 100644
|
||||||
--- a/Lib/sysconfig.py
|
--- a/Lib/sysconfig.py
|
||||||
+++ b/Lib/sysconfig.py
|
+++ b/Lib/sysconfig.py
|
||||||
@@ -20,10 +20,10 @@ __all__ = [
|
@@ -20,10 +20,10 @@ __all__ = [
|
||||||
@ -105,10 +105,10 @@ index 9ee4d31..53c8606 100644
|
|||||||
'scripts': '{userbase}/bin',
|
'scripts': '{userbase}/bin',
|
||||||
'data': '{userbase}',
|
'data': '{userbase}',
|
||||||
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
|
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
|
||||||
index 266adf0..e8513b6 100644
|
index 1bbc697..9a7e80d 100644
|
||||||
--- a/Lib/test/test_site.py
|
--- a/Lib/test/test_site.py
|
||||||
+++ b/Lib/test/test_site.py
|
+++ b/Lib/test/test_site.py
|
||||||
@@ -275,8 +275,8 @@ class HelperFunctionsTests(unittest.TestCase):
|
@@ -267,8 +267,8 @@ class HelperFunctionsTests(unittest.TestCase):
|
||||||
dirs = site.getsitepackages()
|
dirs = site.getsitepackages()
|
||||||
if os.sep == '/':
|
if os.sep == '/':
|
||||||
# OS X, Linux, FreeBSD, etc
|
# OS X, Linux, FreeBSD, etc
|
||||||
@ -120,10 +120,10 @@ index 266adf0..e8513b6 100644
|
|||||||
'site-packages')
|
'site-packages')
|
||||||
self.assertEqual(dirs[0], wanted)
|
self.assertEqual(dirs[0], wanted)
|
||||||
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||||
index 59ba9d4..5780ed8 100644
|
index a914a9c..406a441 100644
|
||||||
--- a/Makefile.pre.in
|
--- a/Makefile.pre.in
|
||||||
+++ b/Makefile.pre.in
|
+++ b/Makefile.pre.in
|
||||||
@@ -133,7 +133,7 @@ LIBDIR= @libdir@
|
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
|
||||||
MANDIR= @mandir@
|
MANDIR= @mandir@
|
||||||
INCLUDEDIR= @includedir@
|
INCLUDEDIR= @includedir@
|
||||||
CONFINCLUDEDIR= $(exec_prefix)/include
|
CONFINCLUDEDIR= $(exec_prefix)/include
|
||||||
@ -133,29 +133,29 @@ index 59ba9d4..5780ed8 100644
|
|||||||
|
|
||||||
# Detailed destination directories
|
# Detailed destination directories
|
||||||
diff --git a/Modules/getpath.c b/Modules/getpath.c
|
diff --git a/Modules/getpath.c b/Modules/getpath.c
|
||||||
index 85e737b..2a1fc79 100644
|
index b727f66..a0c5fb6 100644
|
||||||
--- a/Modules/getpath.c
|
--- a/Modules/getpath.c
|
||||||
+++ b/Modules/getpath.c
|
+++ b/Modules/getpath.c
|
||||||
@@ -500,7 +500,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
|
@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig,
|
||||||
"Could not find platform dependent libraries <exec_prefix>\n");
|
if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) {
|
||||||
|
return PATHLEN_ERR();
|
||||||
|
}
|
||||||
|
- status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len);
|
||||||
|
+ status = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len);
|
||||||
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix,
|
||||||
|
return PATHLEN_ERR();
|
||||||
}
|
}
|
||||||
wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN);
|
|
||||||
- joinpath(exec_prefix, L"lib/lib-dynload");
|
|
||||||
+ joinpath(exec_prefix, L"lib64/lib-dynload");
|
|
||||||
}
|
}
|
||||||
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
|
- status = joinpath(zip_path, L"lib/python00.zip", zip_path_len);
|
||||||
}
|
+ status = joinpath(zip_path, L"lib64/python00.zip", zip_path_len);
|
||||||
@@ -742,7 +742,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix)
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
else {
|
return status;
|
||||||
wcsncpy(calculate->zip_path, calculate->prefix, MAXPATHLEN);
|
|
||||||
}
|
}
|
||||||
- joinpath(calculate->zip_path, L"lib/python00.zip");
|
@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config)
|
||||||
+ joinpath(calculate->zip_path, L"lib64/python00.zip");
|
if (!calculate->exec_prefix) {
|
||||||
|
|
||||||
/* Replace "00" with version */
|
|
||||||
size_t bufsz = wcslen(calculate->zip_path);
|
|
||||||
@@ -867,7 +867,7 @@ calculate_init(PyCalculatePath *calculate,
|
|
||||||
if (!calculate->prefix) {
|
|
||||||
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||||
}
|
}
|
||||||
- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
|
- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
|
||||||
@ -163,30 +163,65 @@ index 85e737b..2a1fc79 100644
|
|||||||
if (!calculate->lib_python) {
|
if (!calculate->lib_python) {
|
||||||
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||||
}
|
}
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 8886561..78867c6 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -15214,9 +15214,9 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index d8de9d4..477a5ff 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -4689,9 +4689,9 @@ fi
|
||||||
|
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
|
||||||
|
AC_SUBST(PY_ENABLE_SHARED)
|
||||||
|
if test x$PLATFORM_TRIPLET = x; then
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||||
|
else
|
||||||
|
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||||
|
fi
|
||||||
|
AC_SUBST(LIBPL)
|
||||||
|
|
||||||
diff --git a/setup.py b/setup.py
|
diff --git a/setup.py b/setup.py
|
||||||
index f1933f7..450cd8a 100644
|
index b168ed4..8628b9d 100644
|
||||||
--- a/setup.py
|
--- a/setup.py
|
||||||
+++ b/setup.py
|
+++ b/setup.py
|
||||||
@@ -531,7 +531,7 @@ class PyBuildExt(build_ext):
|
@@ -649,7 +649,7 @@ class PyBuildExt(build_ext):
|
||||||
# directories (i.e. '.' and 'Include') must be first. See issue
|
# directories (i.e. '.' and 'Include') must be first. See issue
|
||||||
# 10520.
|
# 10520.
|
||||||
if not cross_compiling:
|
if not CROSS_COMPILING:
|
||||||
- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
||||||
+ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64')
|
+ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64')
|
||||||
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
||||||
# only change this for cross builds for 3.3, issues on Mageia
|
# only change this for cross builds for 3.3, issues on Mageia
|
||||||
if cross_compiling:
|
if CROSS_COMPILING:
|
||||||
@@ -830,11 +830,11 @@ class PyBuildExt(build_ext):
|
@@ -953,11 +953,11 @@ class PyBuildExt(build_ext):
|
||||||
elif curses_library:
|
elif curses_library:
|
||||||
readline_libs.append(curses_library)
|
readline_libs.append(curses_library)
|
||||||
elif self.compiler.find_library_file(lib_dirs +
|
elif self.compiler.find_library_file(self.lib_dirs +
|
||||||
- ['/usr/lib/termcap'],
|
- ['/usr/lib/termcap'],
|
||||||
+ ['/usr/lib64/termcap'],
|
+ ['/usr/lib64/termcap'],
|
||||||
'termcap'):
|
'termcap'):
|
||||||
readline_libs.append('termcap')
|
readline_libs.append('termcap')
|
||||||
exts.append( Extension('readline', ['readline.c'],
|
self.add(Extension('readline', ['readline.c'],
|
||||||
- library_dirs=['/usr/lib/termcap'],
|
- library_dirs=['/usr/lib/termcap'],
|
||||||
+ library_dirs=['/usr/lib64/termcap'],
|
+ library_dirs=['/usr/lib64/termcap'],
|
||||||
extra_link_args=readline_extra_link_args,
|
extra_link_args=readline_extra_link_args,
|
||||||
libraries=readline_libs) )
|
libraries=readline_libs))
|
||||||
else:
|
else:
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
|
|||||||
@ -1,17 +1,17 @@
|
|||||||
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||||
index 0db0dd0..bd8f769 100644
|
index 406a441..917303d 100644
|
||||||
--- a/Makefile.pre.in
|
--- a/Makefile.pre.in
|
||||||
+++ b/Makefile.pre.in
|
+++ b/Makefile.pre.in
|
||||||
@@ -574,7 +574,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
|
@@ -562,7 +562,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
|
||||||
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
|
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
|
||||||
|
|
||||||
# Build the interpreter
|
# Build the interpreter
|
||||||
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
||||||
+$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
|
+$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
|
||||||
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS)
|
||||||
|
|
||||||
platform: $(BUILDPYTHON) pybuilddir.txt
|
platform: $(BUILDPYTHON) pybuilddir.txt
|
||||||
@@ -622,12 +622,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
|
@@ -610,12 +610,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
|
||||||
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
|
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
|
||||||
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
|
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
|
||||||
|
|
||||||
@ -21,19 +21,19 @@ index 0db0dd0..bd8f769 100644
|
|||||||
- -rm -f $@
|
- -rm -f $@
|
||||||
- $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS)
|
- $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS)
|
||||||
-
|
-
|
||||||
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
|
libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
|
||||||
if test $(INSTSONAME) != $(LDLIBRARY); then \
|
if test $(INSTSONAME) != $(LDLIBRARY); then \
|
||||||
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
|
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM); \
|
||||||
@@ -715,7 +709,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
|
@@ -693,7 +687,7 @@ Makefile Modules/config.c: Makefile.pre \
|
||||||
echo "-----------------------------------------------"; \
|
@echo "The Makefile was updated, you may need to re-run make."
|
||||||
fi
|
|
||||||
|
|
||||||
-Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
-Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
||||||
+Programs/_testembed: Programs/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
|
+Programs/_testembed: Programs/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
|
||||||
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS)
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
@@ -1483,17 +1477,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
|
@@ -1557,17 +1551,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
|
||||||
else true; \
|
else true; \
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
@ -51,3 +51,6 @@ index 0db0dd0..bd8f769 100644
|
|||||||
$(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
|
$(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
|
||||||
$(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o
|
$(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o
|
||||||
$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
|
$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,20 @@
|
|||||||
diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python-3.2.2/Lib/unittest/case.py
|
diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py
|
||||||
--- Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest 2011-09-03 12:16:44.000000000 -0400
|
index ace3a6f..a3f76a1 100644
|
||||||
+++ Python-3.2.2/Lib/unittest/case.py 2011-09-09 06:35:16.365568382 -0400
|
--- a/Lib/unittest/__init__.py
|
||||||
|
+++ b/Lib/unittest/__init__.py
|
||||||
|
@@ -59,7 +59,7 @@ __unittest = True
|
||||||
|
from .result import TestResult
|
||||||
|
from .async_case import IsolatedAsyncioTestCase
|
||||||
|
from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip,
|
||||||
|
- skipIf, skipUnless, expectedFailure)
|
||||||
|
+ skipIf, skipUnless, expectedFailure, _skipInRpmBuild)
|
||||||
|
from .suite import BaseTestSuite, TestSuite
|
||||||
|
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
|
||||||
|
findTestCases)
|
||||||
|
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
|
||||||
|
index e5734b6..b641710 100644
|
||||||
|
--- a/Lib/unittest/case.py
|
||||||
|
+++ b/Lib/unittest/case.py
|
||||||
@@ -3,6 +3,7 @@
|
@@ -3,6 +3,7 @@
|
||||||
import sys
|
import sys
|
||||||
import functools
|
import functools
|
||||||
@ -9,9 +23,10 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
|
|||||||
import logging
|
import logging
|
||||||
import pprint
|
import pprint
|
||||||
import re
|
import re
|
||||||
@@ -101,5 +102,21 @@ def expectedFailure(func):
|
@@ -163,6 +164,22 @@ class _BaseTestCaseContext:
|
||||||
|
msg = self.test_case._formatMessage(self.msg, standardMsg)
|
||||||
raise self.test_case.failureException(msg)
|
raise self.test_case.failureException(msg)
|
||||||
|
|
||||||
+# Non-standard/downstream-only hooks for handling issues with specific test
|
+# Non-standard/downstream-only hooks for handling issues with specific test
|
||||||
+# cases:
|
+# cases:
|
||||||
+
|
+
|
||||||
@ -29,18 +44,5 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
|
|||||||
+ return _id
|
+ return _id
|
||||||
+
|
+
|
||||||
class _AssertRaisesBaseContext(_BaseTestCaseContext):
|
class _AssertRaisesBaseContext(_BaseTestCaseContext):
|
||||||
|
|
||||||
def __init__(self, expected, test_case, expected_regex=None):
|
def __init__(self, expected, test_case, expected_regex=None):
|
||||||
diff -up Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest Python-3.2.2/Lib/unittest/__init__.py
|
|
||||||
--- Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest 2011-09-03 12:16:44.000000000 -0400
|
|
||||||
+++ Python-3.2.2/Lib/unittest/__init__.py 2011-09-09 06:35:16.366568382 -0400
|
|
||||||
@@ -57,7 +57,8 @@ __unittest = True
|
|
||||||
|
|
||||||
from .result import TestResult
|
|
||||||
from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
|
|
||||||
- skipUnless, expectedFailure)
|
|
||||||
+ skipUnless, expectedFailure,
|
|
||||||
+ _skipInRpmBuild)
|
|
||||||
from .suite import BaseTestSuite, TestSuite
|
|
||||||
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
|
|
||||||
findTestCases)
|
|
||||||
|
|||||||
@ -1,15 +0,0 @@
|
|||||||
diff -up Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 Python-3.2.3/Lib/ctypes/__init__.py
|
|
||||||
--- Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 2012-04-20 15:12:49.017867692 -0400
|
|
||||||
+++ Python-3.2.3/Lib/ctypes/__init__.py 2012-04-20 15:15:09.501111408 -0400
|
|
||||||
@@ -275,11 +275,6 @@ def _reset_cache():
|
|
||||||
# _SimpleCData.c_char_p_from_param
|
|
||||||
POINTER(c_char).from_param = c_char_p.from_param
|
|
||||||
_pointer_type_cache[None] = c_void_p
|
|
||||||
- # XXX for whatever reasons, creating the first instance of a callback
|
|
||||||
- # function is needed for the unittests on Win64 to succeed. This MAY
|
|
||||||
- # be a compiler bug, since the problem occurs only when _ctypes is
|
|
||||||
- # compiled with the MS SDK compiler. Or an uninitialized variable?
|
|
||||||
- CFUNCTYPE(c_int)(lambda: None)
|
|
||||||
|
|
||||||
def create_unicode_buffer(init, size=None):
|
|
||||||
"""create_unicode_buffer(aString) -> character array
|
|
||||||
@ -1,311 +0,0 @@
|
|||||||
diff --git a/Include/object.h b/Include/object.h
|
|
||||||
index c772dea..5729797 100644
|
|
||||||
--- a/Include/object.h
|
|
||||||
+++ b/Include/object.h
|
|
||||||
@@ -1098,6 +1098,49 @@ PyAPI_FUNC(void)
|
|
||||||
_PyObject_DebugTypeStats(FILE *out);
|
|
||||||
#endif /* ifndef Py_LIMITED_API */
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ Define a pair of assertion macros.
|
|
||||||
+
|
|
||||||
+ These work like the regular C assert(), in that they will abort the
|
|
||||||
+ process with a message on stderr if the given condition fails to hold,
|
|
||||||
+ but compile away to nothing if NDEBUG is defined.
|
|
||||||
+
|
|
||||||
+ However, before aborting, Python will also try to call _PyObject_Dump() on
|
|
||||||
+ the given object. This may be of use when investigating bugs in which a
|
|
||||||
+ particular object is corrupt (e.g. buggy a tp_visit method in an extension
|
|
||||||
+ module breaking the garbage collector), to help locate the broken objects.
|
|
||||||
+
|
|
||||||
+ The WITH_MSG variant allows you to supply an additional message that Python
|
|
||||||
+ will attempt to print to stderr, after the object dump.
|
|
||||||
+*/
|
|
||||||
+#ifdef NDEBUG
|
|
||||||
+/* No debugging: compile away the assertions: */
|
|
||||||
+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) ((void)0)
|
|
||||||
+#else
|
|
||||||
+/* With debugging: generate checks: */
|
|
||||||
+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
|
|
||||||
+ ((expr) \
|
|
||||||
+ ? (void)(0) \
|
|
||||||
+ : _PyObject_AssertFailed((obj), \
|
|
||||||
+ (msg), \
|
|
||||||
+ (__STRING(expr)), \
|
|
||||||
+ (__FILE__), \
|
|
||||||
+ (__LINE__), \
|
|
||||||
+ (__PRETTY_FUNCTION__)))
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+#define PyObject_ASSERT(obj, expr) \
|
|
||||||
+ PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ Declare and define the entrypoint even when NDEBUG is defined, to avoid
|
|
||||||
+ causing compiler/linker errors when building extensions without NDEBUG
|
|
||||||
+ against a Python built with NDEBUG defined
|
|
||||||
+*/
|
|
||||||
+PyAPI_FUNC(void) _PyObject_AssertFailed(PyObject *, const char *,
|
|
||||||
+ const char *, const char *, int,
|
|
||||||
+ const char *);
|
|
||||||
+
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
|
|
||||||
index 8d806db..dc8bb16 100644
|
|
||||||
--- a/Lib/test/test_gc.py
|
|
||||||
+++ b/Lib/test/test_gc.py
|
|
||||||
@@ -1,10 +1,12 @@
|
|
||||||
import unittest
|
|
||||||
from test.support import (verbose, refcount_test, run_unittest,
|
|
||||||
strip_python_stderr, cpython_only, start_threads,
|
|
||||||
- temp_dir, requires_type_collecting, TESTFN, unlink)
|
|
||||||
+ temp_dir, requires_type_collecting, TESTFN, unlink,
|
|
||||||
+ import_module)
|
|
||||||
from test.support.script_helper import assert_python_ok, make_script
|
|
||||||
|
|
||||||
import sys
|
|
||||||
+import sysconfig
|
|
||||||
import time
|
|
||||||
import gc
|
|
||||||
import weakref
|
|
||||||
@@ -46,6 +48,8 @@ class GC_Detector(object):
|
|
||||||
# gc collects it.
|
|
||||||
self.wr = weakref.ref(C1055820(666), it_happened)
|
|
||||||
|
|
||||||
+BUILD_WITH_NDEBUG = ('-DNDEBUG' in sysconfig.get_config_vars()['PY_CFLAGS'])
|
|
||||||
+
|
|
||||||
@with_tp_del
|
|
||||||
class Uncollectable(object):
|
|
||||||
"""Create a reference cycle with multiple __del__ methods.
|
|
||||||
@@ -878,6 +882,50 @@ class GCCallbackTests(unittest.TestCase):
|
|
||||||
self.assertEqual(len(gc.garbage), 0)
|
|
||||||
|
|
||||||
|
|
||||||
+ @unittest.skipIf(BUILD_WITH_NDEBUG,
|
|
||||||
+ 'built with -NDEBUG')
|
|
||||||
+ def test_refcount_errors(self):
|
|
||||||
+ self.preclean()
|
|
||||||
+ # Verify the "handling" of objects with broken refcounts
|
|
||||||
+ import_module("ctypes") #skip if not supported
|
|
||||||
+
|
|
||||||
+ import subprocess
|
|
||||||
+ code = '''if 1:
|
|
||||||
+ a = []
|
|
||||||
+ b = [a]
|
|
||||||
+
|
|
||||||
+ # Simulate the refcount of "a" being too low (compared to the
|
|
||||||
+ # references held on it by live data), but keeping it above zero
|
|
||||||
+ # (to avoid deallocating it):
|
|
||||||
+ import ctypes
|
|
||||||
+ ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
|
|
||||||
+
|
|
||||||
+ # The garbage collector should now have a fatal error when it reaches
|
|
||||||
+ # the broken object:
|
|
||||||
+ import gc
|
|
||||||
+ gc.collect()
|
|
||||||
+ '''
|
|
||||||
+ p = subprocess.Popen([sys.executable, "-c", code],
|
|
||||||
+ stdout=subprocess.PIPE,
|
|
||||||
+ stderr=subprocess.PIPE)
|
|
||||||
+ stdout, stderr = p.communicate()
|
|
||||||
+ p.stdout.close()
|
|
||||||
+ p.stderr.close()
|
|
||||||
+ # Verify that stderr has a useful error message:
|
|
||||||
+ self.assertRegex(stderr,
|
|
||||||
+ b'Modules/gcmodule.c:[0-9]+: visit_decref: Assertion "\(\(gc\)->gc.gc_refs >> \(1\)\) != 0" failed.')
|
|
||||||
+ self.assertRegex(stderr,
|
|
||||||
+ b'refcount was too small')
|
|
||||||
+ self.assertRegex(stderr,
|
|
||||||
+ b'object : \[\]')
|
|
||||||
+ self.assertRegex(stderr,
|
|
||||||
+ b'type : list')
|
|
||||||
+ self.assertRegex(stderr,
|
|
||||||
+ b'refcount: 1')
|
|
||||||
+ self.assertRegex(stderr,
|
|
||||||
+ b'address : 0x[0-9a-f]+')
|
|
||||||
+
|
|
||||||
+
|
|
||||||
class GCTogglingTests(unittest.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
gc.enable()
|
|
||||||
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
|
|
||||||
index 4d701cb..388dd78 100644
|
|
||||||
--- a/Modules/gcmodule.c
|
|
||||||
+++ b/Modules/gcmodule.c
|
|
||||||
@@ -239,7 +239,8 @@ update_refs(PyGC_Head *containers)
|
|
||||||
{
|
|
||||||
PyGC_Head *gc = containers->gc.gc_next;
|
|
||||||
for (; gc != containers; gc = gc->gc.gc_next) {
|
|
||||||
- assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
|
|
||||||
+ PyObject_ASSERT(FROM_GC(gc),
|
|
||||||
+ _PyGCHead_REFS(gc) == GC_REACHABLE);
|
|
||||||
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
|
|
||||||
/* Python's cyclic gc should never see an incoming refcount
|
|
||||||
* of 0: if something decref'ed to 0, it should have been
|
|
||||||
@@ -259,7 +260,8 @@ update_refs(PyGC_Head *containers)
|
|
||||||
* so serious that maybe this should be a release-build
|
|
||||||
* check instead of an assert?
|
|
||||||
*/
|
|
||||||
- assert(_PyGCHead_REFS(gc) != 0);
|
|
||||||
+ PyObject_ASSERT(FROM_GC(gc),
|
|
||||||
+ _PyGCHead_REFS(gc) != 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -274,7 +276,9 @@ visit_decref(PyObject *op, void *data)
|
|
||||||
* generation being collected, which can be recognized
|
|
||||||
* because only they have positive gc_refs.
|
|
||||||
*/
|
|
||||||
- assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
|
|
||||||
+ PyObject_ASSERT_WITH_MSG(FROM_GC(gc),
|
|
||||||
+ _PyGCHead_REFS(gc) != 0,
|
|
||||||
+ "refcount was too small"); /* else refcount was too small */
|
|
||||||
if (_PyGCHead_REFS(gc) > 0)
|
|
||||||
_PyGCHead_DECREF(gc);
|
|
||||||
}
|
|
||||||
@@ -334,9 +338,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
|
|
||||||
* If gc_refs == GC_UNTRACKED, it must be ignored.
|
|
||||||
*/
|
|
||||||
else {
|
|
||||||
- assert(gc_refs > 0
|
|
||||||
- || gc_refs == GC_REACHABLE
|
|
||||||
- || gc_refs == GC_UNTRACKED);
|
|
||||||
+ PyObject_ASSERT(FROM_GC(gc),
|
|
||||||
+ gc_refs > 0
|
|
||||||
+ || gc_refs == GC_REACHABLE
|
|
||||||
+ || gc_refs == GC_UNTRACKED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
@@ -378,7 +383,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
|
|
||||||
*/
|
|
||||||
PyObject *op = FROM_GC(gc);
|
|
||||||
traverseproc traverse = Py_TYPE(op)->tp_traverse;
|
|
||||||
- assert(_PyGCHead_REFS(gc) > 0);
|
|
||||||
+ PyObject_ASSERT(op, _PyGCHead_REFS(gc) > 0);
|
|
||||||
_PyGCHead_SET_REFS(gc, GC_REACHABLE);
|
|
||||||
(void) traverse(op,
|
|
||||||
(visitproc)visit_reachable,
|
|
||||||
@@ -441,7 +446,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
|
|
||||||
for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
|
|
||||||
PyObject *op = FROM_GC(gc);
|
|
||||||
|
|
||||||
- assert(IS_TENTATIVELY_UNREACHABLE(op));
|
|
||||||
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
|
|
||||||
next = gc->gc.gc_next;
|
|
||||||
|
|
||||||
if (has_legacy_finalizer(op)) {
|
|
||||||
@@ -517,7 +522,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
|
||||||
PyWeakReference **wrlist;
|
|
||||||
|
|
||||||
op = FROM_GC(gc);
|
|
||||||
- assert(IS_TENTATIVELY_UNREACHABLE(op));
|
|
||||||
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
|
|
||||||
next = gc->gc.gc_next;
|
|
||||||
|
|
||||||
if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
|
|
||||||
@@ -538,9 +543,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
|
||||||
* the callback pointer intact. Obscure: it also
|
|
||||||
* changes *wrlist.
|
|
||||||
*/
|
|
||||||
- assert(wr->wr_object == op);
|
|
||||||
+ PyObject_ASSERT(wr->wr_object, wr->wr_object == op);
|
|
||||||
_PyWeakref_ClearRef(wr);
|
|
||||||
- assert(wr->wr_object == Py_None);
|
|
||||||
+ PyObject_ASSERT(wr->wr_object, wr->wr_object == Py_None);
|
|
||||||
if (wr->wr_callback == NULL)
|
|
||||||
continue; /* no callback */
|
|
||||||
|
|
||||||
@@ -574,7 +579,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
|
||||||
*/
|
|
||||||
if (IS_TENTATIVELY_UNREACHABLE(wr))
|
|
||||||
continue;
|
|
||||||
- assert(IS_REACHABLE(wr));
|
|
||||||
+ PyObject_ASSERT(op, IS_REACHABLE(wr));
|
|
||||||
|
|
||||||
/* Create a new reference so that wr can't go away
|
|
||||||
* before we can process it again.
|
|
||||||
@@ -583,7 +588,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
|
||||||
|
|
||||||
/* Move wr to wrcb_to_call, for the next pass. */
|
|
||||||
wrasgc = AS_GC(wr);
|
|
||||||
- assert(wrasgc != next); /* wrasgc is reachable, but
|
|
||||||
+ PyObject_ASSERT(op, wrasgc != next);
|
|
||||||
+ /* wrasgc is reachable, but
|
|
||||||
next isn't, so they can't
|
|
||||||
be the same */
|
|
||||||
gc_list_move(wrasgc, &wrcb_to_call);
|
|
||||||
@@ -599,11 +605,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
|
||||||
|
|
||||||
gc = wrcb_to_call.gc.gc_next;
|
|
||||||
op = FROM_GC(gc);
|
|
||||||
- assert(IS_REACHABLE(op));
|
|
||||||
- assert(PyWeakref_Check(op));
|
|
||||||
+ PyObject_ASSERT(op, IS_REACHABLE(op));
|
|
||||||
+ PyObject_ASSERT(op, PyWeakref_Check(op));
|
|
||||||
wr = (PyWeakReference *)op;
|
|
||||||
callback = wr->wr_callback;
|
|
||||||
- assert(callback != NULL);
|
|
||||||
+ PyObject_ASSERT(op, callback != NULL);
|
|
||||||
|
|
||||||
/* copy-paste of weakrefobject.c's handle_callback() */
|
|
||||||
temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
|
|
||||||
@@ -717,12 +723,14 @@ check_garbage(PyGC_Head *collectable)
|
|
||||||
for (gc = collectable->gc.gc_next; gc != collectable;
|
|
||||||
gc = gc->gc.gc_next) {
|
|
||||||
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
|
|
||||||
- assert(_PyGCHead_REFS(gc) != 0);
|
|
||||||
+ PyObject_ASSERT(FROM_GC(gc),
|
|
||||||
+ _PyGCHead_REFS(gc) != 0);
|
|
||||||
}
|
|
||||||
subtract_refs(collectable);
|
|
||||||
for (gc = collectable->gc.gc_next; gc != collectable;
|
|
||||||
gc = gc->gc.gc_next) {
|
|
||||||
- assert(_PyGCHead_REFS(gc) >= 0);
|
|
||||||
+ PyObject_ASSERT(FROM_GC(gc),
|
|
||||||
+ _PyGCHead_REFS(gc) >= 0);
|
|
||||||
if (_PyGCHead_REFS(gc) != 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
diff --git a/Objects/object.c b/Objects/object.c
|
|
||||||
index 220aa90..f6c7161 100644
|
|
||||||
--- a/Objects/object.c
|
|
||||||
+++ b/Objects/object.c
|
|
||||||
@@ -2177,6 +2177,35 @@ _PyTrash_thread_destroy_chain(void)
|
|
||||||
--tstate->trash_delete_nesting;
|
|
||||||
}
|
|
||||||
|
|
||||||
+PyAPI_FUNC(void)
|
|
||||||
+_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
|
|
||||||
+ const char *file, int line, const char *function)
|
|
||||||
+{
|
|
||||||
+ fprintf(stderr,
|
|
||||||
+ "%s:%d: %s: Assertion \"%s\" failed.\n",
|
|
||||||
+ file, line, function, expr);
|
|
||||||
+ if (msg) {
|
|
||||||
+ fprintf(stderr, "%s\n", msg);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ fflush(stderr);
|
|
||||||
+
|
|
||||||
+ if (obj) {
|
|
||||||
+ /* This might succeed or fail, but we're about to abort, so at least
|
|
||||||
+ try to provide any extra info we can: */
|
|
||||||
+ _PyObject_Dump(obj);
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ fprintf(stderr, "NULL object\n");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ fflush(stdout);
|
|
||||||
+ fflush(stderr);
|
|
||||||
+
|
|
||||||
+ /* Terminate the process: */
|
|
||||||
+ abort();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#ifndef Py_TRACE_REFS
|
|
||||||
/* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
|
|
||||||
Define this here, so we can undefine the macro. */
|
|
||||||
@ -2,50 +2,57 @@ diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
|
|||||||
index 4748ba4..fc02255 100644
|
index 4748ba4..fc02255 100644
|
||||||
--- a/Lib/ensurepip/__init__.py
|
--- a/Lib/ensurepip/__init__.py
|
||||||
+++ b/Lib/ensurepip/__init__.py
|
+++ b/Lib/ensurepip/__init__.py
|
||||||
@@ -1,16 +1,27 @@
|
@@ -1,6 +1,7 @@
|
||||||
+import distutils.version
|
+import distutils.version
|
||||||
+import glob
|
+import glob
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
-import pkgutil
|
-import pkgutil
|
||||||
import sys
|
import sys
|
||||||
|
import runpy
|
||||||
import tempfile
|
import tempfile
|
||||||
|
@@ -8,10 +9,24 @@ import tempfile
|
||||||
|
|
||||||
__all__ = ["version", "bootstrap"]
|
__all__ = ["version", "bootstrap"]
|
||||||
|
|
||||||
+_WHEEL_DIR = "/usr/share/python-wheels/"
|
+_WHEEL_DIR = "/usr/share/python-wheels/"
|
||||||
|
|
||||||
-_SETUPTOOLS_VERSION = "40.8.0"
|
-_SETUPTOOLS_VERSION = "41.2.0"
|
||||||
|
+_wheels = {}
|
||||||
-_PIP_VERSION = "19.0.3"
|
|
||||||
|
-_PIP_VERSION = "19.2.3"
|
||||||
+def _get_most_recent_wheel_version(pkg):
|
+def _get_most_recent_wheel_version(pkg):
|
||||||
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
|
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
|
||||||
+ suffix = "-py2.py3-none-any.whl"
|
+ _wheels[pkg] = {}
|
||||||
+ pattern = "{}*{}".format(prefix, suffix)
|
+ for suffix in "-py2.py3-none-any.whl", "-py3-none-any.whl":
|
||||||
+ versions = (p[len(prefix):-len(suffix)] for p in glob.glob(pattern))
|
+ pattern = "{}*{}".format(prefix, suffix)
|
||||||
+ return str(max(versions, key=distutils.version.LooseVersion))
|
+ for path in glob.glob(pattern):
|
||||||
|
+ version_str = path[len(prefix):-len(suffix)]
|
||||||
|
+ _wheels[pkg][version_str] = os.path.basename(path)
|
||||||
|
+ return str(max(_wheels[pkg], key=distutils.version.LooseVersion))
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
+_SETUPTOOLS_VERSION = _get_most_recent_wheel_version("setuptools")
|
+_SETUPTOOLS_VERSION = _get_most_recent_wheel_version("setuptools")
|
||||||
+
|
+
|
||||||
+_PIP_VERSION = _get_most_recent_wheel_version("pip")
|
+_PIP_VERSION = _get_most_recent_wheel_version("pip")
|
||||||
|
|
||||||
_PROJECTS = [
|
_PROJECTS = [
|
||||||
("setuptools", _SETUPTOOLS_VERSION),
|
("setuptools", _SETUPTOOLS_VERSION),
|
||||||
@@ -94,12 +105,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
|
@@ -105,13 +120,10 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
|
||||||
|
# additional paths that need added to sys.path
|
||||||
additional_paths = []
|
additional_paths = []
|
||||||
for project, version in _PROJECTS:
|
for project, version in _PROJECTS:
|
||||||
wheel_name = "{}-{}-py2.py3-none-any.whl".format(project, version)
|
- wheel_name = "{}-{}-py2.py3-none-any.whl".format(project, version)
|
||||||
- whl = pkgutil.get_data(
|
- whl = pkgutil.get_data(
|
||||||
- "ensurepip",
|
- "ensurepip",
|
||||||
- "_bundled/{}".format(wheel_name),
|
- "_bundled/{}".format(wheel_name),
|
||||||
- )
|
- )
|
||||||
- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
|
- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
|
||||||
- fp.write(whl)
|
- fp.write(whl)
|
||||||
|
+ wheel_name = _wheels[project][version]
|
||||||
+ with open(os.path.join(_WHEEL_DIR, wheel_name), "rb") as sfp:
|
+ with open(os.path.join(_WHEEL_DIR, wheel_name), "rb") as sfp:
|
||||||
+ with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
|
+ with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
|
||||||
+ fp.write(sfp.read())
|
+ fp.write(sfp.read())
|
||||||
|
|
||||||
additional_paths.append(os.path.join(tmpdir, wheel_name))
|
additional_paths.append(os.path.join(tmpdir, wheel_name))
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +0,0 @@
|
|||||||
diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py
|
|
||||||
index 0871a4f..8796b68 100644
|
|
||||||
--- a/Lib/distutils/command/bdist_wininst.py
|
|
||||||
+++ b/Lib/distutils/command/bdist_wininst.py
|
|
||||||
@@ -12,6 +12,8 @@ from distutils.sysconfig import get_python_version
|
|
||||||
from distutils import log
|
|
||||||
|
|
||||||
class bdist_wininst(Command):
|
|
||||||
+ # Marker for tests that we have the unsupported bdist_wininst
|
|
||||||
+ _unsupported = True
|
|
||||||
|
|
||||||
description = "create an executable installer for MS Windows"
|
|
||||||
|
|
||||||
@ -1,133 +0,0 @@
|
|||||||
From e170d5de8a7e8561388d38007195b5edf5f1fc82 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Miss Islington (bot)"
|
|
||||||
<31488909+miss-islington@users.noreply.github.com>
|
|
||||||
Date: Fri, 9 Aug 2019 01:30:33 -0700
|
|
||||||
Subject: [PATCH] bpo-34155: Dont parse domains containing @ (GH-13079)
|
|
||||||
|
|
||||||
Before:
|
|
||||||
|
|
||||||
>>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses
|
|
||||||
(Address(display_name='', username='a', domain='malicious.org'),)
|
|
||||||
|
|
||||||
>>> parseaddr('a@malicious.org@important.com')
|
|
||||||
('', 'a@malicious.org')
|
|
||||||
|
|
||||||
After:
|
|
||||||
|
|
||||||
>>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses
|
|
||||||
(Address(display_name='', username='', domain=''),)
|
|
||||||
|
|
||||||
>>> parseaddr('a@malicious.org@important.com')
|
|
||||||
('', 'a@')
|
|
||||||
|
|
||||||
https://bugs.python.org/issue34155
|
|
||||||
(cherry picked from commit 8cb65d1381b027f0b09ee36bfed7f35bb4dec9a9)
|
|
||||||
|
|
||||||
Co-authored-by: jpic <jpic@users.noreply.github.com>
|
|
||||||
Signed-off-by: hehuazhen <hehuazhen@huawei.com>
|
|
||||||
---
|
|
||||||
Lib/email/_header_value_parser.py | 2 ++
|
|
||||||
Lib/email/_parseaddr.py | 11 ++++++++++-
|
|
||||||
Lib/test/test_email/test__header_value_parser.py | 10 ++++++++++
|
|
||||||
Lib/test/test_email/test_email.py | 14 ++++++++++++++
|
|
||||||
.../next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst | 1 +
|
|
||||||
5 files changed, 37 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100644 Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
|
|
||||||
|
|
||||||
diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py
|
|
||||||
index fc00b4a..bbc026e 100644
|
|
||||||
--- a/Lib/email/_header_value_parser.py
|
|
||||||
+++ b/Lib/email/_header_value_parser.py
|
|
||||||
@@ -1582,6 +1582,8 @@ def get_domain(value):
|
|
||||||
token, value = get_dot_atom(value)
|
|
||||||
except errors.HeaderParseError:
|
|
||||||
token, value = get_atom(value)
|
|
||||||
+ if value and value[0] == '@':
|
|
||||||
+ raise errors.HeaderParseError('Invalid Domain')
|
|
||||||
if leader is not None:
|
|
||||||
token[:0] = [leader]
|
|
||||||
domain.append(token)
|
|
||||||
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
|
|
||||||
index cdfa372..41ff6f8 100644
|
|
||||||
--- a/Lib/email/_parseaddr.py
|
|
||||||
+++ b/Lib/email/_parseaddr.py
|
|
||||||
@@ -379,7 +379,12 @@ class AddrlistClass:
|
|
||||||
aslist.append('@')
|
|
||||||
self.pos += 1
|
|
||||||
self.gotonext()
|
|
||||||
- return EMPTYSTRING.join(aslist) + self.getdomain()
|
|
||||||
+ domain = self.getdomain()
|
|
||||||
+ if not domain:
|
|
||||||
+ # Invalid domain, return an empty address instead of returning a
|
|
||||||
+ # local part to denote failed parsing.
|
|
||||||
+ return EMPTYSTRING
|
|
||||||
+ return EMPTYSTRING.join(aslist) + domain
|
|
||||||
|
|
||||||
def getdomain(self):
|
|
||||||
"""Get the complete domain name from an address."""
|
|
||||||
@@ -394,6 +399,10 @@ class AddrlistClass:
|
|
||||||
elif self.field[self.pos] == '.':
|
|
||||||
self.pos += 1
|
|
||||||
sdlist.append('.')
|
|
||||||
+ elif self.field[self.pos] == '@':
|
|
||||||
+ # bpo-34155: Don't parse domains with two `@` like
|
|
||||||
+ # `a@malicious.org@important.com`.
|
|
||||||
+ return EMPTYSTRING
|
|
||||||
elif self.field[self.pos] in self.atomends:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py
|
|
||||||
index 693487b..7dc4de1 100644
|
|
||||||
--- a/Lib/test/test_email/test__header_value_parser.py
|
|
||||||
+++ b/Lib/test/test_email/test__header_value_parser.py
|
|
||||||
@@ -1438,6 +1438,16 @@ class TestParser(TestParserMixin, TestEmailBase):
|
|
||||||
self.assertEqual(addr_spec.domain, 'example.com')
|
|
||||||
self.assertEqual(addr_spec.addr_spec, 'star.a.star@example.com')
|
|
||||||
|
|
||||||
+ def test_get_addr_spec_multiple_domains(self):
|
|
||||||
+ with self.assertRaises(errors.HeaderParseError):
|
|
||||||
+ parser.get_addr_spec('star@a.star@example.com')
|
|
||||||
+
|
|
||||||
+ with self.assertRaises(errors.HeaderParseError):
|
|
||||||
+ parser.get_addr_spec('star@a@example.com')
|
|
||||||
+
|
|
||||||
+ with self.assertRaises(errors.HeaderParseError):
|
|
||||||
+ parser.get_addr_spec('star@172.17.0.1@example.com')
|
|
||||||
+
|
|
||||||
# get_obs_route
|
|
||||||
|
|
||||||
def test_get_obs_route_simple(self):
|
|
||||||
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
|
|
||||||
index c29cc56..aa77588 100644
|
|
||||||
--- a/Lib/test/test_email/test_email.py
|
|
||||||
+++ b/Lib/test/test_email/test_email.py
|
|
||||||
@@ -3041,6 +3041,20 @@ class TestMiscellaneous(TestEmailBase):
|
|
||||||
self.assertEqual(utils.parseaddr('<>'), ('', ''))
|
|
||||||
self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '')
|
|
||||||
|
|
||||||
+ def test_parseaddr_multiple_domains(self):
|
|
||||||
+ self.assertEqual(
|
|
||||||
+ utils.parseaddr('a@b@c'),
|
|
||||||
+ ('', '')
|
|
||||||
+ )
|
|
||||||
+ self.assertEqual(
|
|
||||||
+ utils.parseaddr('a@b.c@c'),
|
|
||||||
+ ('', '')
|
|
||||||
+ )
|
|
||||||
+ self.assertEqual(
|
|
||||||
+ utils.parseaddr('a@172.17.0.1@c'),
|
|
||||||
+ ('', '')
|
|
||||||
+ )
|
|
||||||
+
|
|
||||||
def test_noquote_dump(self):
|
|
||||||
self.assertEqual(
|
|
||||||
utils.formataddr(('A Silly Person', 'person@dom.ain')),
|
|
||||||
diff --git a/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..50292e2
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+Fix parsing of invalid email addresses with more than one ``@`` (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email address. Patch by maxking & jpic.
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
@ -1,79 +0,0 @@
|
|||||||
From 0fe421c4875a031a83b4f0d804464af3a613985c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Dong-hee Na <donghee.na92@gmail.com>
|
|
||||||
Date: Sat, 28 Sep 2019 04:59:37 +0900
|
|
||||||
Subject: [PATCH] bpo-38243, xmlrpc.server: Escape the server_title (GH-16373)
|
|
||||||
|
|
||||||
Escape the server title of xmlrpc.server.DocXMLRPCServer
|
|
||||||
when rendering the document page as HTML.
|
|
||||||
---
|
|
||||||
Lib/test/test_docxmlrpc.py | 16 ++++++++++++++++
|
|
||||||
Lib/xmlrpc/server.py | 3 ++-
|
|
||||||
.../Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst | 3 +++
|
|
||||||
3 files changed, 21 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100644 Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
|
|
||||||
|
|
||||||
diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py
|
|
||||||
index f077f05..3821565 100644
|
|
||||||
--- a/Lib/test/test_docxmlrpc.py
|
|
||||||
+++ b/Lib/test/test_docxmlrpc.py
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
from xmlrpc.server import DocXMLRPCServer
|
|
||||||
import http.client
|
|
||||||
+import re
|
|
||||||
import sys
|
|
||||||
import threading
|
|
||||||
from test import support
|
|
||||||
@@ -193,6 +194,21 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
|
|
||||||
b'method_annotation</strong></a>(x: bytes)</dt></dl>'),
|
|
||||||
response.read())
|
|
||||||
|
|
||||||
+ def test_server_title_escape(self):
|
|
||||||
+ # bpo-38243: Ensure that the server title and documentation
|
|
||||||
+ # are escaped for HTML.
|
|
||||||
+ self.serv.set_server_title('test_title<script>')
|
|
||||||
+ self.serv.set_server_documentation('test_documentation<script>')
|
|
||||||
+ self.assertEqual('test_title<script>', self.serv.server_title)
|
|
||||||
+ self.assertEqual('test_documentation<script>',
|
|
||||||
+ self.serv.server_documentation)
|
|
||||||
+
|
|
||||||
+ generated = self.serv.generate_html_documentation()
|
|
||||||
+ title = re.search(r'<title>(.+?)</title>', generated).group()
|
|
||||||
+ documentation = re.search(r'<p><tt>(.+?)</tt></p>', generated).group()
|
|
||||||
+ self.assertEqual('<title>Python: test_title<script></title>', title)
|
|
||||||
+ self.assertEqual('<p><tt>test_documentation<script></tt></p>', documentation)
|
|
||||||
+
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
unittest.main()
|
|
||||||
diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py
|
|
||||||
index f1c467e..32aba4d 100644
|
|
||||||
--- a/Lib/xmlrpc/server.py
|
|
||||||
+++ b/Lib/xmlrpc/server.py
|
|
||||||
@@ -108,6 +108,7 @@ from xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode
|
|
||||||
from http.server import BaseHTTPRequestHandler
|
|
||||||
from functools import partial
|
|
||||||
from inspect import signature
|
|
||||||
+import html
|
|
||||||
import http.server
|
|
||||||
import socketserver
|
|
||||||
import sys
|
|
||||||
@@ -894,7 +895,7 @@ class XMLRPCDocGenerator:
|
|
||||||
methods
|
|
||||||
)
|
|
||||||
|
|
||||||
- return documenter.page(self.server_title, documentation)
|
|
||||||
+ return documenter.page(html.escape(self.server_title), documentation)
|
|
||||||
|
|
||||||
class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|
||||||
"""XML-RPC and documentation request handler class.
|
|
||||||
diff --git a/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst b/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..98d7be1
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
|
|
||||||
@@ -0,0 +1,3 @@
|
|
||||||
+Escape the server title of :class:`xmlrpc.server.DocXMLRPCServer`
|
|
||||||
+when rendering the document page as HTML.
|
|
||||||
+(Contributed by Dong-hee Na in :issue:`38243`.)
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
From c7dac45bbe3ea5fe11df60b07f03c822de350284 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Elena Oat <oat.elena@gmail.com>
|
|
||||||
Date: Sun, 4 Nov 2018 06:50:55 -0800
|
|
||||||
Subject: [PATCH] Explain that the orderness of the result of glob is
|
|
||||||
system-dependant (GH-6587)
|
|
||||||
|
|
||||||
Thanks!
|
|
||||||
---
|
|
||||||
Doc/library/glob.rst | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst
|
|
||||||
index 0db10b5..2a5f0dd 100644
|
|
||||||
--- a/Doc/library/glob.rst
|
|
||||||
+++ b/Doc/library/glob.rst
|
|
||||||
@@ -42,7 +42,8 @@ For example, ``'[?]'`` matches the character ``'?'``.
|
|
||||||
a string containing a path specification. *pathname* can be either absolute
|
|
||||||
(like :file:`/usr/src/Python-1.5/Makefile`) or relative (like
|
|
||||||
:file:`../../Tools/\*/\*.gif`), and can contain shell-style wildcards. Broken
|
|
||||||
- symlinks are included in the results (as in the shell).
|
|
||||||
+ symlinks are included in the results (as in the shell). Whether or not the
|
|
||||||
+ results are sorted depends on the file system.
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: **; in glob-style wildcards
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
@ -1,89 +0,0 @@
|
|||||||
From 7c1b25f7c1e9381fa4b96b4fc489e4bbbe065f02 Mon Sep 17 00:00:00 2001
|
|
||||||
From: JunWei Song <sungboss2004@gmail.com>
|
|
||||||
Date: Wed, 11 Sep 2019 23:04:12 +0800
|
|
||||||
Subject: [PATCH] bpo-36260: Add pitfalls to zipfile module documentation
|
|
||||||
(#13378)
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
* bpo-36260: Add pitfalls to zipfile module documentation
|
|
||||||
|
|
||||||
We saw vulnerability warning description (including zip bomb) in Doc/library/xml.rst file.
|
|
||||||
This gave us the idea of documentation improvement.
|
|
||||||
|
|
||||||
So, we moved a little bit forward :P
|
|
||||||
And the doc patch can be found (pr).
|
|
||||||
|
|
||||||
* fix trailing whitespace
|
|
||||||
|
|
||||||
* 📜 🤖 Added by blurb_it.
|
|
||||||
|
|
||||||
* Reformat text for consistency.
|
|
||||||
|
|
||||||
---
|
|
||||||
Doc/library/zipfile.rst | 40 +++++++++++++++++++
|
|
||||||
.../2019-06-04-09-29-00.bpo-36260.WrGuc-.rst | 1 +
|
|
||||||
2 files changed, 41 insertions(+)
|
|
||||||
create mode 100644 Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst
|
|
||||||
|
|
||||||
diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst
|
|
||||||
index 6fb03a0..6fa0a28 100644
|
|
||||||
--- a/Doc/library/zipfile.rst
|
|
||||||
+++ b/Doc/library/zipfile.rst
|
|
||||||
@@ -730,5 +730,45 @@ Command-line options
|
|
||||||
|
|
||||||
Test whether the zipfile is valid or not.
|
|
||||||
|
|
||||||
+Decompression pitfalls
|
|
||||||
+----------------------
|
|
||||||
+
|
|
||||||
+The extraction in zipfile module might fail due to some pitfalls listed below.
|
|
||||||
+
|
|
||||||
+From file itself
|
|
||||||
+~~~~~~~~~~~~~~~~
|
|
||||||
+
|
|
||||||
+Decompression may fail due to incorrect password / CRC checksum / ZIP format or
|
|
||||||
+unsupported compression method / decryption.
|
|
||||||
+
|
|
||||||
+File System limitations
|
|
||||||
+~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
+
|
|
||||||
+Exceeding limitations on different file systems can cause decompression failed.
|
|
||||||
+Such as allowable characters in the directory entries, length of the file name,
|
|
||||||
+length of the pathname, size of a single file, and number of files, etc.
|
|
||||||
+
|
|
||||||
+Resources limitations
|
|
||||||
+~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
+
|
|
||||||
+The lack of memory or disk volume would lead to decompression
|
|
||||||
+failed. For example, decompression bombs (aka `ZIP bomb`_)
|
|
||||||
+apply to zipfile library that can cause disk volume exhaustion.
|
|
||||||
+
|
|
||||||
+Interruption
|
|
||||||
+~~~~~~~~~~~~
|
|
||||||
+
|
|
||||||
+Interruption during the decompression, such as pressing control-C or killing the
|
|
||||||
+decompression process may result in incomplete decompression of the archive.
|
|
||||||
+
|
|
||||||
+Default behaviors of extraction
|
|
||||||
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
+
|
|
||||||
+Not knowing the default extraction behaviors
|
|
||||||
+can cause unexpected decompression results.
|
|
||||||
+For example, when extracting the same archive twice,
|
|
||||||
+it overwrites files without asking.
|
|
||||||
+
|
|
||||||
|
|
||||||
+.. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb
|
|
||||||
.. _PKZIP Application Note: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
|
|
||||||
diff --git a/Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst b/Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..9276516
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+Add decompression pitfalls to zipfile module documentation.
|
|
||||||
\ No newline at end of file
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
Binary file not shown.
@ -1,24 +0,0 @@
|
|||||||
diff --git a/Lib/platform.py b/Lib/platform.py
|
|
||||||
index 6ab06b5..8d41a4b 100755
|
|
||||||
--- a/Lib/platform.py
|
|
||||||
+++ b/Lib/platform.py
|
|
||||||
@@ -297,7 +297,7 @@ _release_version = re.compile(r'([^0-9]+)'
|
|
||||||
# and http://www.die.net/doc/linux/man/man1/lsb_release.1.html
|
|
||||||
|
|
||||||
_supported_dists = (
|
|
||||||
- 'SuSE', 'debian', 'fedora', 'redhat', 'centos',
|
|
||||||
+ 'SuSE', 'debian', 'fedora', 'redhat', 'centos', 'generic_os',
|
|
||||||
'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo',
|
|
||||||
'UnitedLinux', 'turbolinux', 'arch', 'mageia')
|
|
||||||
|
|
||||||
@@ -367,6 +367,8 @@ def _linux_distribution(distname, version, id, supported_dists,
|
|
||||||
return distname, version, id
|
|
||||||
etc.sort()
|
|
||||||
for file in etc:
|
|
||||||
+ if os.path.islink(os.path.join(_UNIXCONFDIR, file)):
|
|
||||||
+ continue
|
|
||||||
m = _release_filename.match(file)
|
|
||||||
if m is not None:
|
|
||||||
_distname, dummy = m.groups()
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
84
python3.spec
84
python3.spec
@ -2,12 +2,12 @@ Name: python3
|
|||||||
Summary: Interpreter of the Python3 programming language
|
Summary: Interpreter of the Python3 programming language
|
||||||
URL: https://www.python.org/
|
URL: https://www.python.org/
|
||||||
|
|
||||||
Version: 3.7.4
|
Version: 3.8.3
|
||||||
Release: 11
|
Release: 1
|
||||||
License: Python
|
License: Python
|
||||||
|
|
||||||
%global branchversion 3.7
|
%global branchversion 3.8
|
||||||
%global pyshortver 37
|
%global pyshortver 38
|
||||||
|
|
||||||
%ifarch %{ix86} x86_64
|
%ifarch %{ix86} x86_64
|
||||||
%bcond_without optimizations
|
%bcond_without optimizations
|
||||||
@ -18,15 +18,11 @@ License: Python
|
|||||||
%global pylibdir %{_libdir}/python%{branchversion}
|
%global pylibdir %{_libdir}/python%{branchversion}
|
||||||
%global dynload_dir %{pylibdir}/lib-dynload
|
%global dynload_dir %{pylibdir}/lib-dynload
|
||||||
|
|
||||||
# See http://www.python.org/dev/peps/pep-3149/
|
%global LDVERSION_optimized %{branchversion}
|
||||||
%global ABIFLAGS_optimized m
|
%global LDVERSION_debug %{branchversion}d
|
||||||
%global ABIFLAGS_debug dm
|
|
||||||
|
|
||||||
%global LDVERSION_optimized %{branchversion}m
|
%global SOABI_optimized cpython-%{pyshortver}-%{_arch}-linux%{_gnu}
|
||||||
%global LDVERSION_debug %{branchversion}dm
|
%global SOABI_debug cpython-%{pyshortver}d-%{_arch}-linux%{_gnu}
|
||||||
|
|
||||||
%global SOABI_optimized cpython-%{pyshortver}m-%{_arch}-linux%{_gnu}
|
|
||||||
%global SOABI_debug cpython-%{pyshortver}dm-%{_arch}-linux%{_gnu}
|
|
||||||
|
|
||||||
# See http://www.python.org/dev/peps/pep-3147/
|
# See http://www.python.org/dev/peps/pep-3147/
|
||||||
%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
|
%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
|
||||||
@ -92,21 +88,11 @@ Patch1: 00001-rpath.patch
|
|||||||
Patch102: 00102-lib64.patch
|
Patch102: 00102-lib64.patch
|
||||||
Patch111: 00111-no-static-lib.patch
|
Patch111: 00111-no-static-lib.patch
|
||||||
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
|
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
|
||||||
Patch155: 00155-avoid-ctypes-thunks.patch
|
|
||||||
Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
|
Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
|
||||||
Patch170: 00170-gc-assertions.patch
|
|
||||||
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
|
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
|
||||||
Patch189: 00189-use-rpm-wheels.patch
|
Patch189: 00189-use-rpm-wheels.patch
|
||||||
Patch205: 00205-make-libpl-respect-lib64.patch
|
Patch205: 00205-make-libpl-respect-lib64.patch
|
||||||
Patch251: 00251-change-user-install-location.patch
|
Patch251: 00251-change-user-install-location.patch
|
||||||
Patch316: 00316-mark-bdist_wininst-unsupported.patch
|
|
||||||
|
|
||||||
Patch6000: CVE-2019-16056.patch
|
|
||||||
Patch6001: CVE-2019-16935.patch
|
|
||||||
Patch6002: CVE-2019-17514.patch
|
|
||||||
Patch6003: CVE-2019-9674.patch
|
|
||||||
|
|
||||||
Patch9000: python3-add-generic-os-support.patch
|
|
||||||
|
|
||||||
Provides: python%{branchversion} = %{version}-%{release}
|
Provides: python%{branchversion} = %{version}-%{release}
|
||||||
Provides: python(abi) = %{branchversion}
|
Provides: python(abi) = %{branchversion}
|
||||||
@ -191,25 +177,14 @@ rm -r Modules/expat
|
|||||||
%patch102 -p1
|
%patch102 -p1
|
||||||
%patch111 -p1
|
%patch111 -p1
|
||||||
%patch132 -p1
|
%patch132 -p1
|
||||||
%patch155 -p1
|
|
||||||
%patch160 -p1
|
%patch160 -p1
|
||||||
%patch170 -p1
|
|
||||||
%patch178 -p1
|
%patch178 -p1
|
||||||
|
|
||||||
%patch189 -p1
|
%patch189 -p1
|
||||||
rm Lib/ensurepip/_bundled/*.whl
|
rm Lib/ensurepip/_bundled/*.whl
|
||||||
%patch205 -p1
|
%patch205 -p1
|
||||||
%patch251 -p1
|
%patch251 -p1
|
||||||
%patch316 -p1
|
|
||||||
|
|
||||||
%patch6000 -p1
|
|
||||||
%patch6001 -p1
|
|
||||||
%patch6002 -p1
|
|
||||||
%patch6003 -p1
|
|
||||||
|
|
||||||
%patch9000 -p1
|
|
||||||
|
|
||||||
sed -i "s/generic_os/%{_vendor}/g" Lib/platform.py
|
|
||||||
rm configure pyconfig.h.in
|
rm configure pyconfig.h.in
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -227,7 +202,7 @@ topdir=$(pwd)
|
|||||||
%global extension_cflags ""
|
%global extension_cflags ""
|
||||||
%global extension_ldflags ""
|
%global extension_ldflags ""
|
||||||
|
|
||||||
export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv -fstack-protector-strong"
|
||||||
export CFLAGS_NODIST="%{build_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
export CFLAGS_NODIST="%{build_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
||||||
export CXXFLAGS="%{extension_cxxflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
export CXXFLAGS="%{extension_cxxflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
||||||
export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
|
export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
|
||||||
@ -392,6 +367,8 @@ ln -s %{_bindir}/python3 %{buildroot}%{_bindir}/python
|
|||||||
|
|
||||||
mv %{buildroot}%{_bindir}/2to3-%{branchversion} %{buildroot}%{_bindir}/2to3
|
mv %{buildroot}%{_bindir}/2to3-%{branchversion} %{buildroot}%{_bindir}/2to3
|
||||||
|
|
||||||
|
cp -a %{_libdir}/libpython3.7m.so.1.0 ${RPM_BUILD_ROOT}%{_libdir}
|
||||||
|
|
||||||
%check
|
%check
|
||||||
topdir=$(pwd)
|
topdir=$(pwd)
|
||||||
|
|
||||||
@ -435,11 +412,8 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
|
|
||||||
%{_bindir}/pydoc*
|
%{_bindir}/pydoc*
|
||||||
%{_bindir}/python3
|
%{_bindir}/python3
|
||||||
%{_bindir}/pyvenv
|
|
||||||
|
|
||||||
%{_bindir}/python%{branchversion}
|
%{_bindir}/python%{branchversion}
|
||||||
%{_bindir}/python%{branchversion}m
|
|
||||||
%{_bindir}/pyvenv-%{branchversion}
|
|
||||||
|
|
||||||
%dir %{pylibdir}
|
%dir %{pylibdir}
|
||||||
%dir %{dynload_dir}
|
%dir %{dynload_dir}
|
||||||
@ -548,6 +522,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{dynload_dir}/nis.%{SOABI_optimized}.so
|
%{dynload_dir}/nis.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
|
%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/parser.%{SOABI_optimized}.so
|
%{dynload_dir}/parser.%{SOABI_optimized}.so
|
||||||
|
%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
|
%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/readline.%{SOABI_optimized}.so
|
%{dynload_dir}/readline.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/resource.%{SOABI_optimized}.so
|
%{dynload_dir}/resource.%{SOABI_optimized}.so
|
||||||
@ -560,6 +535,8 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{dynload_dir}/_uuid.%{SOABI_optimized}.so
|
%{dynload_dir}/_uuid.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
|
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/zlib.%{SOABI_optimized}.so
|
%{dynload_dir}/zlib.%{SOABI_optimized}.so
|
||||||
|
%{dynload_dir}/_statistics.%{SOABI_optimized}.so
|
||||||
|
%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
|
||||||
|
|
||||||
%dir %{pylibdir}/site-packages/
|
%dir %{pylibdir}/site-packages/
|
||||||
%dir %{pylibdir}/site-packages/__pycache__/
|
%dir %{pylibdir}/site-packages/__pycache__/
|
||||||
@ -640,6 +617,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
|
|
||||||
%{_libdir}/%{py_INSTSONAME_optimized}
|
%{_libdir}/%{py_INSTSONAME_optimized}
|
||||||
%{_libdir}/libpython3.so
|
%{_libdir}/libpython3.so
|
||||||
|
%{_libdir}/libpython3.7m.so.1.0
|
||||||
|
|
||||||
%files -n python3-unversioned-command
|
%files -n python3-unversioned-command
|
||||||
%{_bindir}/python
|
%{_bindir}/python
|
||||||
@ -652,10 +630,12 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
|
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
|
||||||
%{_includedir}/python%{LDVERSION_optimized}/*.h
|
%{_includedir}/python%{LDVERSION_optimized}/*.h
|
||||||
%{_includedir}/python%{LDVERSION_optimized}/internal/
|
%{_includedir}/python%{LDVERSION_optimized}/internal/
|
||||||
|
%{_includedir}/python%{LDVERSION_optimized}/cpython/
|
||||||
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
|
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
|
||||||
|
|
||||||
%{_bindir}/python3-config
|
%{_bindir}/python3-config
|
||||||
%{_libdir}/pkgconfig/python3.pc
|
%{_libdir}/pkgconfig/python3.pc
|
||||||
|
%{_libdir}/pkgconfig/python3-embed.pc
|
||||||
%{_bindir}/pathfix.py
|
%{_bindir}/pathfix.py
|
||||||
%{_bindir}/pygettext3.py
|
%{_bindir}/pygettext3.py
|
||||||
%{_bindir}/msgfmt3.py
|
%{_bindir}/msgfmt3.py
|
||||||
@ -663,12 +643,11 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{_bindir}/pygettext%{branchversion}.py
|
%{_bindir}/pygettext%{branchversion}.py
|
||||||
%{_bindir}/msgfmt%{branchversion}.py
|
%{_bindir}/msgfmt%{branchversion}.py
|
||||||
|
|
||||||
%{_bindir}/python%{branchversion}-config
|
|
||||||
%{_bindir}/python%{LDVERSION_optimized}-config
|
%{_bindir}/python%{LDVERSION_optimized}-config
|
||||||
%{_bindir}/python%{LDVERSION_optimized}-*-config
|
%{_bindir}/python%{LDVERSION_optimized}-*-config
|
||||||
%{_libdir}/libpython%{LDVERSION_optimized}.so
|
%{_libdir}/libpython%{LDVERSION_optimized}.so
|
||||||
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
|
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
|
||||||
%{_libdir}/pkgconfig/python-%{branchversion}.pc
|
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
|
||||||
|
|
||||||
%{_bindir}/idle*
|
%{_bindir}/idle*
|
||||||
%{pylibdir}/idlelib
|
%{pylibdir}/idlelib
|
||||||
@ -690,22 +669,13 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{pylibdir}/distutils/tests
|
%{pylibdir}/distutils/tests
|
||||||
%{pylibdir}/sqlite3/test
|
%{pylibdir}/sqlite3/test
|
||||||
%{pylibdir}/test
|
%{pylibdir}/test
|
||||||
%exclude %{pylibdir}/test/allsans.pem
|
%exclude %{pylibdir}/test/capath
|
||||||
%exclude %{pylibdir}/test/badcert.pem
|
%exclude %{pylibdir}/test/*.pem
|
||||||
%exclude %{pylibdir}/test/badkey.pem
|
%exclude %{pylibdir}/test/*.crl
|
||||||
%exclude %{pylibdir}/test/idnsans.pem
|
|
||||||
%exclude %{pylibdir}/test/keycert2.pem
|
|
||||||
%exclude %{pylibdir}/test/keycert3.pem
|
|
||||||
%exclude %{pylibdir}/test/keycert4.pem
|
|
||||||
%exclude %{pylibdir}/test/keycertecc.pem
|
|
||||||
%exclude %{pylibdir}/test/keycert.pem
|
|
||||||
%exclude %{pylibdir}/test/pycakey.pem
|
|
||||||
%exclude %{pylibdir}/test/ssl_key.pem
|
|
||||||
%exclude %{pylibdir}/test/keycert3.pem
|
|
||||||
%exclude %{pylibdir}/test/ssl_key.pem
|
|
||||||
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
|
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
|
%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
|
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
|
||||||
|
%{dynload_dir}/_testinternalcapi.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
|
%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
|
||||||
%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
|
%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
|
||||||
%{pylibdir}/lib2to3/tests
|
%{pylibdir}/lib2to3/tests
|
||||||
@ -789,6 +759,9 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{dynload_dir}/_uuid.%{SOABI_debug}.so
|
%{dynload_dir}/_uuid.%{SOABI_debug}.so
|
||||||
%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
|
%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
|
||||||
%{dynload_dir}/zlib.%{SOABI_debug}.so
|
%{dynload_dir}/zlib.%{SOABI_debug}.so
|
||||||
|
%{dynload_dir}/_statistics.%{SOABI_debug}.so
|
||||||
|
%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
|
||||||
|
%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
|
||||||
|
|
||||||
%{_libdir}/%{py_INSTSONAME_debug}
|
%{_libdir}/%{py_INSTSONAME_debug}
|
||||||
|
|
||||||
@ -799,6 +772,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{_libdir}/libpython%{LDVERSION_debug}.so
|
%{_libdir}/libpython%{LDVERSION_debug}.so
|
||||||
%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
|
%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
|
||||||
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
|
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
|
||||||
|
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}-embed.pc
|
||||||
|
|
||||||
%{dynload_dir}/_tkinter.%{SOABI_debug}.so
|
%{dynload_dir}/_tkinter.%{SOABI_debug}.so
|
||||||
|
|
||||||
@ -806,6 +780,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
|
%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
|
||||||
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
|
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
|
||||||
%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
|
%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
|
||||||
|
%{dynload_dir}/_testinternalcapi.%{SOABI_debug}.so
|
||||||
|
|
||||||
%undefine _debuginfo_subpackages
|
%undefine _debuginfo_subpackages
|
||||||
|
|
||||||
@ -813,6 +788,9 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
%{_mandir}/*/*
|
%{_mandir}/*/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jun 5 2020 hanxinke<hanxinke@huawei.com> - 3.8.3-1
|
||||||
|
- Update to Python 3.8.3
|
||||||
|
|
||||||
* Tue Jun 2 2020 hanxinke<hanxinke@huawei.com> - 3.7.4-11
|
* Tue Jun 2 2020 hanxinke<hanxinke@huawei.com> - 3.7.4-11
|
||||||
- Type:bugfix
|
- Type:bugfix
|
||||||
- ID:NA
|
- ID:NA
|
||||||
@ -855,7 +833,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
|||||||
- SUG:NA
|
- SUG:NA
|
||||||
- DESC:update spec file
|
- DESC:update spec file
|
||||||
|
|
||||||
* Thu Dec 24 2019 openEuler Buildteam <buildteam@openeuler.org> - 3.7.4-4
|
* Tue Dec 24 2019 openEuler Buildteam <buildteam@openeuler.org> - 3.7.4-4
|
||||||
- fix CVE-2019-16056 CVE-2019-16935 CVE-2019-17514
|
- fix CVE-2019-16056 CVE-2019-16935 CVE-2019-17514
|
||||||
- Delete the test keys, fix BEP problem
|
- Delete the test keys, fix BEP problem
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user