Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion conda_smithy/configure_feedstock.py
Original file line number Diff line number Diff line change
Expand Up @@ -693,12 +693,63 @@ def _collapse_subpackage_variants(

logger.debug("final used_key_values %s", pprint.pformat(used_key_values))

configs = break_up_top_level_values(top_level_loop_vars, used_key_values)

# return (configs, top_level_loop_vars)
Comment on lines +697 to +698
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

debug leftover?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took it as the "return type hint", as a comment


return (
break_up_top_level_values(top_level_loop_vars, used_key_values),
[
config
for config in configs
if not _is_config_skipped(config, top_level_loop_vars, list_of_metas)
],
top_level_loop_vars,
)


def _is_config_skipped(config, top_level_loop_vars, list_of_metas):
trimmed_config = {loop_var: config[loop_var] for loop_var in top_level_loop_vars}
logger.debug("checking config: %s", trimmed_config)
for i, meta in enumerate(list_of_metas):
trimmed_meta = {
loop_var: meta.config.variant.get(loop_var)
for loop_var in top_level_loop_vars
}
logger.debug(" checking in meta: %s", trimmed_meta)
for loop_var in top_level_loop_vars:
variant = meta.config.variant
if loop_var not in variant:
logger.debug(
" skipping meta because %s is not in meta variant", loop_var
)
break
if isinstance(variant[loop_var], (list, set)) and set(
config[loop_var]
) - set(variant[loop_var]):
logger.debug(
" skipping meta because %s in meta variant is %s, but in config is %s",
loop_var,
variant[loop_var],
config[loop_var],
)
break
if isinstance(variant[loop_var], (int, float, str)) and set(
config[loop_var]
) - set([variant[loop_var]]):
logger.debug(
" skipping meta because %s in meta variant is %s and in config is %s",
loop_var,
[variant[loop_var]],
config[loop_var],
)
break
else:
logger.debug(" FOUND! meta variant matches config")
return False
logger.debug(" SKIPPED!")
return True


def _yaml_represent_ordereddict(yaml_representer, data):
# represent_dict processes dict-likes with a .sort() method or plain iterables of key-value
# pairs. Only for the latter it never sorts and retains the order of the OrderedDict.
Expand Down
23 changes: 23 additions & 0 deletions news/2434-skipped-matrix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
**Added:**

* <news item>

**Changed:**

* <news item>

**Deprecated:**

* <news item>

**Removed:**

* <news item>

**Fixed:**

* Fix configuration generation by respecting additive ``skip`` statements properly. (#1617 via #2434)

**Security:**

* <news item>
7 changes: 7 additions & 0 deletions tests/recipes/skip_rerenders_ok/conda_build_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# https://github.com/conda-forge/conda-smithy/issues/1617
mpi:
- openmpi
- nompi
double:
- "no"
- "yes"
11 changes: 11 additions & 0 deletions tests/recipes/skip_rerenders_ok/meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package:
name: skip-rerenders-ok
version: 1.0

build:
# Only build for linux so we get up-to 4 configs (as per the conda-build-config-file)
skip: true # [not linux64]
# With this one skip, we remove one entry from the 2x2 matrix
skip: true # [mpi == "nompi" and double == "yes"]

about: {}
34 changes: 34 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import os
import shutil
import subprocess
from pathlib import Path
from textwrap import dedent

import pytest
Expand Down Expand Up @@ -349,6 +350,39 @@ def test_render_variant_mismatches(testing_workdir):
assert data["a"] == data["b"]


def test_render_skipped_variants(testing_workdir):
"""
Regression test for https://github.com/conda-forge/conda-smithy/issues/1617
"""
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
init_obj = cli.Init(subparser)
regen_obj = cli.Regenerate(subparser)
_thisdir = os.path.abspath(os.path.dirname(__file__))
recipe = os.path.join(_thisdir, "recipes", "skip_rerenders_ok")
feedstock_dir = os.path.join(testing_workdir, "test-skipped-variants-feedstock")
args = InitArgs(
recipe_directory=recipe,
feedstock_directory=feedstock_dir,
temporary_directory=os.path.join(recipe, "temp"),
)
init_obj(args)
args = RegenerateArgs(
feedstock_directory=feedstock_dir,
feedstock_config=None,
commit=False,
no_check_uptodate=True,
exclusive_config_file="recipe/conda_build_config.yaml",
check=False,
temporary_directory=os.path.join(recipe, "temp"),
)
regen_obj(args)

# We skip one config out of the 2x2 matrix, so we expect three configs
configs = list(Path(feedstock_dir, ".ci_support").glob("*.yaml"))
assert len(configs) == 3


def test_render_readme_with_v1_recipe_name(testing_workdir):
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
Expand Down