Compare commits

...

No commits in common. "c8" and "c9" have entirely different histories.
c8 ... c9

7 changed files with 390 additions and 197 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/mod_wsgi-4.6.4.tar.gz
SOURCES/mod_wsgi-4.7.1.tar.gz

View File

@ -1 +1 @@
6a0cc67546a5e172a885324f3e58b8be5f4e0e58 SOURCES/mod_wsgi-4.6.4.tar.gz
e63cf367594da6d0efd685057d5b497883004599 SOURCES/mod_wsgi-4.7.1.tar.gz

View File

@ -1,131 +0,0 @@
https://github.com/GrahamDumpleton/mod_wsgi/pull/364
https://bugzilla.redhat.com/show_bug.cgi?id=1602620
--- mod_wsgi-4.6.4/src/server/__init__.py.warnings
+++ mod_wsgi-4.6.4/src/server/__init__.py
@@ -103,7 +103,6 @@
for name in mimetypes.knownfiles:
if os.path.exists(name):
return name
- break
else:
return name
--- mod_wsgi-4.6.4/src/server/mod_wsgi.c.warnings
+++ mod_wsgi-4.6.4/src/server/mod_wsgi.c
@@ -2108,9 +2108,11 @@
/* Publish event for the start of the response. */
if (wsgi_event_subscribers()) {
+#if 0
WSGIThreadInfo *thread_info;
thread_info = wsgi_thread_info(0, 0);
+#endif
event = PyDict_New();
@@ -6349,10 +6351,7 @@
/* Need to cast const away. */
- if (r)
- id = &((request_rec *)r)->log_id;
- else
- id = &((conn_rec *)c)->log_id;
+ id = &((request_rec *)r)->log_id;
ap_run_generate_log_id(c, r, id);
}
@@ -8510,6 +8509,7 @@
ap_log_error(APLOG_MARK, APLOG_ALERT, errno, wsgi_server,
"mod_wsgi (pid=%d): Couldn't bind unix domain "
"socket '%s'.", getpid(), process->socket_path);
+ close(sockfd);
return -1;
}
@@ -8521,6 +8521,7 @@
ap_log_error(APLOG_MARK, APLOG_ALERT, errno, wsgi_server,
"mod_wsgi (pid=%d): Couldn't listen on unix domain "
"socket.", getpid());
+ close(sockfd);
return -1;
}
@@ -8555,6 +8556,7 @@
"mod_wsgi (pid=%d): Couldn't change owner of unix "
"domain socket '%s' to uid=%ld.", getpid(),
process->socket_path, (long)socket_uid);
+ close(sockfd);
return -1;
}
}
@@ -13338,8 +13340,10 @@
for (i = 0; i < wsgi_daemon_list->nelts; ++i) {
entry = &entries[i];
- close(entry->listener_fd);
- entry->listener_fd = -1;
+ if (entry->listener_fd != -1) {
+ close(entry->listener_fd);
+ entry->listener_fd = -1;
+ }
}
}
#endif
@@ -13751,8 +13755,8 @@
if (trusted_proxy) {
for (i=0; i<trusted_proxy_headers->nelts; i++) {
- const char *name = NULL;
- const char *value = NULL;
+ const char *name;
+ const char *value;
name = ((const char**)trusted_proxy_headers->elts)[i];
value = apr_table_get(r->subprocess_env, name);
@@ -13879,11 +13883,9 @@
*/
for (i=0; i<trusted_proxy_headers->nelts; i++) {
- const char *name = NULL;
- const char *value = NULL;
+ const char *name;
name = ((const char**)trusted_proxy_headers->elts)[i];
- value = apr_table_get(r->subprocess_env, name);
if (!strcmp(name, "HTTP_X_FORWARDED_FOR") ||
!strcmp(name, "HTTP_X_REAL_IP")) {
--- mod_wsgi-4.6.4/src/server/wsgi_logger.c.warnings
+++ mod_wsgi-4.6.4/src/server/wsgi_logger.c
@@ -694,9 +694,11 @@
PyObject *object = NULL;
if (wsgi_event_subscribers()) {
+#if 0
WSGIThreadInfo *thread_info;
thread_info = wsgi_thread_info(0, 0);
+#endif
event = PyDict_New();
--- mod_wsgi-4.6.4/src/server/wsgi_python.h.warnings
+++ mod_wsgi-4.6.4/src/server/wsgi_python.h
@@ -21,6 +21,12 @@
/* ------------------------------------------------------------------------- */
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+#ifdef _XOPEN_SOURCE
+#undef _XOPEN_SOURCE
+#endif
#include <Python.h>
#if !defined(PY_VERSION_HEX)

View File

@ -0,0 +1,181 @@
diff --git a/src/server/__init__.py b/src/server/__init__.py
index 6b4a82e..6b74ada 100644
--- a/src/server/__init__.py
+++ b/src/server/__init__.py
@@ -335,6 +335,13 @@ WSGISocketPrefix %(server_root)s/wsgi
WSGISocketRotation Off
+<IfDefine ORPHAN_INTERPRETER>
+WSGIDestroyInterpreter Off
+</IfDefine>
+<IfDefine !ORPHAN_INTERPRETER>
+WSGIDestroyInterpreter On
+</IfDefine>
+
<IfDefine !ONE_PROCESS>
WSGIRestrictEmbedded On
<IfDefine MOD_WSGI_MULTIPROCESS>
@@ -2565,6 +2572,10 @@ option_list = (
help='Specify the name of a separate log file to be used for '
'the managed service.'),
+ optparse.make_option('--orphan-interpreter', action='store_true',
+ default=False, help='Flag indicating whether should skip over '
+ 'destroying the Python interpreter on process shutdown.'),
+
optparse.make_option('--enable-docs', action='store_true', default=False,
help='Flag indicating whether the mod_wsgi documentation should '
'be made available at the /__wsgi__/docs sub URL.'),
@@ -3161,6 +3172,9 @@ def _cmd_setup_server(command, args, options):
else:
options['https_url'] = None
+ if options['orphan_interpreter']:
+ options['httpd_arguments_list'].append('-DORPHAN_INTERPRETER')
+
if any((options['enable_debugger'], options['enable_coverage'],
options['enable_profiler'], options['enable_recorder'],
options['enable_gdb'])):
diff --git a/src/server/mod_wsgi.c b/src/server/mod_wsgi.c
index 5a61999..adb5875 100644
--- a/src/server/mod_wsgi.c
+++ b/src/server/mod_wsgi.c
@@ -4289,6 +4289,11 @@ static apr_status_t wsgi_python_child_cleanup(void *data)
wsgi_publish_process_stopping(wsgi_shutdown_reason);
#endif
+ /* Skip destruction of Python interpreter. */
+
+ if (wsgi_server_config->destroy_interpreter == 0)
+ return APR_SUCCESS;
+
/* In a multithreaded MPM must protect table. */
#if APR_HAS_THREADS
@@ -5023,6 +5028,28 @@ static const char *wsgi_set_python_hash_seed(cmd_parms *cmd, void *mconfig,
return NULL;
}
+static const char *wsgi_set_destroy_interpreter(cmd_parms *cmd, void *mconfig,
+ const char *f)
+{
+ const char *error = NULL;
+ WSGIServerConfig *sconfig = NULL;
+
+ error = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (error != NULL)
+ return error;
+
+ sconfig = ap_get_module_config(cmd->server->module_config, &wsgi_module);
+
+ if (strcasecmp(f, "Off") == 0)
+ sconfig->destroy_interpreter = 0;
+ else if (strcasecmp(f, "On") == 0)
+ sconfig->destroy_interpreter = 1;
+ else
+ return "WSGIDestroyInterpreter must be one of: Off | On";
+
+ return NULL;
+}
+
static const char *wsgi_set_restrict_embedded(cmd_parms *cmd, void *mconfig,
const char *f)
{
@@ -16188,6 +16215,9 @@ static const command_rec wsgi_commands[] =
AP_INIT_TAKE1("WSGIPythonHashSeed", wsgi_set_python_hash_seed,
NULL, RSRC_CONF, "Python hash seed."),
+ AP_INIT_TAKE1("WSGIDestroyInterpreter", wsgi_set_destroy_interpreter,
+ NULL, RSRC_CONF, "Enable/Disable destruction of Python interpreter."),
+
#if defined(MOD_WSGI_WITH_DAEMONS)
AP_INIT_TAKE1("WSGIRestrictEmbedded", wsgi_set_restrict_embedded,
NULL, RSRC_CONF, "Enable/Disable use of embedded mode."),
diff --git a/src/server/wsgi_interp.c b/src/server/wsgi_interp.c
index 48680f4..a010c42 100644
--- a/src/server/wsgi_interp.c
+++ b/src/server/wsgi_interp.c
@@ -2019,6 +2019,11 @@ apr_status_t wsgi_python_term(void)
{
PyObject *module = NULL;
+ /* Skip destruction of Python interpreter. */
+
+ if (wsgi_server_config->destroy_interpreter == 0)
+ return APR_SUCCESS;
+
ap_log_error(APLOG_MARK, APLOG_INFO, 0, wsgi_server,
"mod_wsgi (pid=%d): Terminating Python.", getpid());
diff --git a/src/server/wsgi_server.c b/src/server/wsgi_server.c
index b3eca28..c038827 100644
--- a/src/server/wsgi_server.c
+++ b/src/server/wsgi_server.c
@@ -101,6 +101,7 @@ WSGIServerConfig *newWSGIServerConfig(apr_pool_t *p)
object->python_hash_seed = NULL;
+ object->destroy_interpreter = -1;
object->restrict_embedded = -1;
object->restrict_stdin = -1;
object->restrict_stdout = -1;
diff --git a/src/server/wsgi_server.h b/src/server/wsgi_server.h
index 07ded14..f1455b6 100644
--- a/src/server/wsgi_server.h
+++ b/src/server/wsgi_server.h
@@ -87,6 +87,7 @@ typedef struct {
const char *python_hash_seed;
+ int destroy_interpreter;
int restrict_embedded;
int restrict_stdin;
int restrict_stdout;
diff --git a/tests/events.wsgi b/tests/events.wsgi
index 50b9246..228ef11 100644
--- a/tests/events.wsgi
+++ b/tests/events.wsgi
@@ -5,6 +5,7 @@ import traceback
import time
import os
import threading
+import atexit
try:
mod_wsgi.request_data()
@@ -18,7 +19,7 @@ def wrapper(application):
return _application
def event_handler(name, **kwargs):
- print('EVENT', name, kwargs, os.getpid(), mod_wsgi.application_group)
+ print('EVENT-HANDLER', name, kwargs, os.getpid(), mod_wsgi.application_group)
if name == 'request_started':
thread = threading.current_thread()
request_data = kwargs['request_data']
@@ -35,12 +36,24 @@ def event_handler(name, **kwargs):
elif name == 'process_stopping':
print('SHUTDOWN', mod_wsgi.active_requests)
-print('EVENTS', mod_wsgi.event_callbacks)
+print('EVENTS#ALL', mod_wsgi.event_callbacks)
mod_wsgi.subscribe_events(event_handler)
+def shutdown_handler(event, **kwargs):
+ print('SHUTDOWN-HANDLER', event, kwargs)
+
+print('EVENTS#SHUTDOWN', mod_wsgi.event_callbacks)
+
+mod_wsgi.subscribe_shutdown(shutdown_handler)
+
print('CALLBACKS', mod_wsgi.event_callbacks)
+def atexit_handler():
+ print('ATEXIT-HANDLER')
+
+atexit.register(atexit_handler)
+
def application(environ, start_response):
failure_mode = environ.get('HTTP_X_FAILURE_MODE', '')
failure_mode = failure_mode.split()

View File

@ -0,0 +1,20 @@
diff --git a/setup.py b/setup.py
index bf272ba..824957d 100644
--- a/setup.py
+++ b/setup.py
@@ -465,15 +465,6 @@ EXTRA_COMPILE_FLAGS = (EXTRA_INCLUDES + CPPFLAGS + EXTRA_CPPFLAGS +
CFLAGS + EXTRA_CFLAGS + APR_INCLUDES + APU_INCLUDES)
EXTRA_LINK_ARGS = PYTHON_LDFLAGS + PYTHON_LDLIBS
-# Force adding of LD_RUN_PATH for platforms that may need it.
-
-if os.name != 'nt':
- LD_RUN_PATH = os.environ.get('LD_RUN_PATH', '')
- LD_RUN_PATH += ':%s:%s' % (PYTHON_LIBDIR, PYTHON_CFGDIR)
- LD_RUN_PATH = LD_RUN_PATH.lstrip(':')
-
- os.environ['LD_RUN_PATH'] = LD_RUN_PATH
-
# On MacOS X, recent versions of Apple's Apache do not support compiling
# Apache modules with a target older than 10.8. This is because it
# screws up Apache APR % formats for apr_time_t, which breaks daemon

View File

@ -0,0 +1,46 @@
From 2c9d1b3e725ad2a072e9fef4cb1cb0bb9ae2d540 Mon Sep 17 00:00:00 2001
From: Graham Dumpleton <Graham.Dumpleton@gmail.com>
Date: Sat, 13 Feb 2021 11:05:39 +1100
Subject: [PATCH] Fix deprecation warning in PyArg_ParseTuple().
---
docs/release-notes/version-4.8.0.rst | 5 +++++
src/server/wsgi_logger.c | 4 ++--
src/server/wsgi_python.h | 2 ++
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/server/wsgi_logger.c b/src/server/wsgi_logger.c
index 71c7d69e..df35887e 100644
--- a/src/server/wsgi_logger.c
+++ b/src/server/wsgi_logger.c
@@ -223,7 +223,7 @@ static PyObject *Log_isatty(LogObject *self, PyObject *args)
return Py_False;
}
-static void Log_queue(LogObject *self, const char *msg, int len)
+static void Log_queue(LogObject *self, const char *msg, Py_ssize_t len)
{
const char *p = NULL;
const char *q = NULL;
@@ -330,7 +330,7 @@ static void Log_queue(LogObject *self, const char *msg, int len)
static PyObject *Log_write(LogObject *self, PyObject *args)
{
const char *msg = NULL;
- int len = -1;
+ Py_ssize_t len = -1;
WSGIThreadInfo *thread_info = NULL;
diff --git a/src/server/wsgi_python.h b/src/server/wsgi_python.h
index 0464fe6d..5c10cae5 100644
--- a/src/server/wsgi_python.h
+++ b/src/server/wsgi_python.h
@@ -21,6 +21,8 @@
/* ------------------------------------------------------------------------- */
+#define PY_SSIZE_T_CLEAN 1
+
#include <Python.h>
#if !defined(PY_VERSION_HEX)

View File

@ -1,43 +1,44 @@
%{!?_httpd_apxs: %{expand: %%global _httpd_apxs %%{_sbindir}/apxs}}
%{!?_httpd_mmn: %{expand: %%global _httpd_mmn %%(cat %{_includedir}/httpd/.mmn 2>/dev/null || echo 0-0)}}
%{!?_httpd_confdir: %{expand: %%global _httpd_confdir %%{_sysconfdir}/httpd/conf.d}}
# /etc/httpd/conf.d with httpd < 2.4 and defined as /etc/httpd/conf.modules.d with httpd >= 2.4
%{!?_httpd_modconfdir: %{expand: %%global _httpd_modconfdir %%{_sysconfdir}/httpd/conf.d}}
%{!?_httpd_moddir: %{expand: %%global _httpd_moddir %%{_libdir}/httpd/modules}}
%if 0%{?fedora} || 0%{?rhel} > 7
%bcond_without python3
%global with_python3 1
%else
%bcond_with python3
%global with_python3 0
%endif
%if 0%{?fedora} || 0%{?rhel} <= 7
%bcond_without python2
%if (0%{?fedora} > 0 && 0%{?fedora} < 32) || (0%{?rhel} > 0 && 0%{?rhel} <= 7)
%global with_python2 1
%else
%bcond_with python2
%endif
%if %{with python3} && !%{with python2}
%global py3dir .
%global with_python2 0
%endif
Name: mod_wsgi
Version: 4.6.4
Release: 5%{?dist}
Version: 4.7.1
Release: 12%{?dist}
Summary: A WSGI interface for Python web applications in Apache
Group: System Environment/Libraries
License: ASL 2.0
URL: https://modwsgi.readthedocs.io/
Source0: https://github.com/GrahamDumpleton/mod_wsgi/archive/%{version}.tar.gz#/mod_wsgi-%{version}.tar.gz
Source1: wsgi.conf
Source2: wsgi-python3.conf
Patch1: mod_wsgi-4.5.20-exports.patch
Patch2: mod_wsgi-4.6.4-warnings.patch
Patch3: mod_wsgi-4.9.1-request-limit.patch
Patch2: mod_wsgi-4.7.1-remove-rpath.patch
Patch3: mod_wsgi-4.7.1-warning-segfaults.patch
Patch4: mod_wsgi-4.9.1-request-limit.patch
Patch5: mod_wsgi-4.7.1-dont-destroy-py-intr.patch
BuildRequires: make
BuildRequires: httpd-devel
BuildRequires: python3-sphinx
BuildRequires: gcc
# Suppress auto-provides for module DSO
%{?filter_provides_in: %filter_provides_in %{_httpd_moddir}/.*\.so$}
%{?filter_setup}
%global __provides_exclude_from %{_httpd_moddir}/.*\\.so$
%global _description\
The mod_wsgi adapter is an Apache module that provides a WSGI compliant\
@ -49,11 +50,11 @@ existing WSGI adapters for mod_python or CGI.\
%description %_description
%if %{with python2}
%if 0%{?with_python2} > 0
%package -n python2-%{name}
Summary: %summary
Requires: httpd-mmn = %{_httpd_mmn}
BuildRequires: python2-devel
BuildRequires: python2-devel, python2-setuptools
%{?python_provide:%python_provide python2-%{name}}
# Remove before F30
Provides: mod_wsgi = %{version}-%{release}
@ -64,51 +65,56 @@ Obsoletes: mod_wsgi < %{version}-%{release}
%endif
%if %{with python3}
%if 0%{?with_python3} > 0
%package -n python3-%{name}
Summary: %summary
Requires: httpd-mmn = %{_httpd_mmn}
BuildRequires: python3-devel
BuildRequires: python3-devel, python3-sphinx, python3-sphinx_rtd_theme
%if 0%{?with_python2} == 0
Provides: mod_wsgi = %{version}-%{release}
Provides: mod_wsgi%{?_isa} = %{version}-%{release}
Obsoletes: mod_wsgi < %{version}-%{release}
%endif
%description -n python3-%{name} %_description
%endif
%prep
%setup -qn %{name}-%{version}
%patch1 -p1 -b .exports
%patch2 -p1 -b .warnings
%patch3 -p1 -b .request-limit
%autosetup -p1 -n %{name}-%{version}
%if "%{py3dir}" != "."
cp -a . %{py3dir}
%endif
: Python2=%{with_python2} Python3=%{with_python3}
%build
make -C docs html
%if %{with_python3}
make -C docs html SPHINXBUILD=%{_bindir}/sphinx-build-3
%endif
export LDFLAGS="$RPM_LD_FLAGS -L%{_libdir}"
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
%if %{with python2}
%configure --enable-shared --with-apxs=%{_httpd_apxs} --with-python=python2
make %{?_smp_mflags}
%py2_build
%endif
%if %{with python3}
pushd %{py3dir}
%if 0%{?with_python3} > 0
mkdir py3build/
# this always produces an error (because of trying to copy py3build
# into itself) but we don't mind, so || :
cp -R * py3build/ || :
pushd py3build
%configure --enable-shared --with-apxs=%{_httpd_apxs} --with-python=python3
make %{?_smp_mflags}
%{make_build}
%py3_build
popd
%endif
%if 0%{?with_python2} > 0
%configure --enable-shared --with-apxs=%{_httpd_apxs} --with-python=python2
%{make_build}
%py2_build
%endif
%install
# first install python3 variant and rename the so file
%if %{with python3}
pushd %{py3dir}
%if 0%{?with_python3} > 0
pushd py3build
make install DESTDIR=$RPM_BUILD_ROOT LIBEXECDIR=%{_httpd_moddir}
mv $RPM_BUILD_ROOT%{_httpd_moddir}/mod_wsgi{,_python3}.so
@ -123,7 +129,7 @@ popd
%endif
# second install python2 variant
%if %{with python2}
%if 0%{?with_python2} > 0
make install DESTDIR=$RPM_BUILD_ROOT LIBEXECDIR=%{_httpd_moddir}
install -d -m 755 $RPM_BUILD_ROOT%{_httpd_modconfdir}
@ -135,7 +141,7 @@ mv $RPM_BUILD_ROOT%{_bindir}/mod_wsgi-express{,-2}
ln -s %{_bindir}/mod_wsgi-express-2 $RPM_BUILD_ROOT%{_bindir}/mod_wsgi-express
%endif
%if %{with python2}
%if 0%{?with_python2} > 0
%files -n python2-%{name}
%license LICENSE
%doc CREDITS.rst README.rst
@ -147,7 +153,7 @@ ln -s %{_bindir}/mod_wsgi-express-2 $RPM_BUILD_ROOT%{_bindir}/mod_wsgi-express
%{_bindir}/mod_wsgi-express
%endif
%if %{with python3}
%if 0%{?with_python3} > 0
%files -n python3-%{name}
%license LICENSE
%doc CREDITS.rst README.rst
@ -159,31 +165,102 @@ ln -s %{_bindir}/mod_wsgi-express-2 $RPM_BUILD_ROOT%{_bindir}/mod_wsgi-express
%endif
%changelog
* Tue Sep 06 2022 Luboš Uhliarik <luhliari@redhat.com> - 4.6.4-5
- Resolves: #2122695 - Core dumped upon file upload >= 1GB
* Thu Jun 05 2025 Luboš Uhliarik <luhliari@redhat.com> - 4.7.1-12
- Resolves: RHEL-65419 - httpd with python3-mod_wsgi is stalling in process
destruction
* Wed Dec 04 2019 Lubos Uhliarik <luhliari@redhat.com> - 4.6.4-4
- Resolves: #1779705 - python3-mod_wsgi: Remove the Provides and Obsoletes for
the name `mod_wsgi`
* Thu Sep 01 2022 Luboš Uhliarik <luhliari@redhat.com> - 4.7.1-11
- Resolves: #2122694 - Core dumped upon file upload >= 1GB
* Thu Dec 13 2018 Joe Orton <jorton@redhat.com> - 4.6.4-3
- avoid unstripped binaries, re-enable debugsource generation (#1659086)
* Thu Apr 07 2022 Luboš Uhliarik <luhliari@redhat.com> - 4.7.1-10
- Resolves: #2072969 - Missing debuginfo
* Tue Dec 11 2018 Joe Orton <jorton@redhat.com> - 4.6.4-2
- fix covscan warnings (#1602620)
* Tue Feb 08 2022 Tomas Orsava <torsava@redhat.com> - 4.7.1-9
- Add automatically generated Obsoletes tag with the python39- prefix
for smoother upgrade from RHEL8
- Use the modern way of filtering Provides not to interfere with modern Python
RPM generators
- Related: rhbz#1990421
* Wed Jun 27 2018 Joe Orton <jorton@redhat.com> - 4.6.4-1
- update to 4.6.4 (#1592687)
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 4.7.1-8
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Tue Jun 26 2018 Tomas Orsava <torsava@redhat.com> - 4.6.2-5
- Switch to using Python 3 version of sphinx
* Thu Jul 01 2021 Luboš Uhliarik <luhliari@redhat.com> - 4.7.1-7
- Resolves: #1976169 - mod_wsgi segfaults when python program outputs a warning
message
* Tue Jun 26 2018 Tomas Orsava <torsava@redhat.com> - 4.6.2-4
- Update conditionals into bcond's so they can be manipulated during modular
builds
* Tue Jun 08 2021 Luboš Uhliarik <luhliari@redhat.com> - 4.7.1-6
- Resolves: #1969555 - remove rpath
* Tue Jun 26 2018 Tomas Orsava <torsava@redhat.com> - 4.6.2-3
- Fix the invocation of Python 2 to a versioned executable
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 4.7.1-5
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.7.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.7.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue May 26 2020 Miro Hrončok <mhroncok@redhat.com> - 4.7.1-2
- Rebuilt for Python 3.9
* Wed May 13 2020 Joe Orton <jorton@redhat.com> - 4.7.1-1
- update to 4.7.1 (#1721376)
* Thu Feb 13 2020 Tom Stellard <tstellar@redhat.com> - 4.6.8-3
- Use make_build macro instead of just make
- https://docs.fedoraproject.org/en-US/packaging-guidelines/#_parallel_make
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.6.8-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Mon Nov 11 2019 Joe Orton <jorton@redhat.com> - 4.6.8-1
- update to 4.6.8 (#1721376)
* Mon Nov 11 2019 Joe Orton <jorton@redhat.com> - 4.6.6-6
- try again to drop Python 2
* Tue Oct 29 2019 Joe Orton <jorton@redhat.com> - 4.6.6-5
- drop python2 build
* Thu Oct 03 2019 Miro Hrončok <mhroncok@redhat.com> - 4.6.6-4
- Rebuilt for Python 3.8.0rc1 (#1748018)
* Mon Aug 19 2019 Miro Hrončok <mhroncok@redhat.com> - 4.6.6-3
- Rebuilt for Python 3.8
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.6.6-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Fri Jun 07 2019 Matthias Runge <mrunge@redhat.com> - 4.6.6-1
- update to 4.6.6 (rhbz#1718151)
* Wed May 29 2019 Miro Hrončok <mhroncok@redhat.com> - 4.6.5-1
- update to 4.6.5
* Tue Apr 16 2019 Joe Orton <jorton@redhat.com> - 4.6.4-4
- only build docs with Python 3
- fix build on Fedora>30 and RHEL 7
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.6.4-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Tue Jul 31 2018 Adam Williamson <awilliam@redhat.com> - 4.6.4-2
- Run Python 3 build in a subdir, so module isn't linked against both
libpython 2 and libpython 3 (rhbz#1609491)
* Fri Jul 20 2018 Matthias Runge <mrunge@redhat.com> - 4.6.4-1
- update to 4.6.4 (rhbz#1560329)
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.6.2-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Tue Jun 19 2018 Miro Hrončok <mhroncok@redhat.com> - 4.6.2-4
- Rebuilt for Python 3.7
* Fri Apr 20 2018 Joe Orton <jorton@redhat.com> - 4.6.2-3
- use sphinx-build-3 if python2 support is disabled
* Thu Mar 22 2018 Troy Dawson <tdawson@redhat.com> - 4.6.2-2
- Update conditionals.