Add a notice about Python 3.5 support

This will be printed in bold at the end of interactive meson
sub-commands that won't be parsed by a program. Specifically: setup,
compile, test, and install.

NOTICE: You are using [...]
pull/7681/head
Nirbheek Chauhan 4 years ago committed by Nirbheek Chauhan
parent 0ec8bebae8
commit 4ad4565ddd
  1. 16
      mesonbuild/mesonmain.py
  2. 9
      mesonbuild/mlog.py

@ -38,7 +38,7 @@ class CommandLineParser:
self.commands = {}
self.hidden_commands = []
self.parser = argparse.ArgumentParser(prog='meson', formatter_class=self.formatter)
self.subparsers = self.parser.add_subparsers(title='Commands',
self.subparsers = self.parser.add_subparsers(title='Commands', dest='command',
description='If no command is specified it defaults to setup command.')
self.add_command('setup', msetup.add_arguments, msetup.run,
help_msg='Configure the project')
@ -111,6 +111,7 @@ class CommandLineParser:
return 0
def run(self, args):
print_py35_notice = False
# If first arg is not a known command, assume user wants to run the setup
# command.
known_commands = list(self.commands.keys()) + ['-h', '--help']
@ -119,14 +120,22 @@ class CommandLineParser:
# Hidden commands have their own parser instead of using the global one
if args[0] in self.hidden_commands:
parser = self.commands[args[0]]
command = args[0]
parser = self.commands[command]
args = args[1:]
else:
parser = self.parser
command = None
args = mesonlib.expand_arguments(args)
options = parser.parse_args(args)
if command is None:
command = options.command
if command in ('setup', 'compile', 'test', 'install') and sys.version_info < (3, 6):
print_py35_notice = True
try:
return options.run_func(options)
except MesonException as e:
@ -143,6 +152,9 @@ class CommandLineParser:
traceback.print_exc()
return 2
finally:
if print_py35_notice:
mlog.notice('You are using Python 3.5 which is EOL. Starting with v0.57, '
'Meson will require Python 3.6 or newer', fatal=False)
mlog.shutdown()
def run_script_command(script_name, script_args):

@ -255,8 +255,10 @@ def _log_error(severity: str, *rargs: T.Union[str, AnsiDecorator],
# The typing requirements here are non-obvious. Lists are invariant,
# therefore T.List[A] and T.List[T.Union[A, B]] are not able to be joined
if severity == 'warning':
label = [yellow('WARNING:')] # type: T.List[T.Union[str, AnsiDecorator]]
if severity == 'notice':
label = [bold('NOTICE:')] # type: T.List[T.Union[str, AnsiDecorator]]
elif severity == 'warning':
label = [yellow('WARNING:')]
elif severity == 'error':
label = [red('ERROR:')]
elif severity == 'deprecation':
@ -295,6 +297,9 @@ def warning(*args: T.Union[str, AnsiDecorator], **kwargs: T.Any) -> None:
def deprecation(*args: T.Union[str, AnsiDecorator], **kwargs: T.Any) -> None:
return _log_error('deprecation', *args, **kwargs, is_error=True)
def notice(*args: T.Union[str, AnsiDecorator], **kwargs: T.Any) -> None:
return _log_error('notice', *args, **kwargs, is_error=False)
def get_relative_path(target: Path, current: Path) -> Path:
"""Get the path to target from current"""
# Go up "current" until we find a common ancestor to target

Loading…
Cancel
Save