summaryrefslogtreecommitdiff
path: root/src/mailman/bin/mailman.py
diff options
context:
space:
mode:
authorJ08nY2017-08-07 18:36:22 +0200
committerJ08nY2017-08-07 18:36:22 +0200
commitd107fd41f03b57f7731b60bb7ba921febc3ce3b9 (patch)
treecda2a8b12804345da87c043cfa90f6bb59bd83b3 /src/mailman/bin/mailman.py
parent9421a6ad9c3d272fd16ece2c21d317ab48251dae (diff)
parent8addebbf9802e911c06f6a27b7ffff1e0f1d2e57 (diff)
downloadmailman-d107fd41f03b57f7731b60bb7ba921febc3ce3b9.tar.gz
mailman-d107fd41f03b57f7731b60bb7ba921febc3ce3b9.tar.zst
mailman-d107fd41f03b57f7731b60bb7ba921febc3ce3b9.zip
Diffstat (limited to 'src/mailman/bin/mailman.py')
-rw-r--r--src/mailman/bin/mailman.py43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/mailman/bin/mailman.py b/src/mailman/bin/mailman.py
index e012237f3..f8006218d 100644
--- a/src/mailman/bin/mailman.py
+++ b/src/mailman/bin/mailman.py
@@ -16,7 +16,6 @@
# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
"""The 'mailman' command dispatcher."""
-
import click
from contextlib import ExitStack
@@ -25,7 +24,7 @@ from mailman.core.i18n import _
from mailman.core.initialize import initialize
from mailman.database.transaction import transaction
from mailman.interfaces.command import ICLISubCommand
-from mailman.utilities.modules import add_components
+from mailman.utilities.plugins import add_pluggable_components
from mailman.version import MAILMAN_VERSION_FULL
from public import public
@@ -35,17 +34,22 @@ class Subcommands(click.MultiCommand):
def __init__(self, *args, **kws):
super().__init__(*args, **kws)
self._commands = {}
- # Look at all modules in the mailman.bin package and if they are
- # prepared to add a subcommand, let them do so. I'm still undecided as
- # to whether this should be pluggable or not. If so, then we'll
- # probably have to partially parse the arguments now, then initialize
- # the system, then find the plugins. Punt on this for now.
- add_components('mailman.commands', ICLISubCommand, self._commands)
+ self._loaded = False
+
+ def _load(self):
+ # Load commands lazily as pluggable commands need a parsed config to
+ # find plugins.
+ if not self._loaded:
+ add_pluggable_components('commands', ICLISubCommand,
+ self._commands)
+ self._loaded = True
- def list_commands(self, ctx):
- return sorted(self._commands) # pragma: nocover
+ def list_commands(self, ctx): # pragma: nocover
+ self._load()
+ return sorted(self._commands)
def get_command(self, ctx, name):
+ self._load()
try:
return self._commands[name].command
except KeyError as error:
@@ -83,10 +87,12 @@ class Subcommands(click.MultiCommand):
formatter.write_dl(opts)
-@click.group(
- cls=Subcommands,
- context_settings=dict(help_option_names=['-h', '--help']))
-@click.pass_context
+def initialize_config(ctx, param, value):
+ if ctx.resilient_parsing: # pragma: nocover
+ return
+ initialize(value)
+
+
@click.option(
'-C', '--config', 'config_file',
envvar='MAILMAN_CONFIG_FILE',
@@ -94,7 +100,12 @@ class Subcommands(click.MultiCommand):
help=_("""\
Configuration file to use. If not given, the environment variable
MAILMAN_CONFIG_FILE is consulted and used if set. If neither are given, a
- default configuration file is loaded."""))
+ default configuration file is loaded."""),
+ is_eager=True, callback=initialize_config)
+@click.group(
+ cls=Subcommands,
+ context_settings=dict(help_option_names=['-h', '--help']))
+@click.pass_context
@click.version_option(MAILMAN_VERSION_FULL, message='%(version)s')
@public
def main(ctx, config_file):
@@ -104,6 +115,4 @@ def main(ctx, config_file):
Copyright 1998-2017 by the Free Software Foundation, Inc.
http://www.list.org
"""
- # Initialize the system. Honor the -C flag if given.
- initialize(config_file)
# click handles dispatching to the subcommand via the Subcommands class.