name: Upload Conan Dependencies

on:
  schedule:
    - cron: "0 3 * * 2-6"
  workflow_dispatch:
    inputs:
      force_source_build:
        description: "Force source build of all dependencies"
        required: false
        default: false
        type: boolean
      force_upload:
        description: "Force upload of all dependencies"
        required: false
        default: false
        type: boolean
  pull_request:
    branches: [develop]
    paths:
      # This allows testing changes to the upload workflow in a PR
      - .github/workflows/upload-conan-deps.yml
  push:
    branches: [develop]
    paths:
      - .github/workflows/upload-conan-deps.yml
      - .github/workflows/reusable-strategy-matrix.yml
      - .github/actions/build-deps/action.yml
      - .github/actions/setup-conan/action.yml
      - ".github/scripts/strategy-matrix/**"
      - conanfile.py
      - conan.lock

env:
  CONAN_REMOTE_NAME: xrplf
  CONAN_REMOTE_URL: https://conan.ripplex.io
  NPROC_SUBTRACT: 2

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  # Generate the strategy matrix to be used by the following job.
  generate-matrix:
    uses: ./.github/workflows/reusable-strategy-matrix.yml
    with:
      strategy_matrix: ${{ github.event_name == 'pull_request' && 'minimal' || 'all' }}

  # Build and upload the dependencies for each configuration.
  run-upload-conan-deps:
    needs:
      - generate-matrix
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
      max-parallel: 10
    runs-on: ${{ matrix.architecture.runner }}
    container: ${{ contains(matrix.architecture.platform, 'linux') && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}-sha-{4}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version, matrix.os.image_sha) || null }}
    steps:
      - name: Cleanup workspace
        if: ${{ runner.os == 'macOS' }}
        uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e

      - name: Checkout repository
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0

      - name: Prepare runner
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
        with:
          disable_ccache: false

      - name: Print build environment
        uses: ./.github/actions/print-env

      - name: Get number of processors
        uses: XRPLF/actions/.github/actions/get-nproc@046b1620f6bfd6cd0985dc82c3df02786801fe0a
        id: nproc
        with:
          subtract: ${{ env.NPROC_SUBTRACT }}

      - name: Setup Conan
        uses: ./.github/actions/setup-conan
        with:
          conan_remote_name: ${{ env.CONAN_REMOTE_NAME }}
          conan_remote_url: ${{ env.CONAN_REMOTE_URL }}

      - name: Build dependencies
        uses: ./.github/actions/build-deps
        with:
          build_dir: .build
          build_nproc: ${{ steps.nproc.outputs.nproc }}
          build_type: ${{ matrix.build_type }}
          force_build: ${{ github.event_name == 'schedule' || github.event.inputs.force_source_build == 'true' }}
          # Set the verbosity to "quiet" for Windows to avoid an excessive
          # amount of logs. For other OSes, the "verbose" logs are more useful.
          log_verbosity: ${{ runner.os == 'Windows' && 'quiet' || 'verbose' }}

      - name: Log into Conan remote
        if: ${{ github.repository_owner == 'XRPLF' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') }}
        run: conan remote login "${CONAN_REMOTE_NAME}" "${{ secrets.CONAN_REMOTE_USERNAME }}" --password "${{ secrets.CONAN_REMOTE_PASSWORD }}"

      - name: Upload Conan packages
        if: ${{ github.repository_owner == 'XRPLF' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') }}
        env:
          FORCE_OPTION: ${{ github.event.inputs.force_upload == 'true' && '--force' || '' }}
        run: conan upload "*" --remote="${CONAN_REMOTE_NAME}" --confirm ${FORCE_OPTION}
