From b603a25d776803df9a60948aea342176fc840463 Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Fri, 20 Aug 2021 17:31:55 +0530 Subject: [PATCH 1/6] Fix pinning expressions for prerelease builds --- conda_build/utils.py | 7 ++++++- .../_pinning_prerelease/conda_build_config.yaml | 7 +++++++ .../metadata/_pinning_prerelease/meta.yaml | 16 ++++++++++++++++ tests/test_api_build.py | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/test-recipes/metadata/_pinning_prerelease/conda_build_config.yaml create mode 100644 tests/test-recipes/metadata/_pinning_prerelease/meta.yaml diff --git a/conda_build/utils.py b/conda_build/utils.py index 2f5066f729..30ae089f5e 100644 --- a/conda_build/utils.py +++ b/conda_build/utils.py @@ -1514,7 +1514,12 @@ def apply_pin_expressions(version, min_pin='x.x.x.x.x.x.x', max_pin='x'): if versions[p_idx][-1] == '.': versions[p_idx] = versions[p_idx][:-1] if versions[0]: - versions[0] = '>=' + versions[0] + if VersionOrder(version) < VersionOrder(versions[0]): + # If the minimum is greater than the version this is a pre-release build. + # Use the version as the lower bound + versions[0] = '>=' + str(version) + else: + versions[0] = '>=' + versions[0] if versions[1]: versions[1] = '<' + versions[1] return ','.join([v for v in versions if v]) diff --git a/tests/test-recipes/metadata/_pinning_prerelease/conda_build_config.yaml b/tests/test-recipes/metadata/_pinning_prerelease/conda_build_config.yaml new file mode 100644 index 0000000000..9c6e3024b0 --- /dev/null +++ b/tests/test-recipes/metadata/_pinning_prerelease/conda_build_config.yaml @@ -0,0 +1,7 @@ +pin_run_as_build: + foo: + min_pin: x.x + max_pin: x.x + +foo: + - 3.10.0.rc1 diff --git a/tests/test-recipes/metadata/_pinning_prerelease/meta.yaml b/tests/test-recipes/metadata/_pinning_prerelease/meta.yaml new file mode 100644 index 0000000000..625ee9265b --- /dev/null +++ b/tests/test-recipes/metadata/_pinning_prerelease/meta.yaml @@ -0,0 +1,16 @@ +package: + name: foo + version: 3.10.0.rc1 + +outputs: + - name: foo + - name: bar + requirements: + host: + - foo + run: + - foo + test: + commands: + - echo "hello world" + diff --git a/tests/test_api_build.py b/tests/test_api_build.py index 8b1ecf6760..01daccdb94 100644 --- a/tests/test_api_build.py +++ b/tests/test_api_build.py @@ -1591,3 +1591,8 @@ def assert_keyword(keyword): assert_keyword('') finally: os.environ.pop(token) + + +def test_pin_expression_works_with_prereleases(testing_config): + recipe = os.path.join(metadata_dir, '_pinning_prerelease') + api.build(recipe, config=testing_config) From 63bd1dbb88fd00963af92088c7d53afa28961d97 Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Sun, 22 Aug 2021 17:23:33 -0500 Subject: [PATCH 2/6] Fix for when version has stars --- conda_build/utils.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/conda_build/utils.py b/conda_build/utils.py index 30ae089f5e..436a26f3ef 100644 --- a/conda_build/utils.py +++ b/conda_build/utils.py @@ -1514,10 +1514,16 @@ def apply_pin_expressions(version, min_pin='x.x.x.x.x.x.x', max_pin='x'): if versions[p_idx][-1] == '.': versions[p_idx] = versions[p_idx][:-1] if versions[0]: - if VersionOrder(version) < VersionOrder(versions[0]): + if version.endswith(".*"): + version_order = VersionOrder(version[:-2]) + elif version.endswith("*"): + version_order = VersionOrder(version[:-1]) + else: + version_order = VersionOrder(version) + if version_order < VersionOrder(versions[0]): # If the minimum is greater than the version this is a pre-release build. # Use the version as the lower bound - versions[0] = '>=' + str(version) + versions[0] = '>=' + version else: versions[0] = '>=' + versions[0] if versions[1]: From 825f0067745155781455ff8d54c0b612d24737ff Mon Sep 17 00:00:00 2001 From: Marcel Bargull Date: Wed, 25 Aug 2021 21:51:10 +0200 Subject: [PATCH 3/6] Tests: Check render output for prerelease pinning --- tests/test_api_build.py | 5 ----- tests/test_api_render.py | 8 ++++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/test_api_build.py b/tests/test_api_build.py index 01daccdb94..8b1ecf6760 100644 --- a/tests/test_api_build.py +++ b/tests/test_api_build.py @@ -1591,8 +1591,3 @@ def assert_keyword(keyword): assert_keyword('') finally: os.environ.pop(token) - - -def test_pin_expression_works_with_prereleases(testing_config): - recipe = os.path.join(metadata_dir, '_pinning_prerelease') - api.build(recipe, config=testing_config) diff --git a/tests/test_api_render.py b/tests/test_api_render.py index a67cff1841..bfe2a660fc 100644 --- a/tests/test_api_render.py +++ b/tests/test_api_render.py @@ -246,3 +246,11 @@ def test_run_exports_from_repo_without_channeldata(testing_config): # these two will be missing if run_exports has failed. assert ms[0][0].meta['requirements']['host'] == ["exporty"] assert ms[0][0].meta['requirements']['run'] == ["exporty"] + + +def test_pin_expression_works_with_prereleases(testing_config): + recipe = os.path.join(metadata_dir, '_pinning_prerelease') + ms = api.render(recipe, config=testing_config) + assert len(ms) == 2 + m = next(m_[0] for m_ in ms if m_[0].meta['package']['name'] == 'bar') + assert 'foo >=3.10.0.rc1,<3.11.0a0' in m.meta['requirements']['run'] From 48b3f45e681d34fc46e0604293fc9c08999fcb71 Mon Sep 17 00:00:00 2001 From: Marcel Bargull Date: Wed, 25 Aug 2021 21:53:08 +0200 Subject: [PATCH 4/6] Docs: Add note on ignoring min_pin for pre-release --- docs/source/resources/variants.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/resources/variants.rst b/docs/source/resources/variants.rst index 3ffbccd3b8..310af0761e 100644 --- a/docs/source/resources/variants.rst +++ b/docs/source/resources/variants.rst @@ -797,6 +797,10 @@ that was used at build time. # produces pins like >=1.11,<2 variants = [{'numpy': '1.11', 'pin_run_as_build': {'numpy': {'min_pin': 'x.x', 'max_pin': 'x'}}}] +Note that for pre-release versions ``min_pin`` will be ignored and substituted +with the exact input version since pre-releases can never match ``>=x.x`` (see +`build-version-spec`_ for details on pre-release version matching). + Pinning at the variant level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From cdea636e0dc84fd47a9228e47c40711c502d5e33 Mon Sep 17 00:00:00 2001 From: Marcel Bargull Date: Wed, 25 Aug 2021 21:54:05 +0200 Subject: [PATCH 5/6] News: gh-4272-Fix-pinning-expressions-for-prerelease-builds.rst --- ...ning-expressions-for-prerelease-builds.rst | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 news/gh-4272-Fix-pinning-expressions-for-prerelease-builds.rst diff --git a/news/gh-4272-Fix-pinning-expressions-for-prerelease-builds.rst b/news/gh-4272-Fix-pinning-expressions-for-prerelease-builds.rst new file mode 100644 index 0000000000..6b3791d796 --- /dev/null +++ b/news/gh-4272-Fix-pinning-expressions-for-prerelease-builds.rst @@ -0,0 +1,25 @@ +Enhancements: +------------- + +* + +Bug fixes: +---------- + +* Fix pinning expressions for prerelease builds + +Deprecations: +------------- + +* + +Docs: +----- + +* + +Other: +------ + +* + From c0fd580e0000ed2cd3622743f170898ebb586612 Mon Sep 17 00:00:00 2001 From: Marcel Bargull Date: Wed, 25 Aug 2021 21:55:02 +0200 Subject: [PATCH 6/6] Tests: Copy prerelease pinning test for python --- .../conda_build_config.yaml | 7 +++++++ .../_pinning_prerelease_python/meta.yaml | 16 ++++++++++++++++ tests/test_api_render.py | 8 ++++++++ 3 files changed, 31 insertions(+) create mode 100644 tests/test-recipes/metadata/_pinning_prerelease_python/conda_build_config.yaml create mode 100644 tests/test-recipes/metadata/_pinning_prerelease_python/meta.yaml diff --git a/tests/test-recipes/metadata/_pinning_prerelease_python/conda_build_config.yaml b/tests/test-recipes/metadata/_pinning_prerelease_python/conda_build_config.yaml new file mode 100644 index 0000000000..c66356a484 --- /dev/null +++ b/tests/test-recipes/metadata/_pinning_prerelease_python/conda_build_config.yaml @@ -0,0 +1,7 @@ +pin_run_as_build: + python: + min_pin: x.x + max_pin: x.x + +python: + - 3.10.0rc1 diff --git a/tests/test-recipes/metadata/_pinning_prerelease_python/meta.yaml b/tests/test-recipes/metadata/_pinning_prerelease_python/meta.yaml new file mode 100644 index 0000000000..c0462ba796 --- /dev/null +++ b/tests/test-recipes/metadata/_pinning_prerelease_python/meta.yaml @@ -0,0 +1,16 @@ +package: + name: foo + version: 3.10.0rc1 + +outputs: + - name: python + - name: bar + requirements: + host: + - python + run: + - python + test: + commands: + - echo "hello world" + diff --git a/tests/test_api_render.py b/tests/test_api_render.py index bfe2a660fc..2ed8598b8e 100644 --- a/tests/test_api_render.py +++ b/tests/test_api_render.py @@ -254,3 +254,11 @@ def test_pin_expression_works_with_prereleases(testing_config): assert len(ms) == 2 m = next(m_[0] for m_ in ms if m_[0].meta['package']['name'] == 'bar') assert 'foo >=3.10.0.rc1,<3.11.0a0' in m.meta['requirements']['run'] + + +def test_pin_expression_works_with_python_prereleases(testing_config): + recipe = os.path.join(metadata_dir, '_pinning_prerelease_python') + ms = api.render(recipe, config=testing_config) + assert len(ms) == 2 + m = next(m_[0] for m_ in ms if m_[0].meta['package']['name'] == 'bar') + assert 'python >=3.10.0rc1,<3.11.0a0' in m.meta['requirements']['run']