name: Bootstrapping

on:
  # This Workflow can be triggered manually
  workflow_dispatch:
  workflow_call:
  schedule:
    # nightly at 2:16 AM
    - cron: "16 2 * * *"

concurrency:
  group: bootstrap-${{github.ref}}-${{github.event.pull_request.number || github.run_number}}
  cancel-in-progress: true

jobs:
  distros-clingo-sources:
    if: github.repository == 'spack/spack'
    runs-on: ubuntu-latest
    container: ${{ matrix.image }}
    strategy:
      matrix:
        image: ["fedora:latest", "opensuse/leap:latest"]
    steps:
      - name: Setup Fedora
        if: ${{ matrix.image == 'fedora:latest' }}
        run: |
          dnf install -y \
              bzip2 curl file gcc-c++ gcc gcc-gfortran git gzip \
              make patch unzip which xz python3 python3-devel tree \
              cmake bison bison-devel libstdc++-static gawk
      - name: Setup OpenSUSE
        if: ${{ matrix.image == 'opensuse/leap:latest' }}
        run: |
          # Harden CI by applying the workaround described here: https://www.suse.com/support/kb/doc/?id=000019505
          zypper update -y || zypper update -y
          zypper install -y \
              bzip2 curl file gcc-c++ gcc gcc-fortran tar git gpg2 gzip \
              make patch unzip which xz python3 python3-devel tree \
              cmake bison
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          fetch-depth: 0
      - name: Bootstrap clingo
        run: |
          . share/spack/setup-env.sh
          spack bootstrap disable github-actions-v2
          spack bootstrap disable github-actions-v0.6
          spack -d solve zlib
          tree ~/.spack/bootstrap/store/

  clingo-sources:
    if: github.repository == 'spack/spack'
    runs-on: ${{ matrix.runner }}
    strategy:
      matrix:
        runner: ["macos-15-intel", "macos-latest", "ubuntu-latest"]
    steps:
      - name: Setup macOS
        if: ${{ matrix.runner != 'ubuntu-latest' }}
        run: brew install bison tree
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          fetch-depth: 0
      - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
        with:
          python-version: "3.12"
      - name: Bootstrap clingo
        run: |
          . share/spack/setup-env.sh
          spack bootstrap disable github-actions-v2
          spack bootstrap disable github-actions-v0.6
          export PATH="$(brew --prefix bison)/bin:$(brew --prefix cmake)/bin:$PATH"
          spack -d solve zlib
          tree ~/.spack/bootstrap/store/

  gnupg-sources:
    if: github.repository == 'spack/spack'
    runs-on: ${{ matrix.runner }}
    strategy:
      matrix:
        runner: ["macos-15-intel", "macos-latest", "ubuntu-latest"]
    steps:
      - name: Setup macOS
        if: ${{ matrix.runner != 'ubuntu-latest' }}
        run: brew install tree gawk
      - name: Remove system executables
        run: |
          while [ -n "$(command -v gpg gpg2 patchelf)" ]; do
            sudo rm $(command -v gpg gpg2 patchelf)
          done
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          fetch-depth: 0
      - name: Bootstrap GnuPG
        run: |
          . share/spack/setup-env.sh
          spack solve zlib
          spack bootstrap disable github-actions-v2
          spack bootstrap disable github-actions-v0.6
          spack -d gpg list
          tree ~/.spack/bootstrap/store/

  from-binaries:
    if: github.repository == 'spack/spack'
    runs-on: ${{ matrix.runner }}
    strategy:
      matrix:
        runner: ["macos-15-intel", "macos-latest", "ubuntu-latest"]
    steps:
      - name: Setup macOS
        if: ${{ matrix.runner != 'ubuntu-latest' }}
        run: brew install tree
      - name: Remove system executables
        run: |
          while [ -n "$(command -v gpg gpg2 patchelf)" ]; do
            sudo rm $(command -v gpg gpg2 patchelf)
          done
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          fetch-depth: 0
      - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
        with:
          python-version: |
            3.8
            3.9
            3.10
            3.11
            3.12
            3.13
            3.14
      - name: Set bootstrap sources
        run: |
          . share/spack/setup-env.sh
          spack bootstrap disable github-actions-v0.6
          spack bootstrap disable spack-install
      - name: Bootstrap clingo
        run: |
          . share/spack/setup-env.sh
          for ver in 3.8 3.9 3.10 3.11 3.12 3.13 3.14; do
            ver_dir="$(find "$RUNNER_TOOL_CACHE/Python" -wholename "*/${ver}.*/*/bin" | grep . || true)"
            export SPACK_PYTHON="$ver_dir/python3"
            if [ ! -d "$ver_dir" ] || ! "$SPACK_PYTHON" --version; then
              echo "Python $ver not found"
              exit 1
            fi
            spack solve zlib
          done
          tree ~/.spack/bootstrap/store
      - name: Bootstrap GnuPG
        run: |
          . share/spack/setup-env.sh
          spack -d gpg list
          tree ~/.spack/bootstrap/store/

  windows:
    if: github.repository == 'spack/spack'
    runs-on: "windows-latest"
    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          fetch-depth: 0
      - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b
        with:
          python-version: "3.12"
      - name: Setup Windows
        run: |
          Remove-Item -Path (Get-Command gpg).Path
          Remove-Item -Path (Get-Command file).Path
      - name: Bootstrap clingo
        run: |
          ./share/spack/setup-env.ps1
          spack bootstrap disable github-actions-v2
          spack bootstrap disable github-actions-v0.6
          spack -d solve zlib
          ./share/spack/qa/validate_last_exit.ps1
          tree $env:userprofile/.spack/bootstrap/store/
      - name: Bootstrap GnuPG
        run: |
          ./share/spack/setup-env.ps1
          spack -d gpg list
          ./share/spack/qa/validate_last_exit.ps1
          tree $env:userprofile/.spack/bootstrap/store/
