name: 🏗️ Test Install Scripts

on:
  push:
    paths-ignore:
      - "**.md"
    branches:
      - "long_lived/**"
      - main
      - "release/**"
  release:
    types: [published]
  pull_request:
    paths-ignore:
      - "**.md"
    branches:
      - "**"

concurrency:
  group: ${{ github.event_name == 'pull_request' && format('{0}-{1}', github.workflow_ref, github.event.pull_request.number) || github.run_id }}
  cancel-in-progress: true

jobs:
  test_scripts:
    name: Native ${{ matrix.os.emoji }} ${{ matrix.arch.emoji }} ${{ matrix.development.name }} - ${{ matrix.editable.name }}
    runs-on: ${{ matrix.os.runs-on[matrix.arch.matrix] }}
    strategy:
      fail-fast: false
      matrix:
        python:
          - major-dot-minor: "3.10"
        os:
          - name: Linux
            emoji: 🐧
            runs-on:
              arm: [Linux, ARM64]
              intel: ubuntu-latest
            matrix: linux
          - name: macOS
            emoji: 🍎
            runs-on:
              arm: macos-latest
              intel: macos-13
            matrix: macos
          - name: Windows
            emoji: 🪟
            runs-on:
              intel: windows-latest
            matrix: windows
        arch:
          - name: ARM
            emoji: 💪
            matrix: arm
          - name: Intel
            emoji: 🌀
            matrix: intel
        development:
          - name: Non-dev
            value: false
          - name: Dev
            value: true
        editable:
          - name: Non-edit
            value: false
            matrix: non-editable
          - name: Edit
            value: true
            matrix: editable
        exclude:
          - os:
              matrix: windows
            arch:
              matrix: arm

    steps:
      - name: Checkout Code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Python environment
        uses: Chia-Network/actions/setup-python@main
        with:
          python-version: ${{ matrix.python.major-dot-minor }}

      - uses: ./.github/actions/install
        with:
          python-version: ${{ matrix.python.major-dot-minor }}
          development: ${{ matrix.development.value }}
          editable: ${{ matrix.editable.value }}
          do-system-installs: true

      - uses: chia-network/actions/activate-venv@main

      - name: Run chia --help
        run: |
          chia --help

      - name: Run install-gui script (Linux, macOS)
        if: matrix.os.matrix != 'windows'
        run: |
          sh install-gui.sh

      - name: Run install-gui script (Windows)
        if: matrix.os.matrix == 'windows'
        run: |
          ./Install-gui.ps1

      - name: Collect editable info
        id: editable-info
        shell: bash
        run: |
          echo "pre-edit-version=$(chia version)" >> "$GITHUB_OUTPUT"
          echo '__version__ = "shooby-doowah"' >> chia/__init__.py
          echo "post-edit-version=$(chia version)" >> "$GITHUB_OUTPUT"

      - name: Check editable
        if: matrix.editable.matrix == 'editable'
        shell: bash
        env:
          PRE_VERSION: ${{ steps.editable-info.outputs.pre-edit-version }}
          POST_VERSION: ${{ steps.editable-info.outputs.post-edit-version }}
        run: |
          [ "$POST_VERSION" = "shooby-doowah" ] && [ "$PRE_VERSION" != "shooby-doowah" ]

      - name: Check non-editable
        if: matrix.editable.matrix == 'non-editable'
        shell: bash
        env:
          PRE_VERSION: ${{ steps.editable-info.outputs.pre-edit-version }}
          POST_VERSION: ${{ steps.editable-info.outputs.post-edit-version }}
        run: |
          [ "$POST_VERSION" != "shooby-doowah" ] && [ "$PRE_VERSION" = "$POST_VERSION" ]

  test_scripts_in_docker:
    name: Docker ${{ matrix.distribution.name }} ${{ matrix.arch.name }}
    runs-on: ${{ matrix.os.runs-on[matrix.arch.matrix] }}
    container: ${{ matrix.distribution.url }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - name: Linux
            matrix: linux
            runs-on:
              intel: ubuntu-latest
              arm: [linux, arm64]
        distribution:
          - name: amazonlinux:2023
            type: amazon
            url: "docker://amazonlinux:2023"
          - name: arch:latest
            type: arch
            url: "docker://archlinux:latest"
          - name: debian:bullseye
            type: debian
            # https://packages.debian.org/bullseye/python/python3 (3.9)
            url: "docker://debian:bullseye"
          - name: debian:bookworm
            type: debian
            # https://packages.debian.org/bookworm/python/python3 (3.11)
            url: "docker://debian:bookworm"
          - name: fedora:37
            type: fedora
            # (37, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+37&start=0
            url: "docker://fedora:37"
          - name: fedora:38
            type: fedora
            # (38, 3.11) https://packages.fedoraproject.org/search?query=python3&releases=Fedora+38&start=0
            url: "docker://fedora:38"
          - name: rockylinux:8
            type: rocky
            url: "docker://rockylinux:8"
          - name: rockylinux:9
            type: rocky
            url: "docker://rockylinux:9"
          - name: ubuntu:focal (20.04)
            type: ubuntu
            # https://packages.ubuntu.com/focal/python3 (20.04, 3.8)
            url: "docker://ubuntu:focal"
          - name: ubuntu:jammy (22.04)
            type: ubuntu
            # https://packages.ubuntu.com/jammy/python3 (22.04, 3.10)
            url: "docker://ubuntu:jammy"
          - name: ubuntu:noble (24.04)
            type: ubuntu
            # https://packages.ubuntu.com/noble/python3 (24.04, 3.12)
            url: "docker://ubuntu:noble"
        arch:
          - name: ARM64
            matrix: arm
          - name: Intel
            matrix: intel
        exclude:
          - distribution:
              type: arch
          # TODO: arch brought in glibc 2.41 which became more sensitive around execstack
          #       which is enabled in libbladebit.  fixes will be made to main and this
          #       should be re-enabled then.
          #    arch:
          #      matrix: arm

    steps:
      - name: Prepare Amazon Linux
        if: ${{ matrix.distribution.type == 'amazon' }}
        run: |
          yum install --assumeyes git sudo

      - name: Prepare Arch
        if: ${{ matrix.distribution.type == 'arch' }}
        run: |
          pacman --noconfirm -Syu
          pacman --noconfirm -S base git sudo openssl-1.1
          # The behavior we follow in install.sh is unique with Arch in that
          # we leave it to the user to install the appropriate version of python,
          # so we need to install python here in order for the test to succeed.
          pacman --noconfirm -U --needed https://archive.archlinux.org/packages/p/python/python-3.12.7-1-x86_64.pkg.tar.zst

      - name: Prepare Debian
        if: ${{ matrix.distribution.type == 'debian' }}
        env:
          DEBIAN_FRONTEND: noninteractive
        run: |
          apt-get --yes update
          apt-get install --yes git lsb-release sudo python3-venv

      - name: Prepare Fedora
        if: ${{ matrix.distribution.type == 'fedora' }}
        run: |
          yum install --assumeyes git

      - name: Prepare Rocky
        if: ${{ matrix.distribution.type == 'rocky' }}
        run: |
          yum install --assumeyes git sudo python39

      - name: Prepare Ubuntu
        if: ${{ matrix.distribution.type == 'ubuntu' }}
        env:
          DEBIAN_FRONTEND: noninteractive
        run: |
          # for bionic
          apt-get --yes update
          apt-get install --yes software-properties-common
          add-apt-repository --yes ppa:git-core/ppa
          apt-get --yes update
          apt-get install --yes git lsb-release sudo
          MINIMUM=3.9
          if ! apt satisfy --yes "python3-venv (>= ${MINIMUM})"
          then
            apt-get install --yes python${MINIMUM}-venv
          fi

      - name: Add safe git directory
        run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

      # after installing git so we use that copy
      - name: Checkout Code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: ./.github/actions/install
        with:
          development: true
          do-system-installs: true

      - uses: chia-network/actions/activate-venv@main

      - name: Run chia --help
        run: |
          chia --help
