From 0151903a8b9c22dbaa07deb4d076e3766e2c76d5 Mon Sep 17 00:00:00 2001 From: killua156 Date: Thu, 2 Jul 2026 14:37:38 -0500 Subject: [PATCH 1/3] constantly 23.10.4 and add killua156 as maintainer Bumps constantly from 15.1.0 to 23.10.4 (same recipe changes as #4: pip-based build, python >=3.8, versioneer/setuptools host deps, pip check test) and adds killua156 to recipe-maintainers. --- recipe/meta.yaml | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 4a7822d..dc1f645 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -1,29 +1,35 @@ {% set name = "constantly" %} -{% set version = "15.1.0" %} +{% set version = "23.10.4" %} package: - name: {{ name }} + name: {{ name|lower }} version: {{ version }} source: - url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz - sha256: 586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35 + url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/constantly-{{ version }}.tar.gz + sha256: aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd build: - number: 0 noarch: python - script: python setup.py install --single-version-externally-managed --record record.txt + script: {{ PYTHON }} -m pip install . -vv + number: 0 requirements: - build: - - python - - setuptools + host: + - python >=3.8 + - setuptools >=68.2 + - versioneer ==0.29 + - pip run: - - python + - python >=3.8 test: imports: - constantly + commands: + - pip check + requires: + - pip about: home: https://github.com/twisted/constantly @@ -41,3 +47,4 @@ about: extra: recipe-maintainers: - isuruf + - killua156 From 09d03fed14211d8570a15806ad653112f022f45d Mon Sep 17 00:00:00 2001 From: killua156 Date: Thu, 2 Jul 2026 14:42:46 -0500 Subject: [PATCH 2/3] Convert to v1 recipe.yaml, use rattler-build Converts meta.yaml to the v1 recipe.yaml format, uses python_min pins and pypi.org source url per linter hints, and sets conda_build_tool: rattler-build. Keeps the 23.10.4 bump and the new killua156 maintainer. --- conda-forge.yml | 1 + recipe/meta.yaml | 50 ---------------------------------------------- recipe/recipe.yaml | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 50 deletions(-) delete mode 100644 recipe/meta.yaml create mode 100644 recipe/recipe.yaml diff --git a/conda-forge.yml b/conda-forge.yml index 2f501ce..6e85597 100644 --- a/conda-forge.yml +++ b/conda-forge.yml @@ -1,3 +1,4 @@ +conda_build_tool: rattler-build conda_forge_output_validation: true github: branch_name: main diff --git a/recipe/meta.yaml b/recipe/meta.yaml deleted file mode 100644 index dc1f645..0000000 --- a/recipe/meta.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{% set name = "constantly" %} -{% set version = "23.10.4" %} - -package: - name: {{ name|lower }} - version: {{ version }} - -source: - url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/constantly-{{ version }}.tar.gz - sha256: aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd - -build: - noarch: python - script: {{ PYTHON }} -m pip install . -vv - number: 0 - -requirements: - host: - - python >=3.8 - - setuptools >=68.2 - - versioneer ==0.29 - - pip - run: - - python >=3.8 - -test: - imports: - - constantly - commands: - - pip check - requires: - - pip - -about: - home: https://github.com/twisted/constantly - license: MIT - license_family: MIT - license_file: LICENSE - summary: Symbolic constants in Python - description: | - A library that provides symbolic constant support. - It includes collections and constants with text, numeric, and bit flag values. - Originally twisted.python.constants from the Twisted project. - doc_url: http://constantly.readthedocs.io/en/latest - dev_url: https://github.com/twisted/constantly - -extra: - recipe-maintainers: - - isuruf - - killua156 diff --git a/recipe/recipe.yaml b/recipe/recipe.yaml new file mode 100644 index 0000000..daa6cfa --- /dev/null +++ b/recipe/recipe.yaml @@ -0,0 +1,50 @@ +schema_version: 1 + +context: + version: "23.10.4" + +package: + name: constantly + version: ${{ version }} + +source: + url: https://pypi.org/packages/source/c/constantly/constantly-${{ version }}.tar.gz + sha256: aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd + +build: + noarch: python + number: 0 + script: ${{ PYTHON }} -m pip install . -vv --no-deps --no-build-isolation + +requirements: + host: + - python ${{ python_min }}.* + - setuptools >=68.2 + - versioneer ==0.29 + - pip + run: + - python >=${{ python_min }} + +tests: + - python: + imports: + - constantly + pip_check: true + python_version: ["${{ python_min }}.*", "*"] + +about: + homepage: https://github.com/twisted/constantly + license: MIT + license_file: LICENSE + summary: Symbolic constants in Python + description: | + A library that provides symbolic constant support. + It includes collections and constants with text, numeric, and bit flag values. + Originally twisted.python.constants from the Twisted project. + documentation: http://constantly.readthedocs.io/en/latest + repository: https://github.com/twisted/constantly + +extra: + recipe-maintainers: + - isuruf + - killua156 From 119aa9c2aff04af76a30245e3fc1abf56f56d36b Mon Sep 17 00:00:00 2001 From: "conda-forge-webservices[bot]" <91080706+conda-forge-webservices[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 19:44:55 +0000 Subject: [PATCH 3/3] MNT: Re-rendered with conda-smithy 2026.6.14 and conda-forge-pinning 2026.07.02.17.44.1 --- .ci_support/README | 6 ++ .ci_support/linux_64_.yaml | 8 ++ .circleci/config.yml | 25 ++--- .gitattributes | 21 ++++ .github/CODEOWNERS | 1 + .github/workflows/conda-build.yml | 130 +++++++++++++++++++++-- .gitignore | 29 ++++- .scripts/build_steps.sh | 115 ++++++++++++++++++++ .scripts/logging_utils.sh | 35 ++++++ .scripts/run_docker_build.sh | 146 ++++++++++++++++++++++++++ LICENSE | 13 --- LICENSE.txt | 26 +++++ README.md | 93 ++++++++++++---- build-locally.py | 128 ++++++++++++++++++++++ ci_support/checkout_merge_commit.sh | 27 ----- ci_support/fast_finish_ci_pr_build.sh | 4 - ci_support/run_docker_build.sh | 70 ------------ 17 files changed, 723 insertions(+), 154 deletions(-) create mode 100644 .ci_support/README create mode 100644 .ci_support/linux_64_.yaml create mode 100644 .github/CODEOWNERS create mode 100755 .scripts/build_steps.sh create mode 100644 .scripts/logging_utils.sh create mode 100755 .scripts/run_docker_build.sh delete mode 100644 LICENSE create mode 100644 LICENSE.txt create mode 100755 build-locally.py delete mode 100755 ci_support/checkout_merge_commit.sh delete mode 100755 ci_support/fast_finish_ci_pr_build.sh delete mode 100755 ci_support/run_docker_build.sh diff --git a/.ci_support/README b/.ci_support/README new file mode 100644 index 0000000..a47316b --- /dev/null +++ b/.ci_support/README @@ -0,0 +1,6 @@ +This file is automatically generated by conda-smithy. If any +particular build configuration is expected, but it is not found, +please make sure all dependencies are satisfiable. To add/modify any +matrix elements, you should create/change conda-smithy's input +recipe/conda_build_config.yaml and re-render the recipe, rather than +editing these files directly. diff --git a/.ci_support/linux_64_.yaml b/.ci_support/linux_64_.yaml new file mode 100644 index 0000000..04f0b1b --- /dev/null +++ b/.ci_support/linux_64_.yaml @@ -0,0 +1,8 @@ +channel_sources: +- conda-forge +channel_targets: +- conda-forge main +docker_image: +- quay.io/condaforge/linux-anvil-x86_64:alma9 +python_min: +- '3.10' diff --git a/.circleci/config.yml b/.circleci/config.yml index c0a1aa1..8b4ef2f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,24 +1,25 @@ +# This file was generated automatically from conda-smithy. To update this configuration, +# update the conda-forge.yml and/or the recipe/meta.yaml. +# -*- mode: jinja-yaml -*- + version: 2 jobs: build: working_directory: ~/test - machine: true + machine: + image: ubuntu-2004:current steps: - - checkout - - run: - name: Fast finish outdated PRs and merge PRs - command: | - ./ci_support/fast_finish_ci_pr_build.sh - ./ci_support/checkout_merge_commit.sh - - run: - command: docker pull condaforge/linux-anvil - run: - # Run, test and (if we have a BINSTAR_TOKEN) upload the distributions. - command: ./ci_support/run_docker_build.sh + # The Circle-CI build should not be active, but if this is not true for some reason, do a fast finish. + command: exit 0 workflows: version: 2 build_and_test: jobs: - - build + - build: + filters: + branches: + ignore: + - /.*/ diff --git a/.gitattributes b/.gitattributes index 974953e..85ccb8f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,3 +5,24 @@ meta.yaml text eol=lf build.sh text eol=lf bld.bat text eol=crlf + +# github helper pieces to make some files not show up in diffs automatically +.azure-pipelines/* linguist-generated=true +.circleci/* linguist-generated=true +.ci_support/README linguist-generated=true +.drone/* linguist-generated=true +.drone.yml linguist-generated=true +.github/* linguist-generated=true +.travis/* linguist-generated=true +.appveyor.yml linguist-generated=true +.gitattributes linguist-generated=true +.gitignore linguist-generated=true +.travis.yml linguist-generated=true +.scripts/* linguist-generated=true +.woodpecker.yml linguist-generated=true +/LICENSE.txt linguist-generated=true +/README.md linguist-generated=true +azure-pipelines.yml linguist-generated=true +build-locally.py linguist-generated=true +pixi.toml linguist-generated=true +shippable.yml linguist-generated=true diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..5fa29ef --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @isuruf @killua156 \ No newline at end of file diff --git a/.github/workflows/conda-build.yml b/.github/workflows/conda-build.yml index a948c6c..c88da12 100644 --- a/.github/workflows/conda-build.yml +++ b/.github/workflows/conda-build.yml @@ -1,15 +1,131 @@ -# This file was added automatically by admin-migrations. Do not modify. -# It ensures that Github Actions can run once rerendered for the first time. +# This file was generated automatically from conda-smithy. To update this configuration, +# update the conda-forge.yml and/or the recipe/meta.yaml. # -*- mode: yaml -*- name: Build conda package on: - workflow_dispatch: + push: + + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true jobs: build: - name: Disabled build - runs-on: ubuntu-slim - if: false + name: ${{ matrix.CONFIG }} + runs-on: ${{ matrix.runs_on }} + timeout-minutes: 360 + strategy: + fail-fast: false + max-parallel: 50 + matrix: + include: + - CONFIG: linux_64_ + DOCKER_IMAGE: quay.io/condaforge/linux-anvil-x86_64:alma9 + STORE_BUILD_ARTIFACTS: False + UPLOAD_PACKAGES: True + build_workspace_dir: build_artifacts + docker_run_args: + free_disk_space: skip + os: ubuntu + pagefile_size: 0 + resize_partitions: False + runs_on: ['ubuntu-latest'] + tools_install_dir: ~/miniforge3 steps: - - run: exit 0 + + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Configure binfmt_misc + if: matrix.os == 'ubuntu' + shell: bash + run: | + if [[ "$(uname -m)" == "x86_64" ]]; then + docker run --rm --privileged multiarch/qemu-user-static:register --reset --credential yes + fi + + - name: Build on Linux + id: build-linux + if: matrix.os == 'ubuntu' + env: + CI: github_actions + CONDA_BLD_PATH: ${{ matrix.build_workspace_dir }} + CONDA_FORGE_DOCKER_RUN_ARGS: ${{ matrix.docker_run_args }} + CONFIG: ${{ matrix.CONFIG }} + MINIFORGE_HOME: ${{ matrix.tools_install_dir }} + DOCKER_IMAGE: ${{ matrix.DOCKER_IMAGE }} + UPLOAD_PACKAGES: ${{ matrix.UPLOAD_PACKAGES }} + RATTLER_BUILD_COLOR: always + RATTLER_BUILD_ENABLE_GITHUB_INTEGRATION: 'true' + BINSTAR_TOKEN: ${{ secrets.BINSTAR_TOKEN }} + FEEDSTOCK_TOKEN: ${{ secrets.FEEDSTOCK_TOKEN }} + STAGING_BINSTAR_TOKEN: ${{ secrets.STAGING_BINSTAR_TOKEN }} + shell: bash + run: | + export CONDA_BLD_PATH="${CONDA_BLD_PATH/#~/${HOME}}" + export FEEDSTOCK_NAME="$(basename $GITHUB_REPOSITORY)" + export GIT_BRANCH="$(basename $GITHUB_REF)" + export MINIFORGE_HOME="${MINIFORGE_HOME/#~/${HOME}}" + export flow_run_id="github_$GITHUB_RUN_ID" + export remote_url="https://github.com/$GITHUB_REPOSITORY" + export sha="$GITHUB_SHA" + if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then + export IS_PR_BUILD="True" + else + export IS_PR_BUILD="False" + fi + ./.scripts/run_docker_build.sh + + - name: Build on macOS + id: build-macos + if: matrix.os == 'macos' + env: + CI: github_actions + CONDA_BLD_PATH: ${{ matrix.build_workspace_dir }} + CONFIG: ${{ matrix.CONFIG }} + MINIFORGE_HOME: ${{ matrix.tools_install_dir }} + UPLOAD_PACKAGES: ${{ matrix.UPLOAD_PACKAGES }} + RATTLER_BUILD_COLOR: always + RATTLER_BUILD_ENABLE_GITHUB_INTEGRATION: 'true' + BINSTAR_TOKEN: ${{ secrets.BINSTAR_TOKEN }} + FEEDSTOCK_TOKEN: ${{ secrets.FEEDSTOCK_TOKEN }} + STAGING_BINSTAR_TOKEN: ${{ secrets.STAGING_BINSTAR_TOKEN }} + shell: bash + run: | + export CONDA_BLD_PATH="${CONDA_BLD_PATH/#~/${HOME}}" + export FEEDSTOCK_NAME="$(basename $GITHUB_REPOSITORY)" + export GIT_BRANCH="$(basename $GITHUB_REF)" + export MINIFORGE_HOME="${MINIFORGE_HOME/#~/${HOME}}" + export flow_run_id="github_$GITHUB_RUN_ID" + export remote_url="https://github.com/$GITHUB_REPOSITORY" + export sha="$GITHUB_SHA" + if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then + export IS_PR_BUILD="True" + else + export IS_PR_BUILD="False" + fi + ./.scripts/run_osx_build.sh + + - name: Build on windows + id: build-windows + if: matrix.os == 'windows' + shell: cmd + run: | + set "flow_run_id=github_%GITHUB_RUN_ID%" + set "remote_url=https://github.com/%GITHUB_REPOSITORY%" + set "sha=%GITHUB_SHA%" + call ".scripts\run_win_build.bat" + env: + CI: github_actions + CONDA_BLD_PATH: ${{ matrix.build_workspace_dir }} + CONFIG: ${{ matrix.CONFIG }} + MINIFORGE_HOME: ${{ matrix.tools_install_dir }} + PYTHONUNBUFFERED: 1 + UPLOAD_PACKAGES: ${{ matrix.UPLOAD_PACKAGES }} + RATTLER_BUILD_COLOR: always + RATTLER_BUILD_ENABLE_GITHUB_INTEGRATION: 'true' + BINSTAR_TOKEN: ${{ secrets.BINSTAR_TOKEN }} + FEEDSTOCK_TOKEN: ${{ secrets.FEEDSTOCK_TOKEN }} + STAGING_BINSTAR_TOKEN: ${{ secrets.STAGING_BINSTAR_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3dc1e2f..86a9c55 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,30 @@ +# User content belongs under recipe/. +# Feedstock configuration goes in `conda-forge.yml` +# Everything else is managed by the conda-smithy rerender process. +# Please do not modify + +# Ignore all files and folders in root +* +!/conda-forge.yml +!.recipe_maintainers.json + +# Don't ignore any files/folders if the parent folder is 'un-ignored' +# This also avoids warnings when adding an already-checked file with an ignored parent. +!/**/ +# Don't ignore any files/folders recursively in the following folders +!/recipe/** +!/.ci_support/** + +# Since we ignore files/folders recursively, any folders inside +# build_artifacts gets ignored which trips some build systems. +# To avoid that we 'un-ignore' all files/folders recursively +# and only ignore the root build_artifacts folder. +!/build_artifacts/** +/build_artifacts + *.pyc -build_artefacts +# Rattler-build's artifacts are in `output` when not specifying anything. +/output +# Pixi's configuration +.pixi diff --git a/.scripts/build_steps.sh b/.scripts/build_steps.sh new file mode 100755 index 0000000..0808097 --- /dev/null +++ b/.scripts/build_steps.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash + +# PLEASE NOTE: This script has been automatically generated by conda-smithy. Any changes here +# will be lost next time ``conda smithy rerender`` is run. If you would like to make permanent +# changes to this script, consider a proposal to conda-smithy so that other feedstocks can also +# benefit from the improvement. + +# -*- mode: jinja-shell -*- + +set -xeuo pipefail +export FEEDSTOCK_ROOT="${FEEDSTOCK_ROOT:-/home/conda/feedstock_root}" +source ${FEEDSTOCK_ROOT}/.scripts/logging_utils.sh + + +( endgroup "Start Docker" ) 2> /dev/null + +( startgroup "Configuring conda" ) 2> /dev/null + +export PYTHONUNBUFFERED=1 +export RECIPE_ROOT="${RECIPE_ROOT:-/home/conda/recipe_root}" +export CI_SUPPORT="${FEEDSTOCK_ROOT}/.ci_support" +export CONFIG_FILE="${CI_SUPPORT}/${CONFIG}.yaml" +export RATTLER_CACHE_DIR="${FEEDSTOCK_ROOT}/build_artifacts/pkg_cache" + +cat >~/.condarc < /opt/conda/conda-meta/history +micromamba install --root-prefix ~/.conda --prefix /opt/conda \ + --yes --override-channels --channel conda-forge --strict-channel-priority \ + pip rattler-build conda-forge-ci-setup=4 "conda-build>=26.3" +export CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED=1 + +# set up the condarc +setup_conda_rc "${FEEDSTOCK_ROOT}" "${RECIPE_ROOT}" "${CONFIG_FILE}" + +source run_conda_forge_build_setup + + + +# make the build number clobber +make_build_number "${FEEDSTOCK_ROOT}" "${RECIPE_ROOT}" "${CONFIG_FILE}" + + + +( endgroup "Configuring conda" ) 2> /dev/null + +if [[ -f "${FEEDSTOCK_ROOT}/LICENSE.txt" ]]; then + cp "${FEEDSTOCK_ROOT}/LICENSE.txt" "${RECIPE_ROOT}/recipe-scripts-license.txt" +fi + +if [[ "${BUILD_WITH_CONDA_DEBUG:-0}" == 1 ]]; then + # differences between conda-build vs. rattler-build + # - 1 step (conda debug + manually open shell) vs. 2 step (rb debug {setup, shell}) + # - recipe is positional vs. --recipe "${RECIPE_ROOT}" + # - --output-id vs. --output-name + # - --clobber-file vs. none + # - none vs. --target-platform + export CONDA_BLD_PATH="${CONDA_BLD_PATH:-${FEEDSTOCK_ROOT}/build_artifacts}" + rattler-build debug setup \ + --recipe "${RECIPE_ROOT}" \ + -m "${CI_SUPPORT}/${CONFIG}.yaml" \ + ${EXTRA_CB_OPTIONS:-} \ + ${BUILD_OUTPUT_ID:+--output-name "${BUILD_OUTPUT_ID}"} \ + --target-platform "${HOST_PLATFORM}" + + rattler-build debug shell +else + # differences between conda-build vs. rattler-build + # - recipe is positional vs. --recipe "${RECIPE_ROOT}" + # - --suppress-variables vs. none + # - --clobber-file vs. none + # - none vs. --target-platform + # - --extra-meta a=b c=d vs. --extra-meta a=b --extra-meta c=d + + rattler-build build \ + --recipe "${RECIPE_ROOT}" \ + -m "${CI_SUPPORT}/${CONFIG}.yaml" \ + ${EXTRA_CB_OPTIONS:-} \ + --target-platform "${HOST_PLATFORM}" \ + --extra-meta flow_run_id="${flow_run_id:-}" \ + --extra-meta remote_url="${remote_url:-}" \ + --extra-meta sha="${sha:-}" + ( startgroup "Inspecting artifacts" ) 2> /dev/null + + # inspect_artifacts was only added in conda-forge-ci-setup 4.9.4 + command -v inspect_artifacts >/dev/null 2>&1 && inspect_artifacts --recipe-dir "${RECIPE_ROOT}" -m "${CONFIG_FILE}" || echo "inspect_artifacts needs conda-forge-ci-setup >=4.9.4" + + ( endgroup "Inspecting artifacts" ) 2> /dev/null + ( startgroup "Validating outputs" ) 2> /dev/null + + validate_recipe_outputs "${FEEDSTOCK_NAME}" + + ( endgroup "Validating outputs" ) 2> /dev/null + + ( startgroup "Uploading packages" ) 2> /dev/null + + if [[ "${UPLOAD_PACKAGES}" != "False" ]] && [[ "${IS_PR_BUILD}" == "False" ]]; then + upload_package --validate --feedstock-name="${FEEDSTOCK_NAME}" "${FEEDSTOCK_ROOT}" "${RECIPE_ROOT}" "${CONFIG_FILE}" + fi + + ( endgroup "Uploading packages" ) 2> /dev/null +fi + +( startgroup "Final checks" ) 2> /dev/null + +touch "${FEEDSTOCK_ROOT}/build_artifacts/conda-forge-build-done-${CONFIG}" diff --git a/.scripts/logging_utils.sh b/.scripts/logging_utils.sh new file mode 100644 index 0000000..aff009f --- /dev/null +++ b/.scripts/logging_utils.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Provide a unified interface for the different logging +# utilities CI providers offer. If unavailable, provide +# a compatible fallback (e.g. bare `echo xxxxxx`). + +function startgroup { + # Start a foldable group of log lines + # Pass a single argument, quoted + case ${CI:-} in + azure ) + echo "##[group]$1";; + travis ) + echo "$1" + echo -en 'travis_fold:start:'"${1// /}"'\r';; + github_actions ) + echo "::group::$1";; + * ) + echo "$1";; + esac +} 2> /dev/null + +function endgroup { + # End a foldable group of log lines + # Pass a single argument, quoted + + case ${CI:-} in + azure ) + echo "##[endgroup]";; + travis ) + echo -en 'travis_fold:end:'"${1// /}"'\r';; + github_actions ) + echo "::endgroup::";; + esac +} 2> /dev/null diff --git a/.scripts/run_docker_build.sh b/.scripts/run_docker_build.sh new file mode 100755 index 0000000..17d983f --- /dev/null +++ b/.scripts/run_docker_build.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash + +# PLEASE NOTE: This script has been automatically generated by conda-smithy. Any changes here +# will be lost next time ``conda smithy rerender`` is run. If you would like to make permanent +# changes to this script, consider a proposal to conda-smithy so that other feedstocks can also +# benefit from the improvement. + +source .scripts/logging_utils.sh + +( startgroup "Configure Docker" ) 2> /dev/null + +set -xeo pipefail + +DOCKER_EXECUTABLE="${DOCKER_EXECUTABLE:-docker}" + +THISDIR="$( cd "$( dirname "$0" )" >/dev/null && pwd )" +PROVIDER_DIR="$(basename "$THISDIR")" + +FEEDSTOCK_ROOT="$( cd "$( dirname "$0" )/.." >/dev/null && pwd )" +RECIPE_ROOT="${FEEDSTOCK_ROOT}/recipe" + +if [ -z ${FEEDSTOCK_NAME} ]; then + export FEEDSTOCK_NAME=$(basename ${FEEDSTOCK_ROOT}) +fi + +if [[ "${sha:-}" == "" ]]; then + pushd "${FEEDSTOCK_ROOT}" + sha=$(git rev-parse HEAD) + popd +fi + +${DOCKER_EXECUTABLE} info + +# In order for the conda-build process in the container to write to the mounted +# volumes, we need to run with the same id as the host machine, which is +# normally the owner of the mounted volumes, or at least has write permission +export HOST_USER_ID=$(id -u) +# Check if docker-machine is being used (normally on OSX) and get the uid from +# the VM + +if hash docker-machine 2> /dev/null && docker-machine active > /dev/null; then + export HOST_USER_ID=$(docker-machine ssh $(docker-machine active) id -u) +fi + +ARTIFACTS="$FEEDSTOCK_ROOT/build_artifacts" + +if [ -z "$CONFIG" ]; then + set +x + FILES=`ls .ci_support/linux_*` + CONFIGS="" + for file in $FILES; do + CONFIGS="${CONFIGS}'${file:12:-5}' or "; + done + echo "Need to set CONFIG env variable. Value can be one of ${CONFIGS:0:-4}" + exit 1 +fi + +if [ -z "${DOCKER_IMAGE}" ]; then + SHYAML_INSTALLED="$(shyaml -h || echo NO)" + if [ "${SHYAML_INSTALLED}" == "NO" ]; then + echo "WARNING: DOCKER_IMAGE variable not set and shyaml not installed. Trying to parse with coreutils" + DOCKER_IMAGE=$(cat .ci_support/${CONFIG}.yaml | grep '^docker_image:$' -A 1 | tail -n 1 | cut -b 3-) + if [ "${DOCKER_IMAGE}" = "" ]; then + echo "No docker_image entry found in ${CONFIG}. Falling back to quay.io/condaforge/linux-anvil-comp7" + DOCKER_IMAGE="quay.io/condaforge/linux-anvil-comp7" + fi + else + DOCKER_IMAGE="$(cat "${FEEDSTOCK_ROOT}/.ci_support/${CONFIG}.yaml" | shyaml get-value docker_image.0 quay.io/condaforge/linux-anvil-comp7 )" + fi +fi + +mkdir -p "$ARTIFACTS" +DONE_CANARY="$ARTIFACTS/conda-forge-build-done-${CONFIG}" +rm -f "$DONE_CANARY" + +# Allow people to specify extra default arguments to `docker run` (e.g. `--rm`) +DOCKER_RUN_ARGS="${CONDA_FORGE_DOCKER_RUN_ARGS}" +if [ -z "${CI}" ]; then + DOCKER_RUN_ARGS="-it ${DOCKER_RUN_ARGS}" +fi + +# Default volume suffix for Docker (preserve original behavior) +VOLUME_SUFFIX=",z" + +# Podman-specific handling +if [ "${DOCKER_EXECUTABLE}" = "podman" ]; then + # Fix file permissions for rootless podman builds + podman unshare chown -R ${HOST_USER_ID}:${HOST_USER_ID} "${ARTIFACTS}" + podman unshare chown -R ${HOST_USER_ID}:${HOST_USER_ID} "${RECIPE_ROOT}" + + # Add SELinux label only if enforcing + if command -v getenforce &>/dev/null && [ "$(getenforce)" = "Enforcing" ]; then + VOLUME_SUFFIX=",z" + else + VOLUME_SUFFIX="" + fi +fi + +# When running on GitHub Actions, mount the step summary file into the container +# and point GITHUB_STEP_SUMMARY at it so that rattler-build's GitHub integration +# can write its summary. GitHub writes the file out to the job summary after the +# step finishes. +if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then + DOCKER_RUN_ARGS="${DOCKER_RUN_ARGS} -v ${GITHUB_STEP_SUMMARY}:/home/conda/github_step_summary:rw${VOLUME_SUFFIX},delegated -e GITHUB_STEP_SUMMARY=/home/conda/github_step_summary" +fi + +( endgroup "Configure Docker" ) 2> /dev/null +( startgroup "Start Docker" ) 2> /dev/null + +export UPLOAD_PACKAGES="${UPLOAD_PACKAGES:-True}" +export IS_PR_BUILD="${IS_PR_BUILD:-False}" + +${DOCKER_EXECUTABLE} pull "${DOCKER_IMAGE}" + +${DOCKER_EXECUTABLE} run ${DOCKER_RUN_ARGS} \ + -v "${RECIPE_ROOT}":/home/conda/recipe_root:rw${VOLUME_SUFFIX},delegated \ + -v "${FEEDSTOCK_ROOT}":/home/conda/feedstock_root:rw${VOLUME_SUFFIX},delegated \ + -e BUILD_OUTPUT_ID \ + -e BUILD_WITH_CONDA_DEBUG \ + -e CI \ + -e CONFIG \ + -e CPU_COUNT \ + -e FEEDSTOCK_NAME \ + -e GIT_BRANCH \ + -e GITHUB_ACTIONS \ + -e HOST_USER_ID \ + -e IS_PR_BUILD \ + -e RATTLER_BUILD_COLOR \ + -e RATTLER_BUILD_ENABLE_GITHUB_INTEGRATION \ + -e UPLOAD_ON_BRANCH \ + -e UPLOAD_PACKAGES \ + -e flow_run_id \ + -e remote_url \ + -e sha \ + -e BINSTAR_TOKEN \ + -e FEEDSTOCK_TOKEN \ + -e STAGING_BINSTAR_TOKEN \ + "${DOCKER_IMAGE}" \ + bash \ + "/home/conda/feedstock_root/${PROVIDER_DIR}/build_steps.sh" + +# verify that the end of the script was reached +test -f "$DONE_CANARY" + +# This closes the last group opened in `build_steps.sh` +( endgroup "Final checks" ) 2> /dev/null diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 7f5c363..0000000 --- a/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -BSD 3-clause license -Copyright (c) 2015-2017, conda-forge -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..c5aa738 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,26 @@ +BSD-3-Clause license +Copyright (c) 2015-2026, conda-forge contributors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/README.md b/README.md index 3292953..375a166 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,42 @@ -About constantly -================ +About constantly-feedstock +========================== + +Feedstock license: [BSD-3-Clause](https://github.com/conda-forge/constantly-feedstock/blob/main/LICENSE.txt) Home: https://github.com/twisted/constantly Package license: MIT -Feedstock license: BSD 3-Clause - Summary: Symbolic constants in Python +Development: https://github.com/twisted/constantly + +Documentation: http://constantly.readthedocs.io/en/latest + A library that provides symbolic constant support. It includes collections and constants with text, numeric, and bit flag values. Originally twisted.python.constants from the Twisted project. - Current build status ==================== -All platforms: [![Circle CI](https://circleci.com/gh/conda-forge/constantly-feedstock.svg?style=shield)](https://circleci.com/gh/conda-forge/constantly-feedstock) + + + + + +
All platforms: + + + +
Current release info ==================== -Version: [![Anaconda-Server Badge](https://anaconda.org/conda-forge/constantly/badges/version.svg)](https://anaconda.org/conda-forge/constantly) -Downloads: [![Anaconda-Server Badge](https://anaconda.org/conda-forge/constantly/badges/downloads.svg)](https://anaconda.org/conda-forge/constantly) + +| Name | Downloads | Version | Platforms | +| --- | --- | --- | --- | +| [![Conda Recipe](https://img.shields.io/badge/recipe-constantly-green.svg)](https://anaconda.org/conda-forge/constantly) | [![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/constantly.svg)](https://anaconda.org/conda-forge/constantly) | [![Conda Version](https://img.shields.io/conda/vn/conda-forge/constantly.svg)](https://anaconda.org/conda-forge/constantly) | [![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/constantly.svg)](https://anaconda.org/conda-forge/constantly) | Installing constantly ===================== @@ -31,24 +45,53 @@ Installing `constantly` from the `conda-forge` channel can be achieved by adding ``` conda config --add channels conda-forge +conda config --set channel_priority strict ``` -Once the `conda-forge` channel has been enabled, `constantly` can be installed with: +Once the `conda-forge` channel has been enabled, `constantly` can be installed with `conda`: ``` conda install constantly ``` -It is possible to list all of the versions of `constantly` available on your platform with: +or with `mamba`: + +``` +mamba install constantly +``` + +It is possible to list all of the versions of `constantly` available on your platform with `conda`: ``` conda search constantly --channel conda-forge ``` +or with `mamba`: + +``` +mamba search constantly --channel conda-forge +``` + +Alternatively, `mamba repoquery` may provide more information: + +``` +# Search all versions available on your platform: +mamba repoquery search constantly --channel conda-forge + +# List packages depending on `constantly`: +mamba repoquery whoneeds constantly --channel conda-forge + +# List dependencies of `constantly`: +mamba repoquery depends constantly --channel conda-forge +``` + About conda-forge ================= +[![Powered by +NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org) + conda-forge is a community-led conda channel of installable packages. In order to provide high-quality builds, the process has been automated into the conda-forge GitHub organization. The conda-forge organization contains one repository @@ -57,16 +100,19 @@ for each of the installable packages. Such a repository is known as a *feedstock A feedstock is made up of a conda recipe (the instructions on what and how to build the package) and the necessary configurations for automatic building using freely available continuous integration services. Thanks to the awesome service provided by -[CircleCI](https://circleci.com/), [AppVeyor](http://www.appveyor.com/) -and [TravisCI](https://travis-ci.org/) it is possible to build and upload installable -packages to the [conda-forge](https://anaconda.org/conda-forge) -[Anaconda-Cloud](http://docs.anaconda.org/) channel for Linux, Windows and OSX respectively. - -To manage the continuous integration and simplify feedstock maintenance -[conda-smithy](http://github.com/conda-forge/conda-smithy) has been developed. +[Azure](https://azure.microsoft.com/en-us/services/devops/), [GitHub](https://github.com/), +[CircleCI](https://circleci.com/), [AppVeyor](https://www.appveyor.com/), +[Drone](https://cloud.drone.io/welcome), and [TravisCI](https://travis-ci.com/) +it is possible to build and upload installable packages to the +[conda-forge](https://anaconda.org/conda-forge) [anaconda.org](https://anaconda.org/) +channel for Linux, Windows and OSX respectively. + +To manage the continuous integration and simplify feedstock maintenance, +[conda-smithy](https://github.com/conda-forge/conda-smithy) has been developed. Using the ``conda-forge.yml`` within this repository, it is possible to re-render all of this feedstock's supporting files (e.g. the CI configuration files) with ``conda smithy rerender``. +For more information, please check the [conda-forge documentation](https://conda-forge.org/docs/). Terminology =========== @@ -93,12 +139,19 @@ merged, the recipe will be re-built and uploaded automatically to the everybody to install and use from the `conda-forge` channel. Note that all branches in the conda-forge/constantly-feedstock are immediately built and any created packages are uploaded, so PRs should be based -on branches in forks and branches in the main repository should only be used to +on branches in forks, and branches in the main repository should only be used to build distinct package versions. In order to produce a uniquely identifiable distribution: * If the version of a package **is not** being increased, please add or increase - the [``build/number``](http://conda.pydata.org/docs/building/meta-yaml.html#build-number-and-string). + the [``build/number``](https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html#build-number-and-string). * If the version of a package **is** being increased, please remember to return - the [``build/number``](http://conda.pydata.org/docs/building/meta-yaml.html#build-number-and-string) + the [``build/number``](https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html#build-number-and-string) back to 0. + +Feedstock Maintainers +===================== + +* [@isuruf](https://github.com/isuruf/) +* [@killua156](https://github.com/killua156/) + diff --git a/build-locally.py b/build-locally.py new file mode 100755 index 0000000..3beb68c --- /dev/null +++ b/build-locally.py @@ -0,0 +1,128 @@ +#!/bin/sh +"""exec" "python3" "$0" "$@" #""" # fmt: off # fmt: on + +# +# This file has been generated by conda-smithy in order to build the recipe +# locally. +# +# The line above this comment is a bash / sh / zsh guard +# to stop people from running it with the wrong interpreter +import glob +import os +import platform +import subprocess +import sys +from argparse import ArgumentParser + + +def setup_environment(ns): + os.environ["CONFIG"] = ns.config + os.environ["UPLOAD_PACKAGES"] = "False" + os.environ["IS_PR_BUILD"] = "True" + if ns.debug: + os.environ["BUILD_WITH_CONDA_DEBUG"] = "1" + if ns.output_id: + os.environ["BUILD_OUTPUT_ID"] = ns.output_id + if "MINIFORGE_HOME" not in os.environ: + os.environ["MINIFORGE_HOME"] = os.path.join( + os.path.dirname(__file__), "miniforge3" + ) + + +def run_docker_build(ns): + script = ".scripts/run_docker_build.sh" + subprocess.check_call([script]) + + +def run_osx_build(ns): + script = ".scripts/run_osx_build.sh" + subprocess.check_call([script]) + + +def run_win_build(ns): + script = ".scripts/run_win_build.bat" + subprocess.check_call(["cmd", "/D", "/Q", "/C", f"CALL {script}"]) + + +def verify_config(ns): + choices_filter = ns.filter or "*" + valid_configs = { + os.path.basename(f)[:-5] + for f in glob.glob(f".ci_support/{choices_filter}.yaml") + } + if choices_filter != "*": + print(f"filtering for '{choices_filter}.yaml' configs") + print(f"valid configs are {valid_configs}") + if ns.config in valid_configs: + print("Using " + ns.config + " configuration") + return + elif len(valid_configs) == 1: + ns.config = valid_configs.pop() + print("Found " + ns.config + " configuration") + elif ns.config is None: + print("config not selected, please choose from the following:\n") + selections = list(enumerate(sorted(valid_configs), 1)) + for i, c in selections: + print(f"{i}. {c}") + try: + s = input("\n> ") + except KeyboardInterrupt: + print("\nno option selected, bye!", file=sys.stderr) + sys.exit(1) + idx = int(s) - 1 + ns.config = selections[idx][1] + print(f"selected {ns.config}") + else: + raise ValueError("config " + ns.config + " is not valid") + if ( + ns.config.startswith("osx") + and platform.system() == "Darwin" + and not os.environ.get("OSX_SDK_DIR") + ): + raise RuntimeError( + "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=$PWD/SDKs' " + "to download the SDK automatically to '$PWD/SDKs/MacOSX.sdk'. " + "Note: OSX_SDK_DIR must be set to an absolute path. " + "Setting this variable implies agreement to the licensing terms of the SDK by Apple." + ) + + +def main(args=None): + p = ArgumentParser("build-locally") + p.add_argument("config", default=None, nargs="?") + p.add_argument( + "--filter", + default=None, + help="Glob string to filter which build choices are presented in interactive mode.", + ) + p.add_argument( + "--debug", + action="store_true", + help=( + "Setup debug environment using `conda debug` " + "(or `rattler-build debug` for rattler-build recipes)" + ), + ) + p.add_argument("--output-id", help="If running debug, specify the output to setup.") + + ns = p.parse_args(args=args) + verify_config(ns) + setup_environment(ns) + + try: + if ns.config.startswith("linux") or ( + ns.config.startswith("osx") and platform.system() == "Linux" + ): + run_docker_build(ns) + elif ns.config.startswith("osx"): + run_osx_build(ns) + elif ns.config.startswith("win"): + run_win_build(ns) + finally: + recipe_license_file = os.path.join("recipe", "recipe-scripts-license.txt") + if os.path.exists(recipe_license_file): + os.remove(recipe_license_file) + + +if __name__ == "__main__": + main() diff --git a/ci_support/checkout_merge_commit.sh b/ci_support/checkout_merge_commit.sh deleted file mode 100755 index 9528e4b..0000000 --- a/ci_support/checkout_merge_commit.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - - -# Update PR refs for testing. -if [[ -n "${CIRCLE_PR_NUMBER}" ]] -then - FETCH_REFS="${FETCH_REFS} +refs/pull/${CIRCLE_PR_NUMBER}/head:pr/${CIRCLE_PR_NUMBER}/head" - FETCH_REFS="${FETCH_REFS} +refs/pull/${CIRCLE_PR_NUMBER}/merge:pr/${CIRCLE_PR_NUMBER}/merge" -fi - -# Retrieve the refs. -if [[ -n "${CIRCLE_PR_NUMBER}" ]] -then - git fetch -u origin ${FETCH_REFS} -fi - -# Checkout the PR merge ref. -if [[ -n "${CIRCLE_PR_NUMBER}" ]] -then - git checkout -qf "pr/${CIRCLE_PR_NUMBER}/merge" -fi - -# Check for merge conflicts. -if [[ -n "${CIRCLE_PR_NUMBER}" ]] -then - git branch --merged | grep "pr/${CIRCLE_PR_NUMBER}/head" > /dev/null -fi diff --git a/ci_support/fast_finish_ci_pr_build.sh b/ci_support/fast_finish_ci_pr_build.sh deleted file mode 100755 index 463c27f..0000000 --- a/ci_support/fast_finish_ci_pr_build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -curl https://raw.githubusercontent.com/conda-forge/conda-forge-build-setup-feedstock/master/recipe/ff_ci_pr_build.py | \ - python - -v --ci "circle" "${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}" "${CIRCLE_BUILD_NUM}" "${CIRCLE_PR_NUMBER}" diff --git a/ci_support/run_docker_build.sh b/ci_support/run_docker_build.sh deleted file mode 100755 index 57286d0..0000000 --- a/ci_support/run_docker_build.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash - -# PLEASE NOTE: This script has been automatically generated by conda-smithy. Any changes here -# will be lost next time ``conda smithy rerender`` is run. If you would like to make permanent -# changes to this script, consider a proposal to conda-smithy so that other feedstocks can also -# benefit from the improvement. - -FEEDSTOCK_ROOT=$(cd "$(dirname "$0")/.."; pwd;) -RECIPE_ROOT=$FEEDSTOCK_ROOT/recipe - -docker info - -config=$(cat < /dev/null && docker-machine active > /dev/null; then - HOST_USER_ID=$(docker-machine ssh $(docker-machine active) id -u) -fi - -rm -f "$FEEDSTOCK_ROOT/build_artefacts/conda-forge-build-done" - -cat << EOF | docker run -i \ - -v "${RECIPE_ROOT}":/recipe_root \ - -v "${FEEDSTOCK_ROOT}":/feedstock_root \ - -e HOST_USER_ID="${HOST_USER_ID}" \ - -a stdin -a stdout -a stderr \ - condaforge/linux-anvil \ - bash || exit 1 - -set -e -set +x -export BINSTAR_TOKEN=${BINSTAR_TOKEN} -set -x -export PYTHONUNBUFFERED=1 - -echo "$config" > ~/.condarc -# A lock sometimes occurs with incomplete builds. The lock file is stored in build_artefacts. -conda clean --lock - -conda install --yes --quiet conda-forge-build-setup -source run_conda_forge_build_setup - -conda build /recipe_root --quiet || exit 1 -upload_or_check_non_existence /recipe_root conda-forge --channel=main || exit 1 - -touch /feedstock_root/build_artefacts/conda-forge-build-done -EOF - -# double-check that the build got to the end -# see https://github.com/conda-forge/conda-smithy/pull/337 -# for a possible fix -set -x -test -f "$FEEDSTOCK_ROOT/build_artefacts/conda-forge-build-done" || exit 1