diff --git a/.github/workflows/GithubActionTests.yml b/.github/workflows/GithubActionTests.yml index 091b4d5e64..bb319d1a28 100644 --- a/.github/workflows/GithubActionTests.yml +++ b/.github/workflows/GithubActionTests.yml @@ -17,6 +17,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: set path run: echo "/opt/mambaforge/bin" >> $GITHUB_PATH @@ -52,6 +54,8 @@ jobs: runs-on: macos-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: set path run: echo "/opt/mambaforge/bin" >> $GITHUB_PATH diff --git a/bioconda_utils/build.py b/bioconda_utils/build.py index 3101394350..2dd6b2efd2 100644 --- a/bioconda_utils/build.py +++ b/bioconda_utils/build.py @@ -27,6 +27,7 @@ from . import upload from . import lint from . import graph +from . import recipe as _recipe logger = logging.getLogger(__name__) @@ -259,6 +260,26 @@ def get_subdags(dag, n_workers, worker_offset): return subdags +def do_not_consider_for_additional_platform(recipe_folder: str, recipe: str, platform: str): + """ + Given a recipe, check this recipe should skip in current platform or not. + + Arguments: + recipe_folder: Directory containing possibly many, and possibly nested, recipes. + recipe: Relative path to recipe + platform: current native platform + + Returns: + Return True if current native platform are not included in recipe's additional platforms (no need to build). + """ + recipe_obj = _recipe.Recipe.from_file(recipe_folder, recipe) + # On linux-aarch64 env, only build recipe with linux-aarch64 extra_additional_platforms + if platform == "linux-aarch64": + if "linux-aarch64" not in recipe_obj.extra_additional_platforms: + return True + return False + + def build_recipes(recipe_folder: str, config_path: str, recipes: List[str], mulled_test: bool = True, testonly: bool = False, force: bool = False, @@ -356,6 +377,11 @@ def build_recipes(recipe_folder: str, config_path: str, recipes: List[str], failed_uploads = [] for recipe, name in recipes: + platform = utils.RepoData().native_platform() + if not force and do_not_consider_for_additional_platform(recipe_folder, recipe, platform): + logger.info("BUILD SKIP: skipping %s for additional platform %s", recipe, platform) + continue + if name in skip_dependent: logger.info('BUILD SKIP: skipping %s because it depends on %s ' 'which had a failed build.', diff --git a/bioconda_utils/recipe.py b/bioconda_utils/recipe.py index ca955e6b1f..2eae36f2c7 100644 --- a/bioconda_utils/recipe.py +++ b/bioconda_utils/recipe.py @@ -406,6 +406,13 @@ def maintainers(self): return utils.ensure_list(self.meta['extra']['recipe-maintainers']) return [] + @property + def extra_additional_platforms(self) -> list: + """The extra additional-platforms list""" + if 'extra' in self.meta and 'additional-platforms' in self.meta['extra']: + return list(self.meta["extra"]["additional-platforms"]) + return [] + @property def name(self) -> str: """The name of the toplevel package built by this recipe""" diff --git a/test/test_recipe.py b/test/test_recipe.py index e7e296379e..5e1b84559c 100644 --- a/test/test_recipe.py +++ b/test/test_recipe.py @@ -258,6 +258,18 @@ def test_recipe_package_names(recipe): assert recipe.package_names == expected +@with_recipes +def test_recipe_extra_additional_platforms(recipe): + assert recipe.extra_additional_platforms == [] + recipe.meta_yaml += [ + 'extra:', + ' additional-platforms:', + ' - linux-aarch64' + ] + recipe.render() + assert recipe.extra_additional_platforms == ["linux-aarch64"] + + @with_recipes def test_get_deps_dict(recipe): recipe.meta_yaml.extend([ diff --git a/test/test_utils.py b/test/test_utils.py index 09c4abb9eb..916fb10894 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -889,6 +889,42 @@ def test_load_meta_skipping(): assert utils.load_all_meta(recipe) == [] +def test_native_platform_skipping(): + expections = [ + # Don't skip linux-x86 for any recipes + ["one", "linux", False], + ["two", "linux", False], + # Skip recipe without linux aarch64 enable on linux-aarch64 platform + ["one", "linux-aarch64", True], + # Don't skip recipe with linux aarch64 enable on linux-aarch64 platform + ["two", "linux-aarch64", False], + ] + r = Recipes( + """ + one: + meta.yaml: | + package: + name: one + version: "0.1" + two: + meta.yaml: | + package: + name: one + version: "0.1" + extra: + additional-platforms: + - linux-aarch64 + """, from_string=True) + r.write_recipes() + # Make sure RepoData singleton init + utils.RepoData.register_config(config_fixture) + for recipe_name, platform, result in expections: + recipe_folder = os.path.dirname(r.recipe_dirs[recipe_name]) + assert build.do_not_consider_for_additional_platform(recipe_folder, + r.recipe_dirs[recipe_name], + platform) == result + + def test_variants(): """ Multiple variants should return multiple metadata