diff --git a/conda_forge_tick/feedstock_parser.py b/conda_forge_tick/feedstock_parser.py index 1ab00b730..2b1d00d79 100644 --- a/conda_forge_tick/feedstock_parser.py +++ b/conda_forge_tick/feedstock_parser.py @@ -230,8 +230,10 @@ def populate_feedstock_attributes( if isinstance(feedstock_dir, str): feedstock_dir = Path(feedstock_dir) - if meta_yaml is None and recipe_yaml is None: - raise ValueError("Either `meta_yaml` or `recipe_yaml` needs to be given.") + if (meta_yaml is None and recipe_yaml is None) or ( + meta_yaml is not None and recipe_yaml is not None + ): + raise ValueError("Either `meta_yaml` or `recipe_yaml` needs to be given.") sub_graph.update({"feedstock_name": name, "parsing_error": False, "branch": "main"}) @@ -245,6 +247,8 @@ def populate_feedstock_attributes( if isinstance(meta_yaml, str): sub_graph["raw_meta_yaml"] = meta_yaml + elif isinstance(recipe_yaml, str): + sub_graph["raw_meta_yaml"] = recipe_yaml # Get the conda-forge.yml if isinstance(conda_forge_yaml, str): @@ -301,6 +305,7 @@ def populate_feedstock_attributes( ), ), ) + variant_yamls[-1]["schema_version"] = 0 elif isinstance(recipe_yaml, str): platform_arch = ( f"{plat}-{arch}" @@ -314,6 +319,9 @@ def populate_feedstock_attributes( cbc_path=cbc_path, ), ) + variant_yamls[-1]["schema_version"] = variant_yamls[-1].get( + "schema_version", 1 + ) # sometimes the requirements come out to None or [None] # and this ruins the aggregated meta_yaml / breaks stuff @@ -358,6 +366,10 @@ def populate_feedstock_attributes( parse_meta_yaml(meta_yaml, platform=plat, arch=arch) for plat, arch in plat_archs ] + elif isinstance(recipe_yaml, str): + raise NotImplementedError( + "recipe_yaml generic parsing not implemented yet! Ensure the feedstock has .ci_support files." + ) except Exception as e: import traceback diff --git a/conda_forge_tick/migrators/core.py b/conda_forge_tick/migrators/core.py index 5e9d25d9e..c0bfa47c9 100644 --- a/conda_forge_tick/migrators/core.py +++ b/conda_forge_tick/migrators/core.py @@ -30,6 +30,28 @@ logger = logging.getLogger(__name__) +def _skip_due_to_schema( + attrs: "AttrsTypedDict", allowed_schema_versions: List[int] +) -> bool: + __name = attrs.get("name", "") + schema_version = get_keys_default( + attrs, + ["meta_yaml", "schema_version"], + {}, + 0, + ) + if schema_version not in allowed_schema_versions: + logger.debug( + "%s: schema version not allowed - %r not in %r", + __name, + attrs["meta_yaml"].get("schema_version", 0), + allowed_schema_versions, + ) + return True + else: + return False + + def _make_effective_graph(graph, migrator): """Prune graph only to nodes that need rebuilds.""" gx2 = copy.deepcopy(graph) @@ -142,6 +164,7 @@ def make_from_lazy_json_data(data): class MiniMigrator: post_migration = False + allowed_schema_versions = [0] def __init__(self): if not hasattr(self, "_init_args"): @@ -206,6 +229,8 @@ class Migrator: allow_empty_commits = False + allowed_schema_versions = [0] + build_patterns = ( (re.compile(r"(\s*?)number:\s*([0-9]+)"), "number: {}"), ( @@ -369,7 +394,12 @@ def parse_already_pred() -> bool: if bad_attr: logger.debug("%s: bad attr - %s", __name, bad_attr) - return attrs.get("archived", False) or parse_already_pred() or bad_attr + return ( + attrs.get("archived", False) + or parse_already_pred() + or bad_attr + or _skip_due_to_schema(attrs, self.allowed_schema_versions) + ) def get_possible_feedstock_branches(self, attrs: "AttrsTypedDict") -> List[str]: """Return the valid possible branches to which to apply this migration to @@ -764,7 +794,10 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: name = attrs.get("name", "") if super().filter(attrs, "Upstream:"): - logger.debug("filter %s: archived or done or bad attr", name) + logger.debug( + "filter %s: archived or done or bad attr or schema_version not allowed", + name, + ) return True if attrs.get("feedstock_name", None) not in self.graph: diff --git a/conda_forge_tick/migrators/cross_compile.py b/conda_forge_tick/migrators/cross_compile.py index d6179db2f..79275234b 100644 --- a/conda_forge_tick/migrators/cross_compile.py +++ b/conda_forge_tick/migrators/cross_compile.py @@ -3,7 +3,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd from conda_forge_tick.provide_source_code import provide_source_code from conda_forge_tick.utils import yaml_safe_dump, yaml_safe_load @@ -28,7 +28,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: if compiler in build_reqs: needed = True break - return not needed + return (not needed) or _skip_due_to_schema(attrs, self.allowed_schema_versions) class UpdateConfigSubGuessMigrator(CrossCompilationMigratorBase): @@ -150,7 +150,11 @@ class CrossPythonMigrator(CrossCompilationMigratorBase): def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: host_reqs = attrs.get("requirements", {}).get("host", set()) build_reqs = attrs.get("requirements", {}).get("build", set()) - return "python" not in host_reqs or "python" in build_reqs + return ( + "python" not in host_reqs + or "python" in build_reqs + or _skip_due_to_schema(attrs, self.allowed_schema_versions) + ) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: host_reqs = attrs.get("requirements", {}).get("host", set()) @@ -207,7 +211,9 @@ def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> No class UpdateCMakeArgsMigrator(CrossCompilationMigratorBase): def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: build_reqs = attrs.get("requirements", {}).get("build", set()) - return "cmake" not in build_reqs + return "cmake" not in build_reqs or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: with pushd(recipe_dir): @@ -238,6 +244,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: build_reqs = attrs.get("requirements", {}).get("build", set()) host_reqs = attrs.get("requirements", {}).get("host", set()) run_reqs = attrs.get("requirements", {}).get("run", set()) + skip_schema = _skip_due_to_schema(attrs, self.allowed_schema_versions) if ( len(attrs.get("outputs_names", [])) <= 1 and "python" in build_reqs @@ -252,6 +259,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: "cxx_compiler_stub", ] ) + and not skip_schema ): return False else: @@ -281,7 +289,8 @@ class NoCondaInspectMigrator(MiniMigrator): post_migration = True def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: - if "conda inspect" in attrs.get("raw_meta_yaml", ""): + skip_schema = _skip_due_to_schema(attrs, self.allowed_schema_versions) + if "conda inspect" in attrs.get("raw_meta_yaml", "") and not skip_schema: return False else: return True @@ -314,7 +323,10 @@ def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> No class CrossRBaseMigrator(CrossCompilationMigratorBase): def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: host_reqs = attrs.get("requirements", {}).get("host", set()) - if "r-base" in host_reqs or attrs.get("name", "").startswith("r-"): + skip_schema = _skip_due_to_schema(attrs, self.allowed_schema_versions) + if ( + "r-base" in host_reqs or attrs.get("name", "").startswith("r-") + ) and not skip_schema: return False else: return True @@ -371,7 +383,7 @@ class CrossCompilationForARMAndPower(MiniMigrator): post_migration = True def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: - return False + return _skip_due_to_schema(attrs, self.allowed_schema_versions) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: with pushd(recipe_dir): diff --git a/conda_forge_tick/migrators/cstdlib.py b/conda_forge_tick/migrators/cstdlib.py index 08f8c53b6..e8e9b7e1f 100644 --- a/conda_forge_tick/migrators/cstdlib.py +++ b/conda_forge_tick/migrators/cstdlib.py @@ -1,7 +1,7 @@ import os import re -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.migrators.libboost import _replacer, _slice_into_output_sections pat_stub = re.compile(r"(c|cxx|fortran)_compiler_stub") @@ -200,7 +200,11 @@ def filter(self, attrs, not_bad_str_start=""): has_compiler = any(pat_compiler.search(line) for line in lines) has_sysroot = any(pat_sysroot_217.search(line) for line in lines) # filter() returns True if we _don't_ want to migrate - return already_migrated or not (has_compiler or has_sysroot) + return ( + _skip_due_to_schema(attrs, self.allowed_schema_versions) + or already_migrated + or not (has_compiler or has_sysroot) + ) def migrate(self, recipe_dir, attrs, **kwargs): new_lines = [] diff --git a/conda_forge_tick/migrators/dep_updates.py b/conda_forge_tick/migrators/dep_updates.py index 0c77fe78b..28fe3a0b2 100644 --- a/conda_forge_tick/migrators/dep_updates.py +++ b/conda_forge_tick/migrators/dep_updates.py @@ -2,7 +2,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.update_deps import apply_dep_update, get_dep_updates_and_hints from conda_forge_tick.utils import get_keys_default @@ -32,7 +32,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: "hint", ) if update_deps in ["update-all", "update-source", "update-grayskull"]: - return False + return False or _skip_due_to_schema(attrs, self.allowed_schema_versions) return True diff --git a/conda_forge_tick/migrators/duplicate_lines.py b/conda_forge_tick/migrators/duplicate_lines.py index 2aeea8a7c..a5dce475b 100644 --- a/conda_forge_tick/migrators/duplicate_lines.py +++ b/conda_forge_tick/migrators/duplicate_lines.py @@ -2,7 +2,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd if typing.TYPE_CHECKING: @@ -23,7 +23,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: raw_yaml = attrs.get("raw_meta_yaml", "") for line in raw_yaml.splitlines(): if any(r.match(line) for r in self.regex_to_check.values()): - return False + return False or _skip_due_to_schema(attrs, self.allowed_schema_versions) return True diff --git a/conda_forge_tick/migrators/extra_jinj2a_keys_cleanup.py b/conda_forge_tick/migrators/extra_jinj2a_keys_cleanup.py index 6e3e469a1..dec116ea2 100644 --- a/conda_forge_tick/migrators/extra_jinj2a_keys_cleanup.py +++ b/conda_forge_tick/migrators/extra_jinj2a_keys_cleanup.py @@ -2,7 +2,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd if typing.TYPE_CHECKING: @@ -34,7 +34,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: raw_yaml = attrs["raw_meta_yaml"] for var_name in self.vars_to_remove: if f"{{% set {var_name}" in raw_yaml: - return False + return False or _skip_due_to_schema(attrs, self.allowed_schema_versions) return True def _replace_jinja_key(self, key_name, lines): diff --git a/conda_forge_tick/migrators/jinja2_vars_cleanup.py b/conda_forge_tick/migrators/jinja2_vars_cleanup.py index d7f8a289b..627f6735c 100644 --- a/conda_forge_tick/migrators/jinja2_vars_cleanup.py +++ b/conda_forge_tick/migrators/jinja2_vars_cleanup.py @@ -2,7 +2,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd if typing.TYPE_CHECKING: @@ -34,7 +34,9 @@ class Jinja2VarsCleanup(MiniMigrator): """Cleanup the jinja2 vars by replacing {{name}} with {{ name }} etc.""" def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: - return _should_filter(attrs.get("raw_meta_yaml", "")) + return _should_filter(attrs.get("raw_meta_yaml", "")) or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: with pushd(recipe_dir): diff --git a/conda_forge_tick/migrators/jpegturbo.py b/conda_forge_tick/migrators/jpegturbo.py index 9b4cc11b8..9aa03c78b 100644 --- a/conda_forge_tick/migrators/jpegturbo.py +++ b/conda_forge_tick/migrators/jpegturbo.py @@ -1,6 +1,6 @@ import os -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema def _parse_jpeg(lines): @@ -15,7 +15,9 @@ def _parse_jpeg(lines): class JpegTurboMigrator(MiniMigrator): def filter(self, attrs, not_bad_str_start=""): host_req = (attrs.get("requirements", {}) or {}).get("host", set()) or set() - return "jpeg" not in host_req + return "jpeg" not in host_req or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir, attrs, **kwargs): fname = os.path.join(recipe_dir, "meta.yaml") diff --git a/conda_forge_tick/migrators/libboost.py b/conda_forge_tick/migrators/libboost.py index 3b3c315b7..356c7ef26 100644 --- a/conda_forge_tick/migrators/libboost.py +++ b/conda_forge_tick/migrators/libboost.py @@ -1,7 +1,7 @@ import os import re -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema def _slice_into_output_sections(meta_yaml_lines, attrs): @@ -214,7 +214,9 @@ def filter(self, attrs, not_bad_str_start=""): run_req = (attrs.get("requirements", {}) or {}).get("run", set()) or set() all_req = set(host_req) | set(run_req) # filter() returns True if we _don't_ want to migrate - return not bool({"boost", "boost-cpp"} & all_req) + return (not bool({"boost", "boost-cpp"} & all_req)) or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir, attrs, **kwargs): fname = os.path.join(recipe_dir, "meta.yaml") diff --git a/conda_forge_tick/migrators/license.py b/conda_forge_tick/migrators/license.py index 2e30dfcb2..707d9cf11 100644 --- a/conda_forge_tick/migrators/license.py +++ b/conda_forge_tick/migrators/license.py @@ -6,7 +6,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd from conda_forge_tick.provide_source_code import provide_source_code from conda_forge_tick.recipe_parser import CondaMetaYAML @@ -293,7 +293,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: or any(n in license_fam for n in NEEDED_FAMILIES) or _is_r(attrs) ) and "license_file" not in attrs.get("meta_yaml", {}).get("about", {}): - return False + return False or _skip_due_to_schema(attrs, self.allowed_schema_versions) return True def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: diff --git a/conda_forge_tick/migrators/matplotlib_base.py b/conda_forge_tick/migrators/matplotlib_base.py index d2b1f173f..e71631de8 100644 --- a/conda_forge_tick/migrators/matplotlib_base.py +++ b/conda_forge_tick/migrators/matplotlib_base.py @@ -3,7 +3,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import _parse_bad_attr +from conda_forge_tick.migrators.core import _parse_bad_attr, _skip_due_to_schema from conda_forge_tick.migrators.replacement import Replacement from conda_forge_tick.utils import frozen_to_json_friendly @@ -49,7 +49,13 @@ def parse_already_pred() -> bool: ) _no_dep = len(rq & self.packages) == 0 - return _is_archived or _is_pred or _is_bad or _no_dep + return ( + _is_archived + or _is_pred + or _is_bad + or _no_dep + or _skip_due_to_schema(attrs, self.allowed_schema_versions) + ) def migrate( self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any diff --git a/conda_forge_tick/migrators/numpy2.py b/conda_forge_tick/migrators/numpy2.py index 418c1c8bd..cf354894b 100644 --- a/conda_forge_tick/migrators/numpy2.py +++ b/conda_forge_tick/migrators/numpy2.py @@ -1,7 +1,7 @@ import os import re -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.migrators.libboost import _replacer # pin_compatible("numpy"...) @@ -16,7 +16,9 @@ def filter(self, attrs, not_bad_str_start=""): lines = attrs["raw_meta_yaml"].splitlines() has_pcn = any(pat_pcn.search(line) for line in lines) # filter() returns True if we _don't_ want to migrate - return not (has_pcn) + return (not (has_pcn)) or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir, attrs, **kwargs): fname = os.path.join(recipe_dir, "meta.yaml") diff --git a/conda_forge_tick/migrators/pip_check.py b/conda_forge_tick/migrators/pip_check.py index 05e787440..8a6a3ab16 100644 --- a/conda_forge_tick/migrators/pip_check.py +++ b/conda_forge_tick/migrators/pip_check.py @@ -6,7 +6,7 @@ import ruamel.yaml from ruamel.yaml import YAML -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd if typing.TYPE_CHECKING: @@ -153,7 +153,9 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: or attrs["requirements"].get("build", set()) or set() ) - return "python" not in build_host + return "python" not in build_host or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: with pushd(recipe_dir): diff --git a/conda_forge_tick/migrators/pip_wheel_dep.py b/conda_forge_tick/migrators/pip_wheel_dep.py index 152b8031e..1d6707409 100644 --- a/conda_forge_tick/migrators/pip_wheel_dep.py +++ b/conda_forge_tick/migrators/pip_wheel_dep.py @@ -9,7 +9,7 @@ from ruamel.yaml import YAML from conda_forge_tick.lazy_json_backends import CF_TICK_GRAPH_GITHUB_BACKEND_BASE_URL -from conda_forge_tick.migrators import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd from conda_forge_tick.utils import get_keys_default @@ -76,7 +76,7 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: if wheel_url is None: return True - return False + return False or _skip_due_to_schema(attrs, self.allowed_schema_versions) def determine_wheel(self, source_url: str, version: str): pkg = source_url.split("/")[6] diff --git a/conda_forge_tick/migrators/qt_to_qt_main.py b/conda_forge_tick/migrators/qt_to_qt_main.py index bc643901d..965d62d51 100644 --- a/conda_forge_tick/migrators/qt_to_qt_main.py +++ b/conda_forge_tick/migrators/qt_to_qt_main.py @@ -1,6 +1,6 @@ import os -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema def _parse_qt(lines): @@ -16,7 +16,9 @@ def _parse_qt(lines): class QtQtMainMigrator(MiniMigrator): def filter(self, attrs, not_bad_str_start=""): host_req = (attrs.get("requirements", {}) or {}).get("host", set()) or set() - return "qt" not in host_req + return "qt" not in host_req or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir, attrs, **kwargs): fname = os.path.join(recipe_dir, "meta.yaml") diff --git a/conda_forge_tick/migrators/r_ucrt.py b/conda_forge_tick/migrators/r_ucrt.py index 306de9329..572c60edb 100644 --- a/conda_forge_tick/migrators/r_ucrt.py +++ b/conda_forge_tick/migrators/r_ucrt.py @@ -2,7 +2,7 @@ import typing from typing import Any -from conda_forge_tick.migrators.core import MiniMigrator +from conda_forge_tick.migrators.core import MiniMigrator, _skip_due_to_schema from conda_forge_tick.os_utils import pushd if typing.TYPE_CHECKING: @@ -44,10 +44,12 @@ class RUCRTCleanup(MiniMigrator): """Cleanup the R recipes for ucrt""" def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: - return not any( - w in attrs.get("raw_meta_yaml", "") - for w in ["native", "- posix", "- m2w64"] - ) + return ( + not any( + w in attrs.get("raw_meta_yaml", "") + for w in ["native", "- posix", "- m2w64"] + ) + ) or _skip_due_to_schema(attrs, self.allowed_schema_versions) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: with pushd(recipe_dir): diff --git a/conda_forge_tick/migrators/use_pip.py b/conda_forge_tick/migrators/use_pip.py index a4959b675..cf33806aa 100644 --- a/conda_forge_tick/migrators/use_pip.py +++ b/conda_forge_tick/migrators/use_pip.py @@ -4,7 +4,7 @@ from conda_forge_tick.os_utils import pushd from conda_forge_tick.utils import as_iterable -from .core import MiniMigrator +from .core import MiniMigrator, _skip_due_to_schema if typing.TYPE_CHECKING: from ..migrators_types import AttrsTypedDict @@ -20,7 +20,9 @@ def filter(self, attrs: "AttrsTypedDict", not_bad_str_start: str = "") -> bool: scripts = as_iterable( attrs.get("meta_yaml", {}).get("build", {}).get("script", []), ) - return not bool(set(self.bad_install) & set(scripts)) + return (not bool(set(self.bad_install) & set(scripts))) or _skip_due_to_schema( + attrs, self.allowed_schema_versions + ) def migrate(self, recipe_dir: str, attrs: "AttrsTypedDict", **kwargs: Any) -> None: with pushd(recipe_dir): diff --git a/conda_forge_tick/migrators/version.py b/conda_forge_tick/migrators/version.py index 13d36cf32..758422e36 100644 --- a/conda_forge_tick/migrators/version.py +++ b/conda_forge_tick/migrators/version.py @@ -96,7 +96,7 @@ def filter( conditional = super().filter(attrs) result = bool( - conditional # if archived/finished + conditional # if archived/finished/schema version skip or len( [ k