interpreterbase: Fix version checking for deprecation

Currently deprecation features use the same logic as new features, but
that doesn't work correctly. FeatureNew wants to warn about cases where
you claim to support >= 0.40, but use a feature from 0.42; deprecation
wants to warn when you claim to support >= 0.50, but use a feature that
was replaced in 0.45.

To make this work we need to invert the version check in the deprecation
function, so that if the deprecation is 0.45, and the supported version
is >= 0.50, we get a true not a false.
pull/7127/head
Dylan Baker 5 years ago
parent ee790eec2a
commit f29f3f9f28
  1. 19
      mesonbuild/interpreterbase.py

@ -18,6 +18,7 @@
from . import mparser, mesonlib, mlog
from . import environment, dependencies
import abc
import os, copy, re
import collections.abc
from functools import wraps
@ -212,7 +213,7 @@ class permittedKwargs:
return f(*wrapped_args, **wrapped_kwargs)
return wrapped
class FeatureCheckBase:
class FeatureCheckBase(metaclass=abc.ABCMeta):
"Base class for feature version checks"
# In python 3.6 we can just forward declare this, but in 3.5 we can't
@ -230,13 +231,18 @@ class FeatureCheckBase:
return ''
return mesonlib.project_meson_versions[subproject]
@staticmethod
@abc.abstractmethod
def check_version(target_version: str, feature_Version: str) -> bool:
pass
def use(self, subproject: str) -> None:
tv = self.get_target_version(subproject)
# No target version
if tv == '':
return
# Target version is new enough
if mesonlib.version_compare_condition_with_min(tv, self.feature_version):
if self.check_version(tv, self.feature_version):
return
# Feature is too new for target version, register it
if subproject not in self.feature_registry:
@ -287,6 +293,10 @@ class FeatureNew(FeatureCheckBase):
# Format: {subproject: {feature_version: set(feature_names)}}
feature_registry = {} # type: T.ClassVar[T.Dict[str, T.Dict[str, T.Set[str]]]]
@staticmethod
def check_version(target_version: str, feature_version: str) -> bool:
return mesonlib.version_compare_condition_with_min(target_version, feature_version)
@staticmethod
def get_warning_str_prefix(tv: str) -> str:
return 'Project specifies a minimum meson_version \'{}\' but uses features which were added in newer versions:'.format(tv)
@ -303,6 +313,11 @@ class FeatureDeprecated(FeatureCheckBase):
# Format: {subproject: {feature_version: set(feature_names)}}
feature_registry = {} # type: T.ClassVar[T.Dict[str, T.Dict[str, T.Set[str]]]]
@staticmethod
def check_version(target_version: str, feature_version: str) -> bool:
# For deprecatoin checks we need to return the inverse of FeatureNew checks
return not mesonlib.version_compare_condition_with_min(target_version, feature_version)
@staticmethod
def get_warning_str_prefix(tv: str) -> str:
return 'Deprecated features used:'

Loading…
Cancel
Save