preprinttui 0.1.13

Terminal User Interface (TUI) for PreConnect printer.
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
name: Release

on:
  push:
    tags:
      - "v*"
  workflow_dispatch:
    inputs:
      tag:
        description: "Release Tag"
        required: false
        type: string
        default: ""

permissions:
  contents: write
  id-token: write

concurrency:
  group: release-${{ github.ref }}
  cancel-in-progress: false

jobs:
  setup:
    name: Setup Version
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.ver.outputs.tag }}
      version: ${{ steps.ver.outputs.version }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Resolve Version
        id: ver
        run: |
          if [ -n "${{ inputs.tag }}" ]; then
            TAG="${{ inputs.tag }}"
          elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then
            TAG="${{ github.ref_name }}"
          else
            CARGO_VER=$(grep '^version = ' Cargo.toml | head -n 1 | cut -d '"' -f 2)
            TAG="v${CARGO_VER}"
          fi
          echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
          echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"

  build-linux:
    name: Build Linux
    needs: [setup]
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: x86_64-unknown-linux-musl

      - name: Install Musl
        run: sudo apt-get update && sudo apt-get install -y musl-tools

      - name: Restore Cache
        uses: Swatinem/rust-cache@v2

      - name: Build Binary
        run: cargo build --release --locked --target x86_64-unknown-linux-musl

      - name: Compress Package
        run: |
          tar -czf target/release/preprinttui-linux-musl-x86_64.tar.gz \
            -C target/x86_64-unknown-linux-musl/release preprinttui

      - name: Upload Asset
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: target/release/preprinttui-linux-musl-x86_64.tar.gz
          tag: ${{ needs.setup.outputs.tag }}
          overwrite: true

  build-macos:
    name: Build macOS
    needs: [setup]
    runs-on: macos-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: aarch64-apple-darwin

      - name: Restore Cache
        uses: Swatinem/rust-cache@v2

      - name: Build Binary
        run: cargo build --release --locked --target aarch64-apple-darwin

      - name: Compress Package
        run: |
          tar -czf target/release/preprinttui-macos-arm64.tar.gz \
            -C target/aarch64-apple-darwin/release preprinttui

      - name: Upload Asset
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: target/release/preprinttui-macos-arm64.tar.gz
          tag: ${{ needs.setup.outputs.tag }}
          overwrite: true

  build-windows:
    name: Build Windows
    needs: [setup]
    runs-on: windows-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Restore Cache
        uses: Swatinem/rust-cache@v2

      - name: Build Binary
        run: cargo build --release --locked

      - name: Compress Package
        shell: powershell
        run: |
          Compress-Archive -Path target/release/preprinttui.exe -DestinationPath target/release/preprinttui-win-x86_64.zip

      - name: Upload Asset
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: target/release/preprinttui-win-x86_64.zip
          tag: ${{ needs.setup.outputs.tag }}
          overwrite: true

  publish:
    name: Publish Release
    needs: [setup, build-linux, build-macos, build-windows]
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Restore Cache
        uses: Swatinem/rust-cache@v2

      - name: Generate Notes
        run: |
          VERSION="${{ needs.setup.outputs.version }}"
          COMMIT_SHA="${{ github.sha }}"
          COMMIT_URL="https://github.com/sabbirba/preprinttui/commit/${COMMIT_SHA}"

          {
            echo "# preprinttui Release Notes"
            echo
            echo "## Version"
            echo "- Version: ${VERSION}"
            echo "- Commit: [${COMMIT_SHA:0:7}](${COMMIT_URL})"
            echo
            echo "## Changes"
            awk '/^### / { if (found) exit; found=1; next } found { print }' CHANGELOG.md
          } > release-notes.md

      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          name: "${{ needs.setup.outputs.version }}"
          tag_name: "${{ needs.setup.outputs.tag }}"
          target_commitish: ${{ github.sha }}
          body_path: release-notes.md

      - name: Publish Crate
        if: ${{ env.CARGO_REGISTRY_TOKEN != '' }}
        continue-on-error: true
        run: cargo publish --allow-dirty
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  homebrew:
    name: Update Homebrew Tap
    needs: [setup, publish]
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Tap
        uses: actions/checkout@v4
        with:
          repository: sabbirba/homebrew-tap
          ssh-key: ${{ secrets.TAP_DEPLOY_KEY }}

      - name: Update Formula
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAG: ${{ needs.setup.outputs.tag }}
          VERSION: ${{ needs.setup.outputs.version }}
        run: |
          gh release download "$TAG" -R "${{ github.repository }}" -p "*.tar.gz" -D assets
          for asset in macos-arm64 linux-musl-x86_64; do
            sha=$(sha256sum "assets/preprinttui-$asset.tar.gz" | cut -d' ' -f1)
            perl -0pi -e "s{(preprinttui-$asset\.tar\.gz\"\n\s*sha256 \")[0-9a-f]+}{\${1}$sha}" Formula/preprinttui.rb
          done
          perl -pi -e "s/^  version \".*\"/  version \"$VERSION\"/" Formula/preprinttui.rb
          rm -rf assets

      - name: Push Formula
        env:
          VERSION: ${{ needs.setup.outputs.version }}
        run: |
          git config user.name "Sabbir Bin Abbas"
          git config user.email "mail@sabbirba.com"
          git commit -am "Update preprinttui to $VERSION" || exit 0
          git push