quartz-cli 1.3.1

The command-line tool to build and test HTTP requests.
Documentation
name: Release

on:
  push:
    tags:
      - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10

jobs:
  create_man_page:
    name: Create man page
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout doc directory
        uses: actions/checkout@v4
        with:
          sparse-checkout: |
            doc
          sparse-checkout-cone-mode: false
      - name: Compile with pandoc
        uses: docker://pandoc/core:2.9
        with:
          args: >-
            --standalone
            --output=doc/quartz.1
            doc/quartz.1.md
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: quartz.1
          path: doc/quartz.1
          if-no-files-found: error
  publish_dry_run:
    name: Publish (dry-run)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: cargo publish --dry-run --token ${{ secrets.CARGO_REGISTRY_TOKEN }}

  create_draft:
    name: Create a draft
    needs: [publish_dry_run, create_man_page]
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Create Release
        run: gh release create ${{ github.ref_name }} --title "${{ github.ref_name }}" --draft --notes "$(./extract_changes.sh ${{ github.ref_name }} CHANGELOG.md)"
        env:
          GH_TOKEN: ${{ github.token }}

  deb:
    name: Upload deb package
    needs: create_draft
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          target: x86_64-unknown-linux-musl

      - name: Download man page
        uses: actions/download-artifact@v4
        with:
          name: quartz.1
          path: doc

      - name: Install cargo-deb
        run: cargo install cargo-deb
      - name: Build deb package
        id: build_deb
        run: |
          pkg=$(cargo deb)

          echo "deb_pkg=$pkg" >> $GITHUB_OUTPUT
      - name: Upload release deb
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh release upload ${{ github.ref_name }} ${{ steps.build_deb.outputs.deb_pkg }}
  build_archive:
    name: Build archive
    needs: create_draft
    runs-on: ${{ matrix.os }}
    permissions:
      contents: write
    env:
      CARGO: cargo
      # When CARGO is set to CROSS, this is set to `--target matrix.target`.
      TARGET_FLAGS: ""
      # When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
      TARGET_DIR: ./target
    strategy:
      fail-fast: false
      matrix:
        build: [linux-gnu, linux-gnu-aarch, linux-musl, linux-musl-aarch, macos, macos-arm]
        include:
        # Linux GNU
        - build: linux-gnu
          os: ubuntu-latest
          target: x86_64-unknown-linux-gnu

        - build: linux-gnu-aarch
          os: ubuntu-latest
          target: aarch64-unknown-linux-gnu

        # Linux MUSL
        - build: linux-musl
          os: ubuntu-latest
          target: x86_64-unknown-linux-musl

        - build: linux-musl-aarch
          os: ubuntu-latest
          target: aarch64-unknown-linux-musl

        # MacOS
        - build: macos
          os: macos-latest
          target: x86_64-apple-darwin

        - build: macos-arm
          os: macos-latest
          target: aarch64-apple-darwin
    steps:
      - uses: actions/checkout@v4
      - name: Download man page
        uses: actions/download-artifact@v4
        with:
          name: quartz.1
          path: doc
      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          target: ${{ matrix.target }}
      - name: Use Cross
        shell: bash
        run: |
          cargo install cross

      - name: Build binary
        run: cross build --verbose --release --target ${{ matrix.target }}
      - name: Build archive
        shell: bash
        run: |
          staging="quartz-${{ github.ref_name }}-${{ matrix.target }}"
          mkdir -p "$staging"/doc

          cp {README.md,LICENSE} "$staging/"
          cp CHANGELOG.md "$staging/doc/"

          cp doc/quartz.1 "$staging/doc/quartz.1"

          cp "target/${{ matrix.target }}/release/quartz" "$staging/"
          tar czf "$staging.tar.gz" "$staging"
          echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV
      - name: Upload release archive
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh release upload ${{ github.ref_name }} ${{ env.ASSET }}

  mark_as_latest:
    name: Mark release as latest
    needs: [build_archive, deb]
    runs-on: ubuntu-latest
    permissions:
      contents: write
    env:
      GH_TOKEN: ${{ github.token }}
    steps:
      - uses: actions/checkout@v4
      - run: gh release edit --draft=false ${{ github.ref_name }}

  publish_crate:
    name: Publish on crates.io
    needs: mark_as_latest
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
  homebrew:
    name: Update Homebrew formula
    needs: mark_as_latest
    runs-on: ubuntu-latest
    steps:
      - uses: dawidd6/action-homebrew-bump-formula@v3
        with:
          token: ${{ secrets.HOMEBREW_TOKEN }}
          tap: eduardorodriguesf/homebrew-quartz
          formula: quartz