
# Controls when the workflow will run
on:
  # Run this workflow after the TREXIO CI completed
  workflow_run:
    workflows: [ "TREXIO CI" ]
    branches: [ master ]
    types:
      - completed

# Workflow to build and publish wheels.
# in the get_commit_message job: Include [wheel build] in your commit message to trigger this build.
name: Build CPython wheels
jobs:

  get_commit_message:
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    name: Get commit message
    runs-on: ubuntu-20.04
    outputs:
      message: ${{ steps.commit_message.outputs.message }}
    steps:
      - name: Checkout the repo
        uses: actions/checkout@v2
        # Gets the correct commit message for pull request
        with:
          ref: ${{ github.event.pull_request.head.sha }}
      - name: Get commit message
        id: commit_message
        run: |
          set -xe
          COMMIT_MSG=$(git log --no-merges -1 --oneline)
          echo "::set-output name=message::$COMMIT_MSG"


  build_linux_wheels:
    name: Build Linux wheels for different versions of CPython on manylinux_x86_64
    needs: get_commit_message
    if: >-
      contains(needs.get_commit_message.outputs.message, '[wheel build]') ||
      (github.repository == 'TREX-CoE/trexio' && startsWith(github.ref, 'refs/tags/v'))
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        manylinux_tag: [2010_x86_64, 2014_x86_64, 2_24_x86_64]

    steps:
      - name: Checkout the branch
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v1
        with:
          python-version: '3.9'

      - name: Install build dependencies
        run: python -m pip install -U setuptools

      - name: Compute the PYTREXIO_VERSION environment variable
        run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\  -f3 | tr -d '"')" >> $GITHUB_ENV

      - name: Print the PYTREXIO_VERSION
        run: echo ${{ env.PYTREXIO_VERSION }}

      # Conventional download-artifact action does not work for artifact produced in a different workflow,
      # which is the case here (TREXIO CI produced the Python API distribution tarball)
      - name: Download the Python API distribution tarball
        uses: dawidd6/action-download-artifact@v2
        with:
          # Specify the name of the workflow file which uploaded the tarball
          workflow: actions.yml
          workflow_conclusion: success
          name: pytrexio-source
          path: python

      # at the moment we have to pull the custom container with pre-installed HDF5
      # the containers are built and stored in GitHub container registry ghcr.io/q-posev
      - name: Pull the manylinux Docker container with HDF5
        run: docker pull ghcr.io/q-posev/hdf5_1_12_on_${{ matrix.manylinux_tag }}:latest

      - name: Build wheels for different versions of CPython inside the Docker container
        run: >
          docker run --rm
          --env PLAT=manylinux${{ matrix.manylinux_tag }}
          --volume `pwd`:/tmp
          --workdir /tmp
          ghcr.io/q-posev/hdf5_1_12_on_${{ matrix.manylinux_tag }}
          /bin/bash build_manylinux_wheels.sh trexio-${{ env.PYTREXIO_VERSION }}.tar.gz
        working-directory: python

      - name: Upload produced wheels as artifacts
        uses: actions/upload-artifact@v2
        with:
          name: pytrexio-manylinux-${{ matrix.manylinux_tag }}
          path: ./python/wheelhouse/*.whl

  build_macos_wheels:
    name: Build MacOS wheels for different versions of CPython
    needs: get_commit_message
    if: >-
      contains(needs.get_commit_message.outputs.message, '[wheel build]') ||
      (github.repository == 'TREX-CoE/trexio' && startsWith(github.ref, 'refs/tags/v'))
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-10.15]
        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
# TODO: normally, one could include macos-11 and the OS list above but the produced wheels receive an error upon installation:
# ERROR: trexio-1.1.0-cp39-cp39-macosx_11_0_x86_64.whl is not a supported wheel on this platform.
# This happens even with the MACOSX_DEPLOYMENT_TARGET trick. Perhaps it can be solved by configuring the build system
# to produce the wheels for MacOS-11 from the very beginning
        #exclude:
        #  - os: macos-11
    env:
        H5_LDFLAGS: '-L/usr/local/Cellar/hdf5/1.12.1/lib'
        H5_CFLAGS: '-I/usr/local/Cellar/hdf5/1.12.1/include'
    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - name: Display Python version
        run: python --version

      - name: Install HDF5
        run: brew install hdf5@1.12

      # This step is needed to produce wheels with the correct platform tag for MacOS-11 (Big Sur)
      #- name: Set MACOSX_DEPLOYMENT_TARGET environment variable
      #  if: ${{ matrix.os == 'macos-11' }}
      #  run: echo "MACOSX_DEPLOYMENT_TARGET=11.0" >> $GITHUB_ENV

      - name: Compute the PYTREXIO_VERSION environment variable
        run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\  -f3 | tr -d '"')" >> $GITHUB_ENV

      - name: Print the PYTREXIO_VERSION
        run: echo ${{ env.PYTREXIO_VERSION }}

      - name: Download the Python API distribution tarball
        uses: dawidd6/action-download-artifact@v2
        with:
          workflow: actions.yml
          workflow_conclusion: success
          name: pytrexio-source
          path: python

      - name: Extract the Python distribution
        run: gzip -cd trexio-${{ env.PYTREXIO_VERSION }}.tar.gz | tar xvf -
        working-directory: python

      - name: Install Python dependencies
        run: pip install --upgrade pip setuptools build delocate pytest

      - name: Build wheel for a given version of CPython
        run: |
          mkdir wheelhouse/
          cd trexio-${{ env.PYTREXIO_VERSION }}/
          python -m build --wheel --outdir=./
          delocate-wheel trexio-*.whl
          mv trexio-*.whl ../wheelhouse/
        working-directory: python

      # Some issues with Python 3.10 wheels on MacOS-11
      - name: Install the wheel
        run: python -m pip install wheelhouse/trexio-*.whl
        working-directory: python

      - name: Test the wheel
        run: pytest -v test_api.py
        working-directory: python/test

      - name: Upload produced wheels as artifacts
        uses: actions/upload-artifact@v2
        with:
          name: pytrexio-${{ matrix.os }}
          path: ./python/wheelhouse/*.whl


  publish_wheels:
    name: Publish all wheels on PyPI
    needs: [build_linux_wheels, build_macos_wheels]
    runs-on: ubuntu-20.04

    steps:
      - name: Checkout the branch
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v1
        with:
          python-version: '3.9'

      - name: Install build dependencies
        run: python -m pip install -U setuptools twine

      - name: Download the build artifacts (wheels) of this workflow
        uses: actions/download-artifact@v2
        with:
          path: dist

      - name: Download the Python API distribution tarball
        uses: dawidd6/action-download-artifact@v2
        with:
          workflow: actions.yml
          workflow_conclusion: success
          name: pytrexio-source
          path: dist

      # The artifacts have to be in dist/ directory so that
      # pypa/gh-action-pypi-publish action can discover them
      - name: Display and rearrange the downloaded artifacts
        run: |
          ls -R
          mv pytrexio-manylinux-*/trexio-*.whl ./
          mv pytrexio-macos-*/trexio-*.whl ./
          rm -rf -- pytrexio-manylinux-*/ pytrexio-macos-*/
          ls -sh -w 1
        working-directory: dist

      #- name: Publish distribution 📦 to Test PyPI
      #  uses: pypa/gh-action-pypi-publish@master
      #  with:
      #    password: ${{ secrets.TEST_PYPI_API_TOKEN }}
      #    repository_url: https://test.pypi.org/legacy/
          #verbose: true

      - name: Publish distribution 📦 to PyPI
        uses: pypa/gh-action-pypi-publish@master
        with:
          password: ${{ secrets.PYPI_API_TOKEN }}
        #if: startsWith(github.ref, 'refs/tags')
