name: PR Check
on:
  pull_request:
    types: [opened, synchronize, reopened]
concurrency:
  group: build-${{ github.event.pull_request.number || github.head_ref }}
  cancel-in-progress: true
jobs:
  lint:
    name: Lint
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: true
      max-parallel: 13
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: set path
        run: echo "/opt/mambaforge/bin" >> $GITHUB_PATH

      - name: Fetch conda install script
        run: |
          wget https://raw.githubusercontent.com/bioconda/bioconda-common/master/{install-and-set-up-conda,configure-conda,common}.sh

      - name: Set up bioconda-utils
        run: bash install-and-set-up-conda.sh

      - name: Configure conda
        run: bash configure-conda.sh

      - name: Perform lint
        env:
          # Mimic circleci
          OSTYPE: "linux-gnu"
          CI: "true"
        run: |
          set -e
          eval "$(conda shell.bash hook)"
          conda activate bioconda
          source common.sh
          echo '============'
          conda info --all
          conda config --show-sources
          python -c 'import bioconda_utils.utils as u ; import pathlib as p ; print(*(f"{f}:\n{p.Path(f).read_text()}" for f in u.load_conda_build_config().exclusive_config_files), sep="\n")'
          echo '============'
          if [ -z "$GITHUB_BASE_REF" ] ; then
              export GITHUB_BASE_REF="master"
          fi
          git fetch origin "$GITHUB_BASE_REF"
          bioconda-utils lint --loglevel debug --full-report --git-range origin/"$GITHUB_BASE_REF" HEAD
          conda clean -y --all

  build-linux:
    name: Linux Tests
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: true
      max-parallel: 13
    needs: lint
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: set path
        run: echo "/opt/mambaforge/bin" >> $GITHUB_PATH

      - name: Fetch conda install script
        run: |
          wget https://raw.githubusercontent.com/bioconda/bioconda-common/master/{install-and-set-up-conda,configure-conda,common}.sh

      - name: Set up bioconda-utils
        run: bash install-and-set-up-conda.sh

      # This script can be used to reconfigure conda to use the right channel setup.
      - name: Configure conda
        run: bash configure-conda.sh

      - name: Build and test
        env:
          # Mimic circleci
          OSTYPE: "linux-gnu"
          CI: "true"
        run: |
          set -e

          # Clean up lingering build artifacts
          for n in linux-64 osx-64 noarch; do
              rm -f /opt/mambaforge/envs/bioconda/conda-bld/$n/*.tar.bz2
              rm -f /opt/mambaforge/envs/bioconda/conda-bld/$n/*.conda
          done

          eval "$(conda shell.bash hook)"
          conda activate bioconda
          source common.sh
          if [ -z "$GITHUB_BASE_REF" ] ; then
              export GITHUB_BASE_REF="master"
          fi
          git fetch origin "$GITHUB_BASE_REF"

          bioconda-utils build recipes config.yml \
            --docker --mulled-test \
            --git-range origin/"$GITHUB_BASE_REF" HEAD

      - name: Prepare artifacts
        run: |
          (
          rm -rf /tmp/artifacts
          mkdir -p /tmp/artifacts/packages
          cd /opt/mambaforge/envs/bioconda/conda-bld || exit 0
          find -name .cache | xargs rm -rf || true
          for n in index.html channeldata.json linux-64 osx-64 noarch; do
            cp -rv $n /tmp/artifacts/packages || true
          done
          if command -V docker >/dev/null; then
            mkdir -p /tmp/artifacts/images
            cd /tmp/artifacts/images
            docker image ls --format='{{.Repository}}:{{.Tag}}' | \
              { grep biocontainers || true ; } | \
              xargs -n1 -P4 bash -c '
                test -n "${1+x}" || exit 0
                echo "Start compressing docker image ${1} ..."
                docker save "${1}" | gzip -c > "${1##*/}.tar.gz"
                echo "Finished compressing docker image ${1} ."
                ' --
            # There's no : allowed in artifact names, replace it with ---
            for f in /tmp/artifacts/images/*:* ; do mv -- "$f" "${f//:/---}"; done
          fi
          ) || true

      - name: Archive packages
        uses: actions/upload-artifact@v4
        with:
          name: linux-packages
          path: |
            /tmp/artifacts


  build-osx-64:
    name: OSX-64 Tests
    runs-on: macos-13
    strategy:
      fail-fast: true
      max-parallel: 4
    # Limited concurrency for osx, so first make sure linux can pass
    needs: build-linux
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: set path
        run: echo "/opt/mambaforge/bin" >> $GITHUB_PATH

      - name: Fetch conda install script
        run: |
          wget https://raw.githubusercontent.com/bioconda/bioconda-common/master/{install-and-set-up-conda,configure-conda,common}.sh

      - name: Set up bioconda-utils
        run: bash install-and-set-up-conda.sh

      # This script can be used to reconfigure conda to use the right channel setup.
      - name: Configure conda
        run: bash configure-conda.sh

      - name: Build and Test
        env:
          # Mimic circleci
          OSTYPE: "darwin"
          CI: "true"
        run: |
          set -e
          eval "$(conda shell.bash hook)"
          conda activate bioconda
          source common.sh
          # Sets up OSX SDK
          run_conda_forge_build_setup

          # Clean up lingering build artifacts
          for n in linux-64 osx-64 noarch; do
              rm -f /opt/mambaforge/envs/bioconda/conda-bld/$n/*.tar.bz2
          done

          if [ -z "$GITHUB_BASE_REF" ] ; then
              export GITHUB_BASE_REF="master"
          fi
          git fetch origin "$GITHUB_BASE_REF"

          bioconda-utils build recipes config.yml \
            --git-range origin/"$GITHUB_BASE_REF" HEAD

      - name: Prepare artifacts
        run: |
              (
              rm -rf /tmp/artifacts
              mkdir -p /tmp/artifacts/packages
              cd /opt/mambaforge/envs/bioconda/conda-bld || exit 0
              find -name .cache | xargs rm -rf || true
              for n in index.html channeldata.json linux-64 osx-64 noarch; do
                cp -rv $n /tmp/artifacts/packages || true
              done
              ) || true

      - name: Archive packages
        uses: actions/upload-artifact@v4
        with:
          name: osx-packages
          path: |
            /tmp/artifacts

  # Disabled due to concurrency limits on GHA for OSX. osx-arm64 builds are on CircleCI.
  # build_and_test-osx-arm64:
  #   name: OSX-ARM64 Tests
  #   runs-on: macOS-14 # M1
  #   strategy:
  #     fail-fast: true
  #     max-parallel: 4
  #   needs: build-linux
  #   steps:
  #     - uses: actions/checkout@v4
  #       with:
  #         fetch-depth: 0

  #     # bail if there's no osx-arm64 recipes
  #     - name: Check for Additional Platforms
  #       id: additional_platforms
  #       run: |
  #         result=$(./scripts/check-for-additional-platforms.sh "origin/master...HEAD" "build_and_test" "${GITHUB_JOB}")
  #         if [[ ${result} != "build" ]]
  #         then
  #             echo "No recipes using this platform, skipping rest of job."
  #             echo "skip_build=true" >> $GITHUB_OUTPUT
  #         fi

  #     - name: set path
  #       run: echo "/opt/mambaforge/bin" >> $GITHUB_PATH

  #     - name: Fetch conda install script
  #       if: steps.additional_platforms.outputs.skip_build != 'true'
  #       run: |
  #         wget https://raw.githubusercontent.com/bioconda/bioconda-common/master/{install-and-set-up-conda,configure-conda,common}.sh

  #     - name: Set up bioconda-utils
  #       if: steps.additional_platforms.outputs.skip_build != 'true'
  #       run: bash install-and-set-up-conda.sh

  #     - name: Configure conda
  #       if: steps.additional_platforms.outputs.skip_build != 'true'
  #       run: bash configure-conda.sh

  #     - name: Build and Test
  #       if: steps.additional_platforms.outputs.skip_build != 'true'
  #       env:
  #         # Mimic circleci
  #         OSTYPE: "darwin"
  #         CI: "true"
  #       run: |
  #         set -xe
  #         eval "$(conda shell.bash hook)"
  #         conda activate bioconda
  #         source common.sh
  #         # Sets up OSX SDK
  #         run_conda_forge_build_setup

  #         if [ -z "$GITHUB_BASE_REF" ] ; then
  #             export GITHUB_BASE_REF="master"
  #         fi
  #         git fetch origin "$GITHUB_BASE_REF"

  #         bioconda-utils build recipes config.yml \
  #           --lint --git-range origin/"$GITHUB_BASE_REF" HEAD

  #     - name: Prepare artifacts
  #       if: steps.additional_platforms.outputs.skip_build != 'true'
  #       run: |
  #             (
  #             rm -rf /tmp/artifacts
  #             mkdir -p /tmp/artifacts/packages
  #             cd /opt/mambaforge/envs/bioconda/conda-bld || exit 0
  #             find -name .cache | xargs rm -rf || true
  #             for n in index.html channeldata.json osx-arm64 noarch; do
  #               cp -rv $n /tmp/artifacts/packages || true
  #             done
  #             ) || true

  #     - name: Archive packages
  #       if: steps.additional_platforms.outputs.skip_build != 'true'
  #       uses: actions/upload-artifact@v4
  #       with:
  #         name: osx-arm64-packages
  #         path: |
  #           /tmp/artifacts