Skip to content

Commit 995bd6a

Browse files
committed
Move unreleased [include] changes to a feature branch
1 parent 895fbce commit 995bd6a

File tree

5 files changed

+141
-214
lines changed

5 files changed

+141
-214
lines changed

CHANGES.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@
1919
in ``shlex``. If ``supervisord`` is run on a Python version with the bug,
2020
it will fall back to legacy mode. Patch by Stefan Friesel.
2121

22-
- ``supervisorctl`` now reads extra files included via the ``[include]``
23-
section in ``supervisord.conf`` like ``supervisord`` does. This allows
24-
the ``[supervisorctl]`` section or ``[ctlplugin:x]`` sections to be in
25-
included files. Patch by François Granade.
26-
2722
4.3.0 (2025-08-23)
2823
------------------
2924

docs/configuration.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,12 @@ section, it must contain a single key named "files". The values in
11841184
this key specify other configuration files to be included within the
11851185
configuration.
11861186

1187+
.. note::
1188+
1189+
The ``[include]`` section is processed only by ``supervisord``. It is
1190+
ignored by ``supervisorctl``.
1191+
1192+
11871193
``[include]`` Section Values
11881194
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11891195

@@ -1208,10 +1214,6 @@ configuration.
12081214

12091215
*Changed*: 3.3.0. Added support for the ``host_node_name`` expansion.
12101216

1211-
*Changed*: 4.3.0. Added support to :program:`supervisorctl` for reading
1212-
files specified in the ``[include]`` section. In previous versions,
1213-
the ``[include]`` section was only supported by :program:`supervisord`.
1214-
12151217
``[include]`` Section Example
12161218
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12171219

supervisor/options.py

Lines changed: 39 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@ def __init__(self, require_configfile=True):
104104
self.add(None, None, "h", "help", self.help)
105105
self.add(None, None, "?", None, self.help)
106106
self.add("configfile", None, "c:", "configuration=")
107-
self.parse_criticals = []
108-
self.parse_warnings = []
109-
self.parse_infos = []
110107

111108
here = os.path.dirname(os.path.dirname(sys.argv[0]))
112109
searchpaths = [os.path.join(here, 'etc', 'supervisord.conf'),
@@ -393,45 +390,6 @@ def import_spec(self, spec):
393390
"""On failure, raises either AttributeError or ImportError"""
394391
return import_spec(spec)
395392

396-
def read_include_config(self, fp, parser, expansions):
397-
if parser.has_section('include'):
398-
parser.expand_here(self.here)
399-
if not parser.has_option('include', 'files'):
400-
raise ValueError(".ini file has [include] section, but no "
401-
"files setting")
402-
files = parser.get('include', 'files')
403-
files = expand(files, expansions, 'include.files')
404-
files = files.split()
405-
if hasattr(fp, 'name'):
406-
base = os.path.dirname(os.path.abspath(fp.name))
407-
else:
408-
base = '.'
409-
for pattern in files:
410-
pattern = os.path.join(base, pattern)
411-
filenames = glob.glob(pattern)
412-
if not filenames:
413-
self.parse_warnings.append(
414-
'No file matches via include "%s"' % pattern)
415-
continue
416-
for filename in sorted(filenames):
417-
self.parse_infos.append(
418-
'Included extra file "%s" during parsing' % filename)
419-
try:
420-
parser.read(filename)
421-
except ConfigParser.ParsingError as why:
422-
raise ValueError(str(why))
423-
else:
424-
parser.expand_here(
425-
os.path.abspath(os.path.dirname(filename))
426-
)
427-
428-
def _log_parsing_messages(self, logger):
429-
for msg in self.parse_criticals:
430-
logger.critical(msg)
431-
for msg in self.parse_warnings:
432-
logger.warn(msg)
433-
for msg in self.parse_infos:
434-
logger.info(msg)
435393

436394
class ServerOptions(Options):
437395
user = None
@@ -490,6 +448,9 @@ def __init__(self):
490448
"s", "silent", flag=1, default=0)
491449
self.pidhistory = {}
492450
self.process_group_configs = []
451+
self.parse_criticals = []
452+
self.parse_warnings = []
453+
self.parse_infos = []
493454
self.signal_receiver = SignalReceiver()
494455
self.poller = poller.Poller(self)
495456

@@ -618,8 +579,36 @@ def read_config(self, fp):
618579
expansions = {'here':self.here,
619580
'host_node_name':host_node_name}
620581
expansions.update(self.environ_expansions)
621-
622-
self.read_include_config(fp, parser, expansions)
582+
if parser.has_section('include'):
583+
parser.expand_here(self.here)
584+
if not parser.has_option('include', 'files'):
585+
raise ValueError(".ini file has [include] section, but no "
586+
"files setting")
587+
files = parser.get('include', 'files')
588+
files = expand(files, expansions, 'include.files')
589+
files = files.split()
590+
if hasattr(fp, 'name'):
591+
base = os.path.dirname(os.path.abspath(fp.name))
592+
else:
593+
base = '.'
594+
for pattern in files:
595+
pattern = os.path.join(base, pattern)
596+
filenames = glob.glob(pattern)
597+
if not filenames:
598+
self.parse_warnings.append(
599+
'No file matches via include "%s"' % pattern)
600+
continue
601+
for filename in sorted(filenames):
602+
self.parse_infos.append(
603+
'Included extra file "%s" during parsing' % filename)
604+
try:
605+
parser.read(filename)
606+
except ConfigParser.ParsingError as why:
607+
raise ValueError(str(why))
608+
else:
609+
parser.expand_here(
610+
os.path.abspath(os.path.dirname(filename))
611+
)
623612

624613
sections = parser.sections()
625614
if not 'supervisord' in sections:
@@ -1499,7 +1488,12 @@ def make_logger(self):
14991488
maxbytes=self.logfile_maxbytes,
15001489
backups=self.logfile_backups,
15011490
)
1502-
self._log_parsing_messages(self.logger)
1491+
for msg in self.parse_criticals:
1492+
self.logger.critical(msg)
1493+
for msg in self.parse_warnings:
1494+
self.logger.warn(msg)
1495+
for msg in self.parse_infos:
1496+
self.logger.info(msg)
15031497

15041498
def make_http_servers(self, supervisord):
15051499
from supervisor.http import make_http_servers
@@ -1674,11 +1668,6 @@ def realize(self, *arg, **kw):
16741668
if not self.args:
16751669
self.interactive = 1
16761670

1677-
format = '%(levelname)s: %(message)s\n'
1678-
logger = loggers.getLogger()
1679-
loggers.handle_stdout(logger, format)
1680-
self._log_parsing_messages(logger)
1681-
16821671
def read_config(self, fp):
16831672
section = self.configroot.supervisorctl
16841673
need_close = False
@@ -1699,11 +1688,8 @@ def read_config(self, fp):
16991688
parser.read_file(fp)
17001689
except AttributeError:
17011690
parser.readfp(fp)
1702-
17031691
if need_close:
17041692
fp.close()
1705-
self.read_include_config(fp, parser, parser.expansions)
1706-
17071693
sections = parser.sections()
17081694
if not 'supervisorctl' in sections:
17091695
raise ValueError('.ini file does not include supervisorctl section')
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
11
[supervisord]
22
childlogdir = %(here)s
3-
4-
[supervisorctl]
5-
history_file = %(here)s

0 commit comments

Comments
 (0)