name: Release

on:
  push:
    branches:
      - main
    paths-ignore:
      - 'README.md'
      - 'CONTRIBUTING.md'
      - 'COPYING'
      - 'docs/**'
      - '.github/*.md'
      - '.github/FUNDING.yml'

jobs:
  release:
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      version: ${{ steps.changelog.outputs.version }}
      skipped: ${{ steps.changelog.outputs.skipped }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Create changelog
        id: changelog
        uses: TriPSs/conventional-changelog-action@v3
        with:
          github-token: ${{ secrets.github_token }}
          skip-version-file: "true"
          output-file: "false"
          skip-commit: "true"
          skip-on-empty: "true"
      - name: Create Github Release
        id: create_release
        uses: actions/create-release@v1
        if: ${{ steps.changelog.outputs.skipped == 'false' }}
        env:
          GITHUB_TOKEN: ${{ secrets.github_token }}
        with:
          tag_name: ${{ steps.changelog.outputs.tag }}
          release_name: ${{ steps.changelog.outputs.tag }}
          body: ${{ steps.changelog.outputs.clean_changelog }}
  artifacts:
    needs: release
    if: ${{ needs.release.outputs.skipped == 'false' }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        include:
        - os: ubuntu-latest
          ARTIFACT: posh-linux-amd64
        - os: macos-latest
          ARTIFACT: posh-darwin-amd64
        - os: windows-latest
          ARTIFACT: posh-windows-amd64.exe
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        working-directory: ${{ github.workspace }}/src
    outputs:
      hash_linux: ${{ steps.hash.outputs.hash_ubuntu-latest }}
      hash_macos: ${{ steps.hash.outputs.hash_macos-latest }}
      hash_windows: ${{ steps.hash.outputs.hash_windows-latest }}
    steps:
    - name: Install Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.15.x
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Bundle init scripts
      run: |
        go get -u github.com/kevinburke/go-bindata/...
        go generate
    - name: Build
      id: build
      run: go build -o ${{ matrix.ARTIFACT }} -ldflags="-X 'main.Version=${{ needs.release.outputs.version }}'"
      env:
        GOARCH: "amd64"
    - name: Hash
      id: hash
      run: |
        $fileHash = Get-FileHash ${{ matrix.ARTIFACT }} -Algorithm SHA256
        $fileHash.Hash | Out-File -Encoding 'UTF8' ${{ matrix.ARTIFACT }}.sha256
        Write-Output "::set-output name=hash_${{ matrix.os }}::$($fileHash.Hash)"
      shell: pwsh
    - name: Upload Release Asset
      id: upload-release-asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: src/${{ matrix.ARTIFACT }}
        asset_name: ${{ matrix.ARTIFACT }}
        asset_content_type: application/octet-stream
    - name: Upload Hash Asset
      id: upload-hash-asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: src/${{ matrix.ARTIFACT }}.sha256
        asset_name: ${{ matrix.ARTIFACT }}.sha256
        asset_content_type: text/plain
  themes:
    needs: release
    if: ${{ needs.release.outputs.skipped == 'false' }}
    runs-on: ubuntu-latest
    outputs:
      hash_themes: ${{ steps.hash.outputs.hash_themes }}
    defaults:
      run:
        shell: pwsh
    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Zip theme files
      run: |
        $compress = @{
          Path = "themes\*.json"
          CompressionLevel = "Fastest"
          DestinationPath = "themes.zip"
        }
        Compress-Archive @compress
    - name: Hash
      id: hash
      run: |
        $fileHash = Get-FileHash themes.zip -Algorithm SHA256
        $fileHash.Hash | Out-File -Encoding 'UTF8' themes.zip.sha256
        Write-Output "::set-output name=hash_themes::$($fileHash.Hash)"
    - name: Upload Themes
      id: upload-themes
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: themes.zip
        asset_name: themes.zip
        asset_content_type: application/octet-stream
    - name: Upload Themes Hash
      id: upload-hash-asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: themes.zip.sha256
        asset_name: themes.zip.sha256
        asset_content_type: text/plain
  homebrew:
    needs: release
    if: ${{ needs.release.outputs.skipped == 'false' }}
    runs-on: ubuntu-latest
    env:
      GH_KEY: ${{ secrets.GH_PAT }}
    steps:
    - name: Push Version
      run: |
        curl -XPOST -u "jandedobbeleer:$GH_KEY" \
        -H "Accept: application/vnd.github.everest-preview+json" \
        -H "Content-Type: application/json" https://api.github.com/repos/jandedobbeleer/homebrew-oh-my-posh/actions/workflows/release.yml/dispatches \
        --data '{"ref": "main", "inputs": {"version": "${{ needs.release.outputs.version }}"} }'
  powershell:
    needs: [release, artifacts]
    if: ${{ needs.release.outputs.skipped == 'false' }}
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: pwsh
        working-directory: ${{ github.workspace }}/packages/powershell/oh-my-posh
    env:
      PSGALLERY_KEY: ${{ secrets.PSGALLERY_KEY }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Pack and push
      run: ./deploy.ps1 -BinVersion ${{ needs.release.outputs.version }} -ModuleVersion ${{ needs.release.outputs.version }} -Repository PSGallery -RepositoryAPIKey $env:PSGALLERY_KEY
  scoop:
    needs: [release, artifacts]
    if: ${{ needs.release.outputs.skipped == 'false' }}
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: pwsh
        working-directory: ${{ github.workspace }}/packages/scoop
    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Update Template
      run: ./build.ps1 -Version ${{ needs.release.outputs.version }}
    - name: Upload Scoop JSON
      id: upload-scoop-json
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: ${{ github.workspace }}/packages/scoop/oh-my-posh.json
        asset_name: oh-my-posh.json
        asset_content_type: text/plain
    - name: Upload Scoop Archive
      id: upload-scoop-post-install
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: ${{ github.workspace }}/packages/scoop/posh-windows-wsl-amd64.7z
        asset_name: posh-windows-wsl-amd64.7z
        asset_content_type: application/octet-stream
    - name: Upload Scoop Archive Hash
      id: upload-scoop-post-install-hash
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.release.outputs.upload_url }}
        asset_path: ${{ github.workspace }}/packages/scoop/posh-windows-wsl-amd64.7z.sha256
        asset_name: posh-windows-wsl-amd64.7z.sha256
        asset_content_type: text/plain
