diff --git a/mesonbuild/msubprojects.py b/mesonbuild/msubprojects.py index f4b4405634b2..4e770edf8c08 100755 --- a/mesonbuild/msubprojects.py +++ b/mesonbuild/msubprojects.py @@ -18,7 +18,8 @@ from .ast import IntrospectionInterpreter from .mesonlib import quiet_git, GitException, Popen_safe, MesonException, windows_proof_rmtree from .wrap.wrap import (Resolver, WrapException, ALL_TYPES, - parse_patch_url, update_wrap_file, get_releases) + parse_patch_url, update_wrap_file, get_releases, + warn_if_deprecated) if T.TYPE_CHECKING: from typing_extensions import Protocol @@ -154,6 +155,7 @@ def update_wrapdb(self) -> bool: if not info: self.log(' -> Wrap not found in wrapdb') return True + warn_if_deprecated(self.wrap.name, info) # Determine current version try: diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py index c675389aaaae..ecec3bd30788 100644 --- a/mesonbuild/wrap/wrap.py +++ b/mesonbuild/wrap/wrap.py @@ -164,6 +164,19 @@ def get_releases(allow_insecure: bool) -> T.Dict[str, T.Any]: data = get_releases_data(allow_insecure) return T.cast('T.Dict[str, T.Any]', json.loads(data.decode())) +def warn_if_deprecated(name: str, info: T.Dict[str, T.Any]) -> None: + deprecated = info.get('deprecated') + if deprecated is None: + return + if 'replacement' in deprecated: + mlog.warning(f'Wrap {name} is deprecated: use {deprecated["replacement"]} instead') + elif 'successor' in deprecated: + mlog.warning(f'Wrap {name} is deprecated: port project to {deprecated["successor"]}') + elif 'reason' in deprecated: + mlog.warning(f'Wrap {name} is deprecated: {deprecated["reason"]}') + else: + mlog.warning(f'Wrap {name} is deprecated') + def update_wrap_file(wrapfile: str, name: str, new_version: str, new_revision: str, allow_insecure: bool) -> None: url = open_wrapdburl(f'https://wrapdb.mesonbuild.com/v2/{name}_{new_version}-{new_revision}/{name}.wrap', allow_insecure, True, True) @@ -447,6 +460,7 @@ def get_from_wrapdb(self, subp_name: str) -> T.Optional[PackageDefinition]: info = self.wrapdb.get(subp_name) if not info: return None + warn_if_deprecated(subp_name, info) self.check_can_download() latest_version = info['versions'][0] version, revision = latest_version.rsplit('-', 1) diff --git a/mesonbuild/wrap/wraptool.py b/mesonbuild/wrap/wraptool.py index 85175114e289..5fbdbd076149 100644 --- a/mesonbuild/wrap/wraptool.py +++ b/mesonbuild/wrap/wraptool.py @@ -10,7 +10,7 @@ from glob import glob from .wrap import (open_wrapdburl, read_and_decompress, WrapException, get_releases, - get_releases_data, parse_patch_url) + get_releases_data, parse_patch_url, warn_if_deprecated) from .. import mesonlib, msubprojects if T.TYPE_CHECKING: @@ -65,12 +65,15 @@ def add_arguments(parser: 'argparse.ArgumentParser') -> None: def list_projects(options: 'argparse.Namespace') -> None: releases = get_releases(options.allow_insecure) for p in releases.keys(): - print(p) + if 'deprecated' not in releases[p]: + print(p) def search(options: 'argparse.Namespace') -> None: name = options.name releases = get_releases(options.allow_insecure) for p, info in releases.items(): + if 'deprecated' in releases[p]: + continue if p.find(name) != -1: print(p) else: @@ -83,6 +86,7 @@ def get_latest_version(name: str, allow_insecure: bool) -> T.Tuple[str, str]: info = releases.get(name) if not info: raise WrapException(f'Wrap {name} not found in wrapdb') + warn_if_deprecated(name, info) latest_version = info['versions'][0] version, revision = latest_version.rsplit('-', 1) return version, revision @@ -129,6 +133,7 @@ def info(options: 'argparse.Namespace') -> None: info = releases.get(name) if not info: raise WrapException(f'Wrap {name} not found in wrapdb') + warn_if_deprecated(name, info) print(f'Available versions of {name}:') for v in info['versions']: print(' ', v) diff --git a/tools/regenerate_docs.py b/tools/regenerate_docs.py index b7484e7657dc..2097331abca5 100755 --- a/tools/regenerate_docs.py +++ b/tools/regenerate_docs.py @@ -128,6 +128,8 @@ def generate_wrapdb_table(output_dir: Path) -> None: f.write('| Project | Versions | Provided dependencies | Provided programs |\n') f.write('| ------- | -------- | --------------------- | ----------------- |\n') for name, info in releases.items(): + if 'deprecated' in info: + continue versions = [] added_tags = set() for v in info['versions']: