name: Build for release

on:
  workflow_dispatch: # can't publish from dispatch
  workflow_call:
    inputs:
      publish:
        description: "Set to the release metadata JSON to publish the release"
        required: false
        type: string

env:
  CARGO_TERM_COLOR: always
  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        include:
          - { o: macos-latest,   t: x86_64-apple-darwin,                    r: true          }
          - { o: macos-latest,   t: aarch64-apple-darwin                                     }
          - { o: ubuntu-latest,  t: x86_64-unknown-linux-gnu,      g: 2.17, r: true, c: true }
          - { o: ubuntu-latest,  t: armv7-unknown-linux-gnueabihf, g: 2.17,          c: true }
          - { o: ubuntu-latest,  t: aarch64-unknown-linux-gnu,     g: 2.17,          c: true }
          - { o: ubuntu-latest,  t: x86_64-unknown-linux-musl,              r: true, c: true }
          - { o: ubuntu-latest,  t: armv7-unknown-linux-musleabihf,                  c: true }
          - { o: ubuntu-latest,  t: aarch64-unknown-linux-musl,                      c: true }
          - { o: windows-latest, t: x86_64-pc-windows-msvc,                 r: true          }
          - { o: windows-latest, t: aarch64-pc-windows-msvc                                  }

    name: ${{ matrix.t }}
    runs-on: ${{ matrix.o }}
    env:
      CARGO_BUILD_TARGET: ${{ matrix.t }}
      GLIBC_VERSION: ${{ matrix.g }}
      JUST_USE_CARGO_ZIGBUILD: ${{ matrix.c }}
      JUST_FOR_RELEASE: true
      JUST_USE_AUDITABLE: true

    steps:
    - uses: actions/checkout@v3
    - uses: ./.github/actions/just-setup
      with:
        cache-suffix: release-${{ matrix.t }}
        tools: cargo-auditable
      env:
        # just-setup use binstall to install sccache and cargo-auditable,
        # which works better when we provide it with GITHUB_TOKEN.
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - run: just toolchain rust-src
    - run: just ci-install-deps
    - run: just package
    - if: runner.os == 'Windows'
      run: Get-ChildItem packages/
    - if: runner.os != 'Windows'
      run: ls -shal packages/

    - name: Run unit tests in release build
      if: "matrix.r"
      run: |
        just avoid-benchmark-deps
        just unit-tests
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - name: Ensure release binary is runnable
      if: "matrix.r"
      run: just e2e-tests
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - if: inputs.publish
      name: Upload to release
      uses: svenstaro/upload-release-action@v2
      with:
        repo_token: ${{ secrets.GITHUB_TOKEN }}
        tag: v${{ fromJSON(inputs.publish).version }}
        body: ${{ fromJSON(inputs.publish).notes }}
        file: packages/cargo-binstall-*
        file_glob: true
    - if: "! inputs.publish || runner.os == 'macOS'"
      name: Upload artifact
      uses: actions/upload-artifact@v3
      with:
        name: ${{ matrix.t }}
        path: packages/cargo-binstall-*
        retention-days: 1

  lipo:
    needs: build
    name: universal-apple-darwin
    runs-on: macos-latest
    env:
      JUST_FOR_RELEASE: true

    steps:
    - uses: actions/checkout@v3

    - uses: taiki-e/install-action@v2
      with:
        tool: just

    - uses: actions/download-artifact@v3
      with:
        name: x86_64-apple-darwin
        path: packages/
    - uses: actions/download-artifact@v3
      with:
        name: aarch64-apple-darwin
        path: packages/

    - run: ls -shalr packages/
    - run: just repackage-lipo
    - run: ls -shal packages/

    - if: inputs.publish
      name: Upload to release
      uses: svenstaro/upload-release-action@v2
      with:
        repo_token: ${{ secrets.GITHUB_TOKEN }}
        tag: v${{ fromJSON(inputs.publish).version }}
        release_name: v${{ fromJSON(inputs.publish).version }}
        body: ${{ fromJSON(inputs.publish).notes }}
        file: packages/cargo-binstall-universal-*
        file_glob: true
        overwrite: true
    - if: "! inputs.publish"
      name: Upload artifact
      uses: actions/upload-artifact@v3
      with:
        name: universal-apple-darwin
        path: packages/cargo-binstall-universal-*
        retention-days: 1