name: deploy

on:
  push:
    tags:
      - 'v*.*.*'

jobs:

  create-windows-binaries:

    strategy:
      matrix:
        conf: [x86_64]
# Temporarily disable i686 binaries, they are failing on linking libdeflate
# and I don't have a Windows machine set up to experiment with fixing it.
#        conf: [x86_64, i686]

    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v2

    - name: Install stable
      uses: actions-rs/toolchain@v1
      with:
        profile: minimal
        toolchain: stable
        target: ${{ matrix.conf }}-pc-windows-msvc
        override: true

    - name: Build oxipng
      run: |
        cargo build --release --target ${{ matrix.conf }}-pc-windows-msvc

    - name: Get the version
      shell: bash
      id: tagName
      run: |
        VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
        echo "::set-output name=tag::$VERSION"

    - name: Build package
      id: package
      shell: bash
      run: |
        ARCHIVE_TARGET="${{ matrix.conf }}-pc-windows-msvc"
        ARCHIVE_NAME="oxipng-${{ steps.tagName.outputs.tag }}-$ARCHIVE_TARGET"
        ARCHIVE_FILE="${ARCHIVE_NAME}.zip"
        mv LICENSE LICENSE.txt
        7z a ${ARCHIVE_FILE} \
             ./target/${{ matrix.conf }}-pc-windows-msvc/release/oxipng.exe \
             ./CHANGELOG.md ./LICENSE.txt ./README.md
        echo "::set-output name=file::${ARCHIVE_FILE}"
        echo "::set-output name=name::${ARCHIVE_NAME}.zip"

    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: ${{ steps.package.outputs.name }}
        path: ${{ steps.package.outputs.file }}

  create-unix-binaries:

    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
          - os: macos-latest
            target: x86_64-apple-darwin

    runs-on: ${{ matrix.os }}

    steps:
    - uses: actions/checkout@v2

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        profile: minimal
        toolchain: stable
        target: ${{ matrix.target }}
        override: true

    - name: Install musl
      if: contains(matrix.target, 'linux-musl')
      run: |
        sudo apt-get install musl-tools

    - name: Build oxipng
      run: |
        cargo build --release --target ${{ matrix.target }}

    - name: Strip binary
      run: |
        strip target/${{ matrix.target }}/release/oxipng

    - name: Get the version
      id: tagName
      run: |
        VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
        echo "::set-output name=tag::$VERSION"

    - name: Build package
      id: package
      run: |
        ARCHIVE_TARGET=${{ matrix.target }}
        ARCHIVE_NAME="oxipng-${{ steps.tagName.outputs.tag }}-$ARCHIVE_TARGET"
        ARCHIVE_FILE="${ARCHIVE_NAME}.tar.gz"
        mkdir "/tmp/${ARCHIVE_NAME}"
        cp README.md CHANGELOG.md LICENSE \
           target/${{ matrix.target }}/release/oxipng \
           /tmp/${ARCHIVE_NAME}
        tar -czf ${PWD}/${ARCHIVE_FILE} -C /tmp/ ${ARCHIVE_NAME}
        echo ::set-output "name=file::${ARCHIVE_FILE}"
        echo ::set-output "name=name::${ARCHIVE_NAME}.tar.gz"

    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: ${{ steps.package.outputs.name }}
        path: ${{ steps.package.outputs.file }}


  deploy:

    needs: [create-windows-binaries, create-unix-binaries]

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Get version and release description
        id: tagName
        run: |
          VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
          tail -n +2 CHANGELOG.md | sed -e '/^$/,$d' > CHANGELOG.txt
          echo "::set-output name=tag::$VERSION"

      - name: Download artifacts
        uses: actions/download-artifact@v2
        with:
          path: ./binaries

      - name: Create a release
        uses: softprops/action-gh-release@v1
        with:
          name: v${{ steps.tagName.outputs.tag }}
          body_path: CHANGELOG.txt
          files: |
            ./binaries/**/*.zip
            ./binaries/**/*.tar.gz
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
