command-error 0.8.0

Detailed error messages and status checking for `std::process::Command`
Documentation
---
# This workflow runs when PRs are merged and tags/builds/publishes a release.

# Run when PRs to main are closed.
on:
  pull_request:
    types:
      - closed
    branches:
      - main
  workflow_dispatch:

name: Build and publish a release

jobs:
  # We make `if_merged` a `needs:` of the other jobs here to only run this
  # workflow on merged PRs.
  if_merged:
    permissions:
      issues: write
      pull-requests: write
    name: Check that PR was merged and not closed
    if: github.event_name == 'workflow_dispatch'
      || (
        github.event.pull_request.merged == true
        && contains(github.event.pull_request.labels.*.name, 'release')
      )
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "This is a canonical hack to run GitHub Actions on merged PRs"
          echo "See: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-pull_request-workflow-when-a-pull-request-merges"

      - name: Comment on PR with link to this action
        uses: peter-evans/create-or-update-comment@v4
        if: github.event_name == 'pull_request'
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            [This release is now being built.][run]

            [run]: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

  version:
    name: Get version number
    needs: if_merged
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.get_cargo_metadata.outputs.version }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v5

      - uses: cachix/install-nix-action@v31

      - name: Get version number
        id: get_cargo_metadata
        run: echo "version=$(nix run .#get-crate-version)" >> "$GITHUB_OUTPUT"

  build:
    name: Release Build
    # Now we're ready to do the release build. In this step, we upload
    # "artifacts" which lets us share files between jobs (the artifacts are
    # downloaded by the next job, `upload`) and aggregate files from different
    # parts of the matrix (so we can have the macOS and Linux executables in
    # the next job).
    needs: if_merged
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v5

      - uses: cachix/install-nix-action@v31

      - name: Build documentation
        run: |
          RESULT=$(nix build --no-link --print-out-paths --print-build-logs .#docs-tarball)
          mkdir target
          cp "$RESULT"/* target/

      - name: Upload documentation
        uses: actions/upload-artifact@v4
        with:
          name: documentation
          path: |
            target/*

      - name: Publish to crates.io
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: |
          nix run .#cargo -- publish --no-verify

  upload:
    name: Upload assets to release
    runs-on: ubuntu-latest
    needs:
      - if_merged
      - build
      - version
    permissions:
      contents: write
      issues: write
      pull-requests: write
    steps:
      - name: Tag the release
        uses: mathieudutour/github-tag-action@v6.2
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          commit_sha: ${{ github.sha }}
          # Note: This action automatically applies a prefix for us!
          custom_tag: ${{ needs.version.outputs.version }}

      - name: Download artifacts
        # This downloads the uploaded artifacts to the current directory; the
        # path format for downloaded artifacts is `{name}/{basename}`, where
        # `{basename}` is the basename of the upload `path`.
        #
        # For example, the following artifact:
        #
        #     - uses: actions/upload-artifact@v3
        #       with:
        #         name: linux
        #         path: target/release/ghciwatch-aarch64-linux
        #
        # will be downloaded to `linux/ghciwatch-aarch64-linux`.
        uses: actions/download-artifact@v5

      - name: Create release
        id: create_release
        uses: softprops/action-gh-release@v2.3.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          draft: false
          prerelease: false
          generate_release_notes: true
          tag_name: v${{ needs.version.outputs.version }}
          files: |
            documentation/*

      - name: Comment on PR with link to the release
        uses: peter-evans/create-or-update-comment@v4
        if: github.event_name == 'pull_request'
        with:
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            [Release ${{ needs.version.outputs.version }}][release] was built and published successfully!

            [release]: ${{ steps.create_release.outputs.url }}