Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package supervisor for openSUSE:Factory checked in at 2023-01-03 15:06:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/supervisor (Old) and /work/SRC/openSUSE:Factory/.supervisor.new.1563 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "supervisor" Tue Jan 3 15:06:29 2023 rev:7 rq:1046522 version:4.2.5 Changes: -------- --- /work/SRC/openSUSE:Factory/supervisor/supervisor.changes 2022-04-25 23:36:19.406483375 +0200 +++ /work/SRC/openSUSE:Factory/.supervisor.new.1563/supervisor.changes 2023-01-03 15:06:42.262978776 +0100 @@ -1,0 +2,24 @@ +Tue Jan 3 13:02:01 UTC 2023 - Dirk Müller <[email protected]> + +- update to 4.2.5: + * Fixed a bug where the XML-RPC method ``supervisor.startProcess()`` would + return 500 Internal Server Error instead of an XML-RPC fault response + if the command could not be parsed. + * Fixed a bug on Python 2.7 where a ``UnicodeDecodeError`` may have + occurred when using the web interface. + * Removed use of ``urllib.parse`` functions ``splithost``, ``splitport``, + and ``splittype`` deprecated in Python 3.8. + * Removed use of ``asynchat`` and ``asyncore`` deprecated in Python 3.10. + * The return value of the XML-RPC method ``supervisor.getAllConfigInfo()`` + now includes the ``directory``, ``uid``, and ``serverurl`` of the + program. + * If a subprocess exits with a unexpected exit code (one not listed in + ``exitcodes=`` in a ``[program:x]`` section) then the exit will now be logged + at the ``WARN`` level instead of ``INFO``. + * ``supervisorctl shutdown`` now shows an error message if an argument is + given. + * File descriptors are now closed using the faster ``os.closerange()`` + instead + of calling ``os.close()`` in a loop. + +------------------------------------------------------------------- Old: ---- supervisor-4.2.4.tar.gz New: ---- supervisor-4.2.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ supervisor.spec ++++++ --- /var/tmp/diff_new_pack.jwk6lz/_old 2023-01-03 15:06:42.670981157 +0100 +++ /var/tmp/diff_new_pack.jwk6lz/_new 2023-01-03 15:06:42.674981180 +0100 @@ -1,7 +1,7 @@ # # spec file for package supervisor # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: supervisor -Version: 4.2.4 +Version: 4.2.5 Release: 0 Summary: A system for controlling process state under UNIX License: SUSE-Repoze ++++++ supervisor-4.2.4.tar.gz -> supervisor-4.2.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/CHANGES.rst new/supervisor-4.2.5/CHANGES.rst --- old/supervisor-4.2.4/CHANGES.rst 2021-12-30 21:38:49.000000000 +0100 +++ new/supervisor-4.2.5/CHANGES.rst 2022-12-24 01:25:40.000000000 +0100 @@ -1,3 +1,32 @@ +4.2.5 (2022-12-23) +------------------ + +- Fixed a bug where the XML-RPC method ``supervisor.startProcess()`` would + return 500 Internal Server Error instead of an XML-RPC fault response + if the command could not be parsed. Patch by Julien Le Cléach. + +- Fixed a bug on Python 2.7 where a ``UnicodeDecodeError`` may have occurred + when using the web interface. Patch by Vinay Sajip. + +- Removed use of ``urllib.parse`` functions ``splithost``, ``splitport``, and + ``splittype`` deprecated in Python 3.8. + +- Removed use of ``asynchat`` and ``asyncore`` deprecated in Python 3.10. + +- The return value of the XML-RPC method ``supervisor.getAllConfigInfo()`` + now includes the ``directory``, ``uid``, and ``serverurl`` of the + program. Patch by Yellmean. + +- If a subprocess exits with a unexpected exit code (one not listed in + ``exitcodes=`` in a ``[program:x]`` section) then the exit will now be logged + at the ``WARN`` level instead of ``INFO``. Patch by Precy Lee. + +- ``supervisorctl shutdown`` now shows an error message if an argument is + given. + +- File descriptors are now closed using the faster ``os.closerange()`` instead + of calling ``os.close()`` in a loop. Patch by tyong920. + 4.2.4 (2021-12-30) ------------------ @@ -1365,7 +1394,7 @@ supervisorctl. To start a group, use ``start groupname:*``. To start multiple groups, use ``start groupname1:* groupname2:*``. Equivalent commands work for "stop" and "restart". You can mix and match short - processnames, fullly-specified group:process names, and groupsplats on the + processnames, fully-specified group:process names, and groupsplats on the same line for any of these commands. - Added ``directory`` option to process config. If you set this @@ -1421,7 +1450,7 @@ supervisor will fail to start. - The Python string expression ``%(here)s`` (referring to the directory in - which the the configuration file was found) can be used within the + which the configuration file was found) can be used within the following sections/options within the config file:: unix_http_server:file @@ -1575,7 +1604,7 @@ channel. The keys "log_stderr" and "log_stdout" have been removed. -- ``[program:x]`` config file sections now represent "homgeneous process +- ``[program:x]`` config file sections now represent "homogeneous process groups" instead of single processes. A "numprocs" key in the section represents the number of processes that are in the group. A "process_name" key in the section allows composition of the each process' name within the @@ -1690,7 +1719,7 @@ - Processes which started successfully after failing to start initially are no longer reported in BACKOFF state once they are - started successfully (thanks to Damjan from Macdonia for the bug + started successfully (thanks to Damjan from Macedonia for the bug report). - Add new 'maintail' command to supervisorctl shell, which allows diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/COPYRIGHT.txt new/supervisor-4.2.5/COPYRIGHT.txt --- old/supervisor-4.2.4/COPYRIGHT.txt 2020-10-20 19:51:11.000000000 +0200 +++ new/supervisor-4.2.5/COPYRIGHT.txt 2022-12-23 23:54:41.000000000 +0100 @@ -1,27 +1,6 @@ Supervisor is Copyright (c) 2006-2015 Agendaless Consulting and Contributors. (http://www.agendaless.com), All Rights Reserved - This software is subject to the provisions of the license at - http://www.repoze.org/LICENSE.txt . A copy of this license should - accompany this distribution. THIS SOFTWARE IS PROVIDED "AS IS" AND - ANY AND ALL EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF TITLE, - MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS FOR A PARTICULAR - PURPOSE. - medusa was (is?) Copyright (c) Sam Rushing. http_client.py code Copyright (c) by Daniel Krech, http://eikeon.com/. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/PKG-INFO new/supervisor-4.2.5/PKG-INFO --- old/supervisor-4.2.4/PKG-INFO 2021-12-30 21:46:08.063434600 +0100 +++ new/supervisor-4.2.5/PKG-INFO 2022-12-24 01:52:25.397257600 +0100 @@ -1,12 +1,11 @@ Metadata-Version: 2.1 Name: supervisor -Version: 4.2.4 +Version: 4.2.5 Summary: A system for controlling process state under UNIX Home-page: http://supervisord.org/ Author: Chris McDonough Author-email: [email protected] License: BSD-derived (http://www.repoze.org/LICENSE.txt) -Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: No Input/Output (Daemon) Classifier: Intended Audience :: System Administrators @@ -24,6 +23,8 @@ Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 Provides-Extra: testing License-File: LICENSES.txt @@ -70,6 +71,35 @@ on GitHub. +4.2.5 (2022-12-23) +------------------ + +- Fixed a bug where the XML-RPC method ``supervisor.startProcess()`` would + return 500 Internal Server Error instead of an XML-RPC fault response + if the command could not be parsed. Patch by Julien Le Cléach. + +- Fixed a bug on Python 2.7 where a ``UnicodeDecodeError`` may have occurred + when using the web interface. Patch by Vinay Sajip. + +- Removed use of ``urllib.parse`` functions ``splithost``, ``splitport``, and + ``splittype`` deprecated in Python 3.8. + +- Removed use of ``asynchat`` and ``asyncore`` deprecated in Python 3.10. + +- The return value of the XML-RPC method ``supervisor.getAllConfigInfo()`` + now includes the ``directory``, ``uid``, and ``serverurl`` of the + program. Patch by Yellmean. + +- If a subprocess exits with a unexpected exit code (one not listed in + ``exitcodes=`` in a ``[program:x]`` section) then the exit will now be logged + at the ``WARN`` level instead of ``INFO``. Patch by Precy Lee. + +- ``supervisorctl shutdown`` now shows an error message if an argument is + given. + +- File descriptors are now closed using the faster ``os.closerange()`` instead + of calling ``os.close()`` in a loop. Patch by tyong920. + 4.2.4 (2021-12-30) ------------------ @@ -1437,7 +1467,7 @@ supervisorctl. To start a group, use ``start groupname:*``. To start multiple groups, use ``start groupname1:* groupname2:*``. Equivalent commands work for "stop" and "restart". You can mix and match short - processnames, fullly-specified group:process names, and groupsplats on the + processnames, fully-specified group:process names, and groupsplats on the same line for any of these commands. - Added ``directory`` option to process config. If you set this @@ -1493,7 +1523,7 @@ supervisor will fail to start. - The Python string expression ``%(here)s`` (referring to the directory in - which the the configuration file was found) can be used within the + which the configuration file was found) can be used within the following sections/options within the config file:: unix_http_server:file @@ -1647,7 +1677,7 @@ channel. The keys "log_stderr" and "log_stdout" have been removed. -- ``[program:x]`` config file sections now represent "homgeneous process +- ``[program:x]`` config file sections now represent "homogeneous process groups" instead of single processes. A "numprocs" key in the section represents the number of processes that are in the group. A "process_name" key in the section allows composition of the each process' name within the @@ -1762,7 +1792,7 @@ - Processes which started successfully after failing to start initially are no longer reported in BACKOFF state once they are - started successfully (thanks to Damjan from Macdonia for the bug + started successfully (thanks to Damjan from Macedonia for the bug report). - Add new 'maintail' command to supervisorctl shell, which allows @@ -1958,5 +1988,3 @@ ------------------------------- Initial release. - - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/docs/api.rst new/supervisor-4.2.5/docs/api.rst --- old/supervisor-4.2.4/docs/api.rst 2020-10-20 19:51:11.000000000 +0200 +++ new/supervisor-4.2.5/docs/api.rst 2022-12-24 01:00:25.000000000 +0100 @@ -321,6 +321,8 @@ same elements as the struct returned by ``getProcessInfo``. If the process table is empty, an empty array is returned. + .. automethod:: getAllConfigInfo + .. automethod:: startProcess .. automethod:: startAllProcesses diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/docs/configuration.rst new/supervisor-4.2.5/docs/configuration.rst --- old/supervisor-4.2.4/docs/configuration.rst 2021-11-04 01:22:44.000000000 +0100 +++ new/supervisor-4.2.5/docs/configuration.rst 2022-12-24 01:10:22.000000000 +0100 @@ -291,7 +291,7 @@ activity log. One of ``critical``, ``error``, ``warn``, ``info``, ``debug``, ``trace``, or ``blather``. Note that at log level ``debug``, the supervisord log file will record the stderr/stdout - output of its child processes and extended info info about process + output of its child processes and extended info about process state changes, which is useful for debugging a process which isn't starting properly. See also: :ref:`activity_log_levels`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/docs/events.rst new/supervisor-4.2.5/docs/events.rst --- old/supervisor-4.2.4/docs/events.rst 2020-10-20 19:51:11.000000000 +0200 +++ new/supervisor-4.2.5/docs/events.rst 2022-12-24 01:00:25.000000000 +0100 @@ -177,7 +177,7 @@ poolserial An integer assigned to each event by the 30 eventlistener pool which it is being sent from. No two events generated by the same - eventlister pool during the lifetime of a + eventlistener pool during the lifetime of a :program:`supervisord` process will have the same ``poolserial`` number. This value can be used to detect event ordering anomalies. @@ -375,7 +375,7 @@ these event types. In the below list, we indicate that some event types have a "body" -which is a a *token set*. A token set consists of a set of charaters +which is a a *token set*. A token set consists of a set of characters with space-separated tokens. Each token represents a key-value pair. The key and value are separated by a colon. For example: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/docs/subprocess.rst new/supervisor-4.2.5/docs/subprocess.rst --- old/supervisor-4.2.4/docs/subprocess.rst 2021-02-23 18:55:45.000000000 +0100 +++ new/supervisor-4.2.5/docs/subprocess.rst 2022-12-24 01:00:25.000000000 +0100 @@ -248,7 +248,7 @@ Subprocess State Transition Graph A process is in the ``STOPPED`` state if it has been stopped -adminstratively or if it has never been started. +administratively or if it has never been started. When an autorestarting process is in the ``BACKOFF`` state, it will be automatically restarted by :program:`supervisord`. It will switch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/setup.py new/supervisor-4.2.5/setup.py --- old/supervisor-4.2.4/setup.py 2021-10-08 07:56:58.000000000 +0200 +++ new/supervisor-4.2.5/setup.py 2022-12-23 23:54:41.000000000 +0100 @@ -64,6 +64,8 @@ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", ] version_txt = os.path.join(here, 'supervisor/version.txt') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/datatypes.py new/supervisor-4.2.5/supervisor/datatypes.py --- old/supervisor-4.2.4/supervisor/datatypes.py 2021-11-04 01:43:42.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/datatypes.py 2022-12-23 23:54:41.000000000 +0100 @@ -391,10 +391,7 @@ 'gb': 1024*1024*long(1024),}) def url(value): - # earlier Python 2.6 urlparse (2.6.4 and under) can't parse unix:// URLs, - # later ones can but we need to straddle - uri = value.replace('unix://', 'http://', 1).strip() - scheme, netloc, path, params, query, fragment = urlparse.urlparse(uri) + scheme, netloc, path, params, query, fragment = urlparse.urlparse(value) if scheme and (netloc or path): return value raise ValueError("value %r is not a URL" % value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/dispatchers.py new/supervisor-4.2.5/supervisor/dispatchers.py --- old/supervisor-4.2.4/supervisor/dispatchers.py 2021-02-27 01:27:51.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/dispatchers.py 2022-12-24 01:00:25.000000000 +0100 @@ -1,4 +1,5 @@ import errno +from supervisor.medusa.asynchat_25 import find_prefix_at_end from supervisor.medusa.asyncore_25 import compact_traceback from supervisor.compat import as_string @@ -10,12 +11,6 @@ from supervisor.states import getEventListenerStateDescription from supervisor import loggers -def find_prefix_at_end(haystack, needle): - l = len(needle) - 1 - while l and not haystack.endswith(needle[:l]): - l -= 1 - return l - class PDispatcher: """ Asyncore dispatcher for mainloop, representing a process channel (stdin, stdout, or stderr). This class is abstract. """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/http.py new/supervisor-4.2.5/supervisor/http.py --- old/supervisor-4.2.4/supervisor/http.py 2021-03-19 18:27:45.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/http.py 2022-12-24 01:00:25.000000000 +0100 @@ -739,7 +739,7 @@ if logfile is None or not os.path.exists(logfile): # we return 404 because no logfile is a temporary condition. # if the process has never been started, no logfile will exist - # on disk. a logfile of None is also a temporay condition, + # on disk. a logfile of None is also a temporary condition, # since the config file can be reloaded. request.error(404) # not found return diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/medusa/producers.py new/supervisor-4.2.5/supervisor/medusa/producers.py --- old/supervisor-4.2.4/supervisor/medusa/producers.py 2020-10-20 19:51:11.000000000 +0200 +++ new/supervisor-4.2.5/supervisor/medusa/producers.py 2022-12-24 01:00:25.000000000 +0100 @@ -11,7 +11,7 @@ producer, then wrap this with the 'chunked' transfer-encoding producer. """ -from asynchat import find_prefix_at_end +from supervisor.medusa.asynchat_25 import find_prefix_at_end from supervisor.compat import as_bytes class simple_producer: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/options.py new/supervisor-4.2.5/supervisor/options.py --- old/supervisor-4.2.4/supervisor/options.py 2021-12-28 21:04:53.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/options.py 2022-12-24 01:10:22.000000000 +0100 @@ -1314,11 +1314,7 @@ def cleanup_fds(self): # try to close any leaked file descriptors (for reload) start = 5 - for x in range(start, self.minfds): - try: - os.close(x) - except OSError: - pass + os.closerange(start, self.minfds) def kill(self, pid, signal): os.kill(pid, signal) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/process.py new/supervisor-4.2.5/supervisor/process.py --- old/supervisor-4.2.4/supervisor/process.py 2021-11-04 03:46:56.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/process.py 2022-12-23 23:54:41.000000000 +0100 @@ -568,6 +568,11 @@ msg = "stopped: %s (%s)" % (processname, msg) self._assertInState(ProcessStates.STOPPING) self.change_state(ProcessStates.STOPPED) + if exit_expected: + self.config.options.logger.info(msg) + else: + self.config.options.logger.warn(msg) + elif too_quickly: # the program did not stay up long enough to make it to RUNNING @@ -577,6 +582,7 @@ msg = "exited: %s (%s)" % (processname, msg + "; not expected") self._assertInState(ProcessStates.STARTING) self.change_state(ProcessStates.BACKOFF) + self.config.options.logger.warn(msg) else: # this finish was not the result of a stop request, the @@ -598,13 +604,13 @@ # expected exit code msg = "exited: %s (%s)" % (processname, msg + "; expected") self.change_state(ProcessStates.EXITED, expected=True) + self.config.options.logger.info(msg) else: # unexpected exit code self.spawnerr = 'Bad exit code %s' % es msg = "exited: %s (%s)" % (processname, msg + "; not expected") self.change_state(ProcessStates.EXITED, expected=False) - - self.config.options.logger.info(msg) + self.config.options.logger.warn(msg) self.pid = 0 self.config.options.close_parent_pipes(self.pipes) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/rpcinterface.py new/supervisor-4.2.5/supervisor/rpcinterface.py --- old/supervisor-4.2.4/supervisor/rpcinterface.py 2021-02-23 18:55:45.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/rpcinterface.py 2022-12-24 01:00:25.000000000 +0100 @@ -15,6 +15,7 @@ from supervisor.options import readFile from supervisor.options import tailFile +from supervisor.options import BadCommand from supervisor.options import NotExecutable from supervisor.options import NotFound from supervisor.options import NoPermission @@ -59,7 +60,7 @@ def getAPIVersion(self): """ Return the version of the RPC API used by supervisord - @return string version version id + @return string version id """ self._update('getAPIVersion') return API_VERSION @@ -69,7 +70,7 @@ def getSupervisorVersion(self): """ Return the version of the supervisor package in use by supervisord - @return string version version id + @return string version id """ self._update('getSupervisorVersion') return VERSION @@ -293,7 +294,7 @@ filename, argv = process.get_execv_args() except NotFound as why: raise RPCError(Faults.NO_FILE, why.args[0]) - except (NotExecutable, NoPermission) as why: + except (BadCommand, NotExecutable, NoPermission) as why: raise RPCError(Faults.NOT_EXECUTABLE, why.args[0]) if process.get_state() in RUNNING_STATES: @@ -567,6 +568,8 @@ inuse = gconfig.name in self.supervisord.process_groups for pconfig in gconfig.process_configs: d = {'autostart': pconfig.autostart, + 'directory': pconfig.directory, + 'uid': pconfig.uid, 'command': pconfig.command, 'exitcodes': pconfig.exitcodes, 'group': gconfig.name, @@ -592,6 +595,7 @@ 'stderr_logfile_backups': pconfig.stderr_logfile_backups, 'stderr_logfile_maxbytes': pconfig.stderr_logfile_maxbytes, 'stderr_syslog': pconfig.stderr_syslog, + 'serverurl': pconfig.serverurl, } # no support for these types in xml-rpc d.update((k, 'auto') for k, v in d.items() if v is Automatic) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/supervisorctl.py new/supervisor-4.2.5/supervisor/supervisorctl.py --- old/supervisor-4.2.4/supervisor/supervisorctl.py 2021-03-19 18:58:56.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/supervisorctl.py 2022-12-24 01:00:25.000000000 +0100 @@ -977,6 +977,12 @@ " see reread and update.") def do_shutdown(self, arg): + if arg: + self.ctl.output('Error: shutdown accepts no arguments') + self.ctl.exitstatus = LSBInitExitStatuses.GENERIC + self.help_shutdown() + return + if self.ctl.options.interactive: yesno = raw_input('Really shut the remote supervisord process ' 'down y/N? ') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/supervisord.py new/supervisor-4.2.5/supervisor/supervisord.py --- old/supervisor-4.2.4/supervisor/supervisord.py 2021-02-24 00:31:03.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/supervisord.py 2022-12-24 01:00:25.000000000 +0100 @@ -282,7 +282,7 @@ del self.options.pidhistory[pid] if not once: # keep reaping until no more kids to reap, but don't recurse - # infintely + # infinitely self.reap(once=False, recursionguard=recursionguard+1) def handle_signal(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/templating.py new/supervisor-4.2.5/supervisor/templating.py --- old/supervisor-4.2.4/supervisor/templating.py 2020-10-20 19:51:11.000000000 +0200 +++ new/supervisor-4.2.5/supervisor/templating.py 2022-12-24 01:00:25.000000000 +0100 @@ -511,7 +511,7 @@ parent = self.parent i = self.deparent() if i is not None: - # reduce function call overhead by not calliing self.insert + # reduce function call overhead by not calling self.insert node = Replace(text, structure) parent._children.insert(i, node) node.parent = parent diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/base.py new/supervisor-4.2.5/supervisor/tests/base.py --- old/supervisor-4.2.4/supervisor/tests/base.py 2021-12-28 23:28:23.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/base.py 2022-12-23 23:55:22.000000000 +0100 @@ -593,8 +593,8 @@ for key in substitutions.keys(): data = data.replace('<<%s>>' % key.upper(), substitutions[key]) - tmpnam = tempfile.mktemp(prefix=last) - with open(tmpnam, 'w') as f: + with tempfile.NamedTemporaryFile(prefix=last, delete=False) as f: + tmpnam = f.name f.write(data) os.chmod(tmpnam, 0o755) return tmpnam diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_datatypes.py new/supervisor-4.2.5/supervisor/tests/test_datatypes.py --- old/supervisor-4.2.4/supervisor/tests/test_datatypes.py 2021-11-04 01:41:07.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/test_datatypes.py 2022-12-24 01:00:25.000000000 +0100 @@ -19,7 +19,7 @@ name = " foo\t" self.assertEqual(self._callFUT(name), "foo") - def test_disallows_inner_spaces_for_eventlister_protocol(self): + def test_disallows_inner_spaces_for_eventlistener_protocol(self): name = "foo bar" self.assertRaises(ValueError, self._callFUT, name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_events.py new/supervisor-4.2.5/supervisor/tests/test_events.py --- old/supervisor-4.2.4/supervisor/tests/test_events.py 2020-10-20 19:51:11.000000000 +0200 +++ new/supervisor-4.2.5/supervisor/tests/test_events.py 2022-12-24 01:00:25.000000000 +0100 @@ -72,7 +72,7 @@ self.assertEqual(inst.pid, 2) self.assertEqual(inst.data, 3) - def test_ProcessLogEvent_inheritence(self): + def test_ProcessLogEvent_inheritance(self): from supervisor.events import ProcessLogEvent from supervisor.events import Event self.assertTrue( @@ -87,7 +87,7 @@ self.assertEqual(inst.data, 3) self.assertEqual(inst.channel, 'stdout') - def test_ProcessLogStdoutEvent_inheritence(self): + def test_ProcessLogStdoutEvent_inheritance(self): from supervisor.events import ProcessLogStdoutEvent from supervisor.events import ProcessLogEvent self.assertTrue( @@ -102,7 +102,7 @@ self.assertEqual(inst.data, 3) self.assertEqual(inst.channel, 'stderr') - def test_ProcessLogStderrEvent_inheritence(self): + def test_ProcessLogStderrEvent_inheritance(self): from supervisor.events import ProcessLogStderrEvent from supervisor.events import ProcessLogEvent self.assertTrue( @@ -116,7 +116,7 @@ self.assertEqual(inst.pid, 2) self.assertEqual(inst.data, 3) - def test_ProcessCommunicationEvent_inheritence(self): + def test_ProcessCommunicationEvent_inheritance(self): from supervisor.events import ProcessCommunicationEvent from supervisor.events import Event self.assertTrue( @@ -131,7 +131,7 @@ self.assertEqual(inst.data, 3) self.assertEqual(inst.channel, 'stdout') - def test_ProcessCommunicationStdoutEvent_inheritence(self): + def test_ProcessCommunicationStdoutEvent_inheritance(self): from supervisor.events import ProcessCommunicationStdoutEvent from supervisor.events import ProcessCommunicationEvent self.assertTrue( @@ -147,7 +147,7 @@ self.assertEqual(inst.data, 3) self.assertEqual(inst.channel, 'stderr') - def test_ProcessCommunicationStderrEvent_inheritence(self): + def test_ProcessCommunicationStderrEvent_inheritance(self): from supervisor.events import ProcessCommunicationStderrEvent from supervisor.events import ProcessCommunicationEvent self.assertTrue( @@ -161,7 +161,7 @@ self.assertEqual(inst.type, 1) self.assertEqual(inst.data, 2) - def test_RemoteCommunicationEvent_inheritence(self): + def test_RemoteCommunicationEvent_inheritance(self): from supervisor.events import RemoteCommunicationEvent from supervisor.events import Event self.assertTrue( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_http.py new/supervisor-4.2.5/supervisor/tests/test_http.py --- old/supervisor-4.2.4/supervisor/tests/test_http.py 2021-03-19 18:27:45.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/test_http.py 2022-12-24 01:10:43.000000000 +0100 @@ -169,8 +169,8 @@ def test_handle_more_follow_file_gone(self): request = DummyRequest('/logtail/foo', None, None, None) - filename = tempfile.mktemp() - with open(filename, 'wb') as f: + with tempfile.NamedTemporaryFile(delete=False) as f: + filename = f.name f.write(b'a' * 80) try: producer = self._makeOne(request, f.name, 80) @@ -605,7 +605,7 @@ if socketfile is not None: os.unlink(socketfile) finally: - from asyncore import socket_map + from supervisor.medusa.asyncore_25 import socket_map socket_map.clear() return servers @@ -620,7 +620,10 @@ self.assertEqual(exc.args[0], 'Cannot determine socket type 999') def test_make_http_servers_noauth(self): - socketfile = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=True) as f: + socketfile = f.name + self.assertFalse(os.path.exists(socketfile)) + inet = {'family':socket.AF_INET, 'host':'localhost', 'port':17735, 'username':None, 'password':None, 'section':'inet_http_server'} unix = {'family':socket.AF_UNIX, 'file':socketfile, 'chmod':0o700, @@ -647,7 +650,10 @@ self.assertEqual([x.IDENT for x in server.handlers], idents) def test_make_http_servers_withauth(self): - socketfile = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=True) as f: + socketfile = f.name + self.assertFalse(os.path.exists(socketfile)) + inet = {'family':socket.AF_INET, 'host':'localhost', 'port':17736, 'username':'username', 'password':'password', 'section':'inet_http_server'} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_options.py new/supervisor-4.2.5/supervisor/tests/test_options.py --- old/supervisor-4.2.4/supervisor/tests/test_options.py 2021-12-28 20:55:49.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/test_options.py 2022-12-24 01:10:43.000000000 +0100 @@ -1388,9 +1388,9 @@ "section [inet_http_server] has no port value") def test_cleanup_afunix_unlink(self): - fn = tempfile.mktemp() - with open(fn, 'w') as f: - f.write('foo') + with tempfile.NamedTemporaryFile(delete=False) as f: + fn = f.name + f.write(b'foo') instance = self._makeOne() instance.unlink_socketfiles = True class Server: @@ -1402,10 +1402,10 @@ self.assertFalse(os.path.exists(fn)) def test_cleanup_afunix_nounlink(self): - fn = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=False) as f: + fn = f.name + f.write(b'foo') try: - with open(fn, 'w') as f: - f.write('foo') instance = self._makeOne() class Server: pass @@ -1423,10 +1423,10 @@ def test_cleanup_afunix_ignores_oserror_enoent(self): notfound = os.path.join(os.path.dirname(__file__), 'notfound') - socketname = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=False) as f: + socketname = f.name + f.write(b'foo') try: - with open(socketname, 'w') as f: - f.write('foo') instance = self._makeOne() instance.unlink_socketfiles = True class Server: @@ -1445,10 +1445,10 @@ pass def test_cleanup_removes_pidfile(self): - pidfile = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=False) as f: + pidfile = f.name + f.write(b'2') try: - with open(pidfile, 'w') as f: - f.write('2') instance = self._makeOne() instance.pidfile = pidfile instance.logger = DummyLogger() @@ -1469,10 +1469,9 @@ instance.cleanup() # shouldn't raise def test_cleanup_does_not_remove_pidfile_from_another_supervisord(self): - pidfile = tempfile.mktemp() - - with open(pidfile, 'w') as f: - f.write('1234') + with tempfile.NamedTemporaryFile(delete=False) as f: + pidfile = f.name + f.write(b'1234') try: instance = self._makeOne() @@ -1490,10 +1489,10 @@ pass def test_cleanup_closes_poller(self): - pidfile = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=False) as f: + pidfile = f.name + f.write(b'2') try: - with open(pidfile, 'w') as f: - f.write('2') instance = self._makeOne() instance.pidfile = pidfile @@ -1508,21 +1507,15 @@ except OSError: pass - def test_cleanup_fds_closes_5_upto_minfds_ignores_oserror(self): + @patch('os.closerange', Mock()) + def test_cleanup_fds_closes_5_upto_minfds(self): instance = self._makeOne() instance.minfds = 10 - closed = [] - def close(fd): - if fd == 7: - raise OSError - closed.append(fd) - - @patch('os.close', close) def f(): instance.cleanup_fds() f() - self.assertEqual(closed, [5,6,8,9]) + os.closerange.assert_called_with(5, 10) def test_close_httpservers(self): instance = self._makeOne() @@ -1594,7 +1587,10 @@ self.assertEqual(logger.data[0], 'supervisord logreopen') def test_write_pidfile_ok(self): - fn = tempfile.mktemp() + with tempfile.NamedTemporaryFile(delete=True) as f: + fn = f.name + self.assertFalse(os.path.exists(fn)) + try: instance = self._makeOne() instance.logger = DummyLogger() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_process.py new/supervisor-4.2.5/supervisor/tests/test_process.py --- old/supervisor-4.2.4/supervisor/tests/test_process.py 2021-12-28 23:26:24.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/test_process.py 2022-12-24 01:00:25.000000000 +0100 @@ -783,7 +783,7 @@ # Sleep for 2 seconds time.sleep(2) - # This iteration of stop_report() should actaully trigger the report + # This iteration of stop_report() should actually trigger the report instance.stop_report() self.assertEqual(len(options.logger.data), 1) @@ -1579,7 +1579,7 @@ # Sleep for (startsecs + 1) time.sleep(test_startsecs + 1) - # This iteration of transition() should actaully trigger the state + # This iteration of transition() should actually trigger the state # transition to RUNNING process.transition() @@ -1625,7 +1625,7 @@ # Ensure process.delay has rolled backward self.assertTrue(process.delay < future_time) - # This iteration of transition() should actaully trigger the state + # This iteration of transition() should actually trigger the state # transition to STARTING process.transition() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_rpcinterfaces.py new/supervisor-4.2.5/supervisor/tests/test_rpcinterfaces.py --- old/supervisor-4.2.4/supervisor/tests/test_rpcinterfaces.py 2021-02-23 18:55:45.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/test_rpcinterfaces.py 2022-12-23 23:54:41.000000000 +0100 @@ -369,6 +369,18 @@ self._assertRPCError(xmlrpc.Faults.NO_FILE, interface.startProcess, 'foo') + def test_startProcess_bad_command(self): + options = DummyOptions() + pconfig = DummyPConfig(options, 'foo', '/foo/bar', autostart=False) + from supervisor.options import BadCommand + supervisord = PopulatedDummySupervisor(options, 'foo', pconfig) + process = supervisord.process_groups['foo'].processes['foo'] + process.execv_arg_exception = BadCommand + interface = self._makeOne(supervisord) + from supervisor import xmlrpc + self._assertRPCError(xmlrpc.Faults.NOT_EXECUTABLE, + interface.startProcess, 'foo') + def test_startProcess_file_not_executable(self): options = DummyOptions() pconfig = DummyPConfig(options, 'foo', '/foo/bar', autostart=False) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/tests/test_supervisorctl.py new/supervisor-4.2.5/supervisor/tests/test_supervisorctl.py --- old/supervisor-4.2.4/supervisor/tests/test_supervisorctl.py 2021-03-19 18:58:56.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/tests/test_supervisorctl.py 2022-12-24 01:00:25.000000000 +0100 @@ -1287,6 +1287,16 @@ out = plugin.ctl.stdout.getvalue() self.assertTrue("Shut the remote supervisord down" in out) + def test_shutdown_with_arg_shows_error(self): + plugin = self._makeOne() + options = plugin.ctl.options + result = plugin.do_shutdown('bad') + self.assertEqual(result, None) + self.assertEqual(options._server.supervisor._shutdown, False) + val = plugin.ctl.stdout.getvalue() + self.assertTrue(val.startswith('Error: shutdown accepts no arguments'), val) + self.assertEqual(plugin.ctl.exitstatus, LSBInitExitStatuses.GENERIC) + def test_shutdown(self): plugin = self._makeOne() options = plugin.ctl.options diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/version.txt new/supervisor-4.2.5/supervisor/version.txt --- old/supervisor-4.2.4/supervisor/version.txt 2021-12-30 21:39:23.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/version.txt 2022-12-24 01:26:13.000000000 +0100 @@ -1 +1 @@ -4.2.4 +4.2.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/web.py new/supervisor-4.2.5/supervisor/web.py --- old/supervisor-4.2.4/supervisor/web.py 2021-03-13 22:54:36.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/web.py 2022-12-23 23:54:41.000000000 +0100 @@ -8,6 +8,7 @@ from supervisor.compat import urllib from supervisor.compat import urlparse +from supervisor.compat import as_bytes from supervisor.compat import as_string from supervisor.compat import PY2 from supervisor.compat import unicode @@ -179,7 +180,7 @@ headers['Pragma'] = 'no-cache' headers['Cache-Control'] = 'no-cache' headers['Expires'] = http_date.build_http_date(0) - response['body'] = as_string(body) + response['body'] = as_bytes(body) return response def render(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor/xmlrpc.py new/supervisor-4.2.5/supervisor/xmlrpc.py --- old/supervisor-4.2.4/supervisor/xmlrpc.py 2021-02-27 05:57:21.000000000 +0100 +++ new/supervisor-4.2.5/supervisor/xmlrpc.py 2022-12-24 01:00:25.000000000 +0100 @@ -9,7 +9,7 @@ from supervisor.compat import xmlrpclib from supervisor.compat import StringIO -from supervisor.compat import urllib +from supervisor.compat import urlparse from supervisor.compat import as_bytes from supervisor.compat import as_string from supervisor.compat import encodestring @@ -486,13 +486,10 @@ self.verbose = False self.serverurl = serverurl if serverurl.startswith('http://'): - type, uri = urllib.splittype(serverurl) - host, path = urllib.splithost(uri) - host, port = urllib.splitport(host) + parsed = urlparse.urlparse(serverurl) + host, port = parsed.hostname, parsed.port if port is None: port = 80 - else: - port = int(port) def get_connection(host=host, port=port): return httplib.HTTPConnection(host, port) self._get_connection = get_connection @@ -601,5 +598,3 @@ tags.append((tag_lineno, tag, datatype, name, '\n'.join(tag_text))) return tags - - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor.egg-info/PKG-INFO new/supervisor-4.2.5/supervisor.egg-info/PKG-INFO --- old/supervisor-4.2.4/supervisor.egg-info/PKG-INFO 2021-12-30 21:46:07.000000000 +0100 +++ new/supervisor-4.2.5/supervisor.egg-info/PKG-INFO 2022-12-24 01:52:25.000000000 +0100 @@ -1,12 +1,11 @@ Metadata-Version: 2.1 Name: supervisor -Version: 4.2.4 +Version: 4.2.5 Summary: A system for controlling process state under UNIX Home-page: http://supervisord.org/ Author: Chris McDonough Author-email: [email protected] License: BSD-derived (http://www.repoze.org/LICENSE.txt) -Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: No Input/Output (Daemon) Classifier: Intended Audience :: System Administrators @@ -24,6 +23,8 @@ Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 Provides-Extra: testing License-File: LICENSES.txt @@ -70,6 +71,35 @@ on GitHub. +4.2.5 (2022-12-23) +------------------ + +- Fixed a bug where the XML-RPC method ``supervisor.startProcess()`` would + return 500 Internal Server Error instead of an XML-RPC fault response + if the command could not be parsed. Patch by Julien Le Cléach. + +- Fixed a bug on Python 2.7 where a ``UnicodeDecodeError`` may have occurred + when using the web interface. Patch by Vinay Sajip. + +- Removed use of ``urllib.parse`` functions ``splithost``, ``splitport``, and + ``splittype`` deprecated in Python 3.8. + +- Removed use of ``asynchat`` and ``asyncore`` deprecated in Python 3.10. + +- The return value of the XML-RPC method ``supervisor.getAllConfigInfo()`` + now includes the ``directory``, ``uid``, and ``serverurl`` of the + program. Patch by Yellmean. + +- If a subprocess exits with a unexpected exit code (one not listed in + ``exitcodes=`` in a ``[program:x]`` section) then the exit will now be logged + at the ``WARN`` level instead of ``INFO``. Patch by Precy Lee. + +- ``supervisorctl shutdown`` now shows an error message if an argument is + given. + +- File descriptors are now closed using the faster ``os.closerange()`` instead + of calling ``os.close()`` in a loop. Patch by tyong920. + 4.2.4 (2021-12-30) ------------------ @@ -1437,7 +1467,7 @@ supervisorctl. To start a group, use ``start groupname:*``. To start multiple groups, use ``start groupname1:* groupname2:*``. Equivalent commands work for "stop" and "restart". You can mix and match short - processnames, fullly-specified group:process names, and groupsplats on the + processnames, fully-specified group:process names, and groupsplats on the same line for any of these commands. - Added ``directory`` option to process config. If you set this @@ -1493,7 +1523,7 @@ supervisor will fail to start. - The Python string expression ``%(here)s`` (referring to the directory in - which the the configuration file was found) can be used within the + which the configuration file was found) can be used within the following sections/options within the config file:: unix_http_server:file @@ -1647,7 +1677,7 @@ channel. The keys "log_stderr" and "log_stdout" have been removed. -- ``[program:x]`` config file sections now represent "homgeneous process +- ``[program:x]`` config file sections now represent "homogeneous process groups" instead of single processes. A "numprocs" key in the section represents the number of processes that are in the group. A "process_name" key in the section allows composition of the each process' name within the @@ -1762,7 +1792,7 @@ - Processes which started successfully after failing to start initially are no longer reported in BACKOFF state once they are - started successfully (thanks to Damjan from Macdonia for the bug + started successfully (thanks to Damjan from Macedonia for the bug report). - Add new 'maintail' command to supervisorctl shell, which allows @@ -1958,5 +1988,3 @@ ------------------------------- Initial release. - - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/supervisor.egg-info/entry_points.txt new/supervisor-4.2.5/supervisor.egg-info/entry_points.txt --- old/supervisor-4.2.4/supervisor.egg-info/entry_points.txt 2021-12-30 21:46:07.000000000 +0100 +++ new/supervisor-4.2.5/supervisor.egg-info/entry_points.txt 2022-12-24 01:52:25.000000000 +0100 @@ -3,4 +3,3 @@ pidproxy = supervisor.pidproxy:main supervisorctl = supervisor.supervisorctl:main supervisord = supervisor.supervisord:main - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/supervisor-4.2.4/tox.ini new/supervisor-4.2.5/tox.ini --- old/supervisor-4.2.4/tox.ini 2021-12-21 23:40:37.000000000 +0100 +++ new/supervisor-4.2.5/tox.ini 2022-12-24 01:00:25.000000000 +0100 @@ -41,7 +41,7 @@ Sphinx readme setuptools >= 18.5 -whitelist_externals = make +allowlist_externals = make commands = make -C docs html BUILDDIR={envtmpdir} "SPHINXOPTS=-W -E" python setup.py check -m -r -s
