cargo-outdated 0.19.0

Cargo subcommand for displaying when dependencies are out of date
name: release
on:
  push:
    tags:
      - "v*.*.*"
jobs:
  create-windows-binaries:
    strategy:
      matrix:
        os: [windows-latest, windows-11-arm]
        include:
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          - os: windows-11-arm
            target: aarch64-pc-windows-msvc

    runs-on: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v5

      - name: Remove rust-toolchain.toml
        # contains nightly & linters/formatters
        shell: bash
        run: rm -f rust-toolchain.toml

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

      - name: Build cargo-outdated
        run: |
          cargo build --release

      - name: Get the version
        shell: bash
        id: tagName
        run: |
          VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
          echo "tag=$VERSION" >> $GITHUB_OUTPUT

      - name: Build package
        id: package
        shell: bash
        run: |
          ARCHIVE_NAME="cargo-outdated-${{ steps.tagName.outputs.tag }}-${{ matrix.target }}"
          ARCHIVE_FILE="${ARCHIVE_NAME}.zip"
          7z a ${ARCHIVE_FILE} ./target/release/cargo-outdated.exe
          echo "file=${ARCHIVE_FILE}" >> $GITHUB_OUTPUT
          echo "name=${ARCHIVE_NAME}.zip" >> $GITHUB_OUTPUT

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: ${{ steps.package.outputs.name }}
          path: ${{ steps.package.outputs.file }}

  create-unix-binaries:
    strategy:
      matrix:
        os: [ubuntu-latest, ubuntu-24.04-arm, macos-15-intel, macos-latest]
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
          - os: ubuntu-24.04-arm
            target: aarch64-unknown-linux-musl
          - os: macos-15-intel
            target: x86_64-apple-darwin
          - os: macos-latest
            target: aarch64-apple-darwin

    runs-on: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v5

      - name: Remove rust-toolchain.toml
        # contains nightly & linters/formatters
        run: rm -f rust-toolchain.toml

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Install musl
        if: contains(matrix.target, 'linux-musl')
        run: |
          sudo apt-get install musl-tools

      - name: Build cargo-outdated
        run: |
          # TODO: Remember to add RUSTFLAGS=+crt-static for musl target when
          # static linkage will not be the default behaviour
          cargo build --release --features vendored-openssl --target ${{ matrix.target }}

      - name: Strip binary
        run: |
          strip target/${{ matrix.target }}/release/cargo-outdated

      - name: Get the version
        id: tagName
        run: |
          VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
          echo "tag=$VERSION" >> $GITHUB_OUTPUT

      - name: Build package
        id: package
        run: |
          TAR_FILE=cargo-outdated-${{ steps.tagName.outputs.tag }}-${{ matrix.target }}
          cd target/${{ matrix.target }}/release
          tar -czvf $GITHUB_WORKSPACE/$TAR_FILE.tar.gz cargo-outdated
          echo "name=${TAR_FILE}" >> $GITHUB_OUTPUT
          echo "file=${TAR_FILE}.tar.gz" >> $GITHUB_OUTPUT

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: ${{ steps.package.outputs.name }}
          path: ${{ steps.package.outputs.file }}

  deploy:
    needs: [create-windows-binaries, create-unix-binaries]

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v5

      - name: Remove rust-toolchain.toml
        # contains nightly & linters/formatters
        run: rm -f rust-toolchain.toml

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

      - name: Get version
        id: tagName
        run: |
          VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2)
          echo "tag=$VERSION" >> $GITHUB_OUTPUT

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          path: ./binaries

      - name: Create a release
        uses: softprops/action-gh-release@v2
        with:
          name: v${{ steps.tagName.outputs.tag }}
          files: |
            ./binaries/**/*.zip
            ./binaries/**/*.tar.gz
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  cargo-publish:
    needs: [deploy]

    permissions:
      id-token: write

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v5

      - name: Remove rust-toolchain.toml
        # contains nightly & linters/formatters
        run: rm -f rust-toolchain.toml

      - uses: rust-lang/crates-io-auth-action@v1
        id: auth

      - run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}