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

Reply via email to