Documentation
name: release
on:
  workflow_dispatch:
    inputs:
      version:
        description: 'version number'
        required: true

env:
  RELEASE_FILE: RELEASE.txt

jobs:
  check:
    name: check (${{ matrix.name }})
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
        - name: "default"
          features: ""
    steps:
    - uses: actions/checkout@v1
    - name: install toolchain
      run: rustup default stable
    - name: install tools
      run: sudo apt-get install build-essential
    - name: execute tests
      run: cargo test ${{ matrix.features }}
    - name: build program
      run: cargo build ${{ matrix.features }}

  tag:
    if: github.ref == 'refs/heads/master'
    needs: check
    name: tag and release
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: create release
      id: create_release
      uses: actions/create-release@latest
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ github.event.inputs.version }}
        release_name: ${{ github.event.inputs.version }}
        body: |
          Release ${{ github.event.inputs.version }}.
        draft: false
        prerelease: false
    - run: printf ${{ steps.create_release.outputs.upload_url }} > ${{ env.RELEASE_FILE }}
    - name: upload release data
      uses: actions/upload-artifact@v1.0.0
      with:
        name: RELEASE
        path: ${{ env.RELEASE_FILE }}

  publish-cratesio:
    needs: tag
    name: crates.io
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: get version
      id: get_version
      run: echo ::set-output name=VERSION::$(git tag --points-at HEAD --sort -version:refname | head -1)
    - name: install tools
      run: |
        sudo apt-get install build-essential
        rustup default stable
        pip install invoke
    - name: publish
      id: publish
      run: |
        invoke ci.update-version --version=${{ steps.get_version.outputs.VERSION }}
        cargo login ${{ secrets.CRATES_IO_TOKEN }}
        cargo publish --allow-dirty

  publish-dockerhub:
    needs: publish-cratesio
    name: dockerhub
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: get version
      id: get_version
      run: echo ::set-output name=VERSION::$(git tag --points-at HEAD --sort -version:refname | head -1)
    - name: publish
      id: publish
      run: |
        printf ${{ secrets.DOCKERHUB }} | docker login --username replicadse --password-stdin
        docker build -t replicadse/senile:latest -f docker/Dockerfile --build-arg VERSION=${{ steps.get_version.outputs.VERSION }} .
        docker push replicadse/senile:latest
        docker image tag replicadse/senile:latest replicadse/senile:${{ steps.get_version.outputs.VERSION }}
        docker push replicadse/senile:${{ steps.get_version.outputs.VERSION }}

  publish-archlinux-aur:
    needs: publish-cratesio
    name: archlinux aur
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: get version
      id: get_version
      run: echo ::set-output name=VERSION::$(git tag --points-at HEAD --sort -version:refname | head -1)
    - uses: actions/setup-python@v2
      with:
        python-version: '3.7'
    - name: install tools
      run: |
        rustup default stable
        sudo apt-get install build-essential
        pip install invoke
    - name: prepare
      id: prepare
      run: |
        invoke ci.update-version --version=${{ steps.get_version.outputs.VERSION }}
    - name: publish
      uses: KSXGitHub/github-actions-deploy-aur@v2.2.5
      with:
        pkgname: senile
        pkgbuild: ./pkg/aur/PKGBUILD
        commit_username: replicadse
        commit_email: aw@voidpointergroup.com
        ssh_private_key: ${{ secrets.AUR_SSH_PK }}
        commit_message: update AUR package

  publish-appimage:
    needs: tag
    name: publish appimage for ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
        - os: ubuntu-latest
          target: x86_64-unknown-linux-gnu
          arch: x86_64
          install: sudo apt-get install build-essential
    steps:
    - uses: actions/checkout@v1
    - name: get version
      id: get_version
      run: echo ::set-output name=VERSION::$(git tag --points-at HEAD --sort -version:refname | head -1)
    - name: download release id
      uses: actions/download-artifact@v1.0.0
      with:
        name: RELEASE
    - name: get release data
      id: get_release_data
      run: echo ::set-output name=upload_url::$(cat RELEASE/${{ env.RELEASE_FILE }})
    - uses: actions/setup-python@v2
      with:
        python-version: '3.7'
    - name: install tools
      run: |
        rustup default stable
        ${{ matrix.install }}
        rustup target install ${{ matrix.target }}
        pip install invoke
        wget -O appimagetool.AppImage https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage
        chmod +x ./appimagetool.AppImage
    - name: build-${{ matrix.target }}
      run: |
        invoke ci.update-version --version=${{ steps.get_version.outputs.VERSION }}
        cargo build --release --target ${{ matrix.target }}
        cp ./target/${{ matrix.target }}/release/senile ./pkg/appimage/senile.AppDir/usr/bin/senile
        cd ./pkg/appimage && ARCH=${{ matrix.arch }} ../../appimagetool.AppImage ./senile.AppDir && cd ../../
    - name: zip
      run: cd ./pkg/appimage && tar -zcvf AppImage.${{ matrix.arch }}.tar.gz senile-${{ matrix.arch }}.AppImage
    - name: upload asset
      uses: svenstaro/upload-release-action@v1-release
      with:
        repo_token: ${{ secrets.GITHUB_TOKEN }}
        file: ./pkg/appimage/AppImage.${{ matrix.arch }}.tar.gz
        asset_name: AppImage.${{ matrix.arch }}.tar.gz
        tag: ${{ steps.get_version.outputs.VERSION }}
        overwrite: true

  publish:
    needs: tag
    name: publish for ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
        - os: macos-latest
          target: x86_64-apple-darwin
          install: printf ok
        - os: ubuntu-latest
          target: x86_64-unknown-linux-gnu
          install: sudo apt-get install build-essential
    steps:
    - uses: actions/checkout@v1
    - name: get version
      id: get_version
      run: echo ::set-output name=VERSION::$(git tag --points-at HEAD --sort -version:refname | head -1)
    - name: download release id
      uses: actions/download-artifact@v1.0.0
      with:
        name: RELEASE
    - name: get release data
      id: get_release_data
      run: echo ::set-output name=upload_url::$(cat RELEASE/${{ env.RELEASE_FILE }})
    - uses: actions/setup-python@v2
      with:
        python-version: '3.7'
    - name: install tools
      run: |
        rustup default stable
        ${{ matrix.install }}
        rustup target install ${{ matrix.target }}
        pip install invoke
    - name: build-${{ matrix.target }}
      run: |
        invoke ci.update-version --version=${{ steps.get_version.outputs.VERSION }}
        cargo build --release --target ${{ matrix.target }}
    - name: zip
      run: cd ./target/${{ matrix.target }}/release && tar -zcvf ${{ matrix.target }}.tar.gz senile
    - name: upload asset
      uses: svenstaro/upload-release-action@v1-release
      with:
        repo_token: ${{ secrets.GITHUB_TOKEN }}
        file: ./target/${{ matrix.target }}/release/${{ matrix.target }}.tar.gz
        asset_name: ${{ matrix.target }}.tar.gz
        tag: ${{ steps.get_version.outputs.VERSION }}
        overwrite: true