name: GitHub Release

on:
  push:
    tags:
    - v[0-9]+.[0-9]+.[0-9]+*

jobs:
  release:
    name: Publish to Github Releases
    outputs:
      rc: ${{ steps.check-tag.outputs.rc }}
    strategy:
      matrix:
        include:
        - target: aarch64-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: aarch64-apple-darwin
          os: macos-latest
          use-cross: true
          cargo-flags: ""
        - target: aarch64-pc-windows-msvc
          os: windows-latest
          use-cross: true
          cargo-flags: "--no-default-features"
        - target: x86_64-apple-darwin
          os: macos-latest
          cargo-flags: ""
        - target: x86_64-pc-windows-msvc
          os: windows-latest
          cargo-flags: ""
        - target: x86_64-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: i686-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: i686-pc-windows-msvc
          os: windows-latest
          use-cross: true
          cargo-flags: ""
        - target: armv7-unknown-linux-musleabihf
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: arm-unknown-linux-musleabihf
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: mips-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: "--no-default-features"
        - target: mipsel-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: "--no-default-features"
        - target: mips64-unknown-linux-gnuabi64
          os: ubuntu-latest
          use-cross: true
          cargo-flags: "--no-default-features"
        - target: mips64el-unknown-linux-gnuabi64
          os: ubuntu-latest
          use-cross: true
          cargo-flags: "--no-default-features"
    runs-on: ${{matrix.os}}

    steps:
    - uses: actions/checkout@v2

    - name: Check Tag
      id: check-tag
      shell: bash
      run: |
        tag=${GITHUB_REF##*/}
        echo "::set-output name=version::$tag"
        if [[ "$tag" =~ [0-9]+.[0-9]+.[0-9]+$ ]]; then
          echo "::set-output name=rc::false"
        else
          echo "::set-output name=rc::true"
        fi


    - name: Install Rust Toolchain Components
      uses: actions-rs/toolchain@v1
      with:
        override: true
        target: ${{ matrix.target }}
        toolchain: stable
        profile: minimal # minimal component installation (ie, no documentation)
  
    - name: Show Version Information (Rust, cargo, GCC)
      shell: bash
      run: |
        gcc --version || true
        rustup -V
        rustup toolchain list
        rustup default
        cargo -V
        rustc -V
      
    - name: Build
      uses: actions-rs/cargo@v1
      with:
        use-cross: ${{ matrix.use-cross }}
        command: build
        args: --locked --release --target=${{ matrix.target }} ${{ matrix.cargo-flags }}

    - name: Build Archive
      shell: bash
      id: package
      env:
        target: ${{ matrix.target }}
        version:  ${{ steps.check-tag.outputs.version }}
      run: |
        set -euxo pipefail

        bin=${GITHUB_REPOSITORY##*/}
        src=`pwd`
        dist=$src/dist
        name=$bin-$version-$target
        executable=target/$target/release/$bin

        if [[ "$RUNNER_OS" == "Windows" ]]; then
          executable=$executable.exe
        fi

        mkdir $dist
        cp $executable $dist
        cd $dist

        if [[ "$RUNNER_OS" == "Windows" ]]; then
            archive=$dist/$name.zip
            7z a $archive *
            echo "::set-output name=archive::`pwd -W`/$name.zip"
        else
            archive=$dist/$name.tar.gz
            tar czf $archive *
            echo "::set-output name=archive::$archive"
        fi

    - name: Publish Archive
      uses: softprops/action-gh-release@v0.1.5
      if: ${{ startsWith(github.ref, 'refs/tags/') }}
      with:
        draft: false
        files: ${{ steps.package.outputs.archive }}
        prerelease: ${{ steps.check-tag.outputs.rc == 'true' }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}