name: Continuous Integration
concurrency:
  group: "${{github.workflow}}-${{github.ref}}"
  cancel-in-progress: true
on:
  workflow_dispatch:
  push:
    branches:
      - main
      - v*.*.x
    tags:
      - v*.*.*
  pull_request:
    types: [opened, synchronize]
    branches:
      - "*"
  schedule:
    - cron: "0 8 * * 5" # At 08:00 on Friday # https://crontab.guru/#0_8_*_*_5

jobs:
  test-unit:
    env:
      MAKEFLAGS: -j2
    strategy:
      fail-fast: false
      matrix:
        platform: [ubuntu-latest, windows-latest, macos-latest]
        ruby: ["2.3", "2.4", "2.5", "2.6", "2.7", "3.0", "3.1", "3.2", "3.3", "head"]
        exclude:
          # I can't figure out how to install these on macos through setup-ruby
          - ruby: "2.3"
            platform: "macos-latest"
          - ruby: "2.4"
            platform: "macos-latest"
          - ruby: "2.5"
            platform: "macos-latest"
    runs-on: ${{ matrix.platform }}
    steps:
      - name: configure git crlf on windows
        if: matrix.platform == 'windows-latest'
        run: |
          git config --system core.autocrlf false
          git config --system core.eol lf
      - uses: actions/checkout@v4
      - uses: MSP-Greg/setup-ruby-pkgs@v1
        with:
          apt-get: _update_ build-essential cmake
          mingw: _upgrade_ cmake
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true
      - run: bundle exec rake test:unit

  test-examples:
    env:
      MAKEFLAGS: -j2
    strategy:
      fail-fast: false
      matrix:
        # use macos-13 (not 14) because libyaml 0.2.5 doesn't have up-to-date config.guess and config.sub
        platform: [ubuntu-latest, windows-latest, macos-13]
        ruby: ["3.1"]
    runs-on: ${{ matrix.platform }}
    steps:
      - name: configure git crlf on windows
        if: matrix.platform == 'windows-latest'
        run: |
          git config --system core.autocrlf false
          git config --system core.eol lf
      - uses: actions/checkout@v4
      - uses: MSP-Greg/setup-ruby-pkgs@v1
        with:
          apt-get: _update_ build-essential cmake
          mingw: _upgrade_ cmake
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true
      - uses: actions/cache@v4
        with:
          path: examples/ports/archives
          key: examples-${{ hashFiles('examples/Rakefile') }}
      - run: bundle exec rake test:examples

  fedora: # see https://github.com/flavorjones/mini_portile/issues/118
    strategy:
      fail-fast: false
      matrix:
        task: ["test:unit", "test:examples"]
    runs-on: ubuntu-latest
    container:
      image: fedora:35
    steps:
      - run: |
          dnf group install -y "C Development Tools and Libraries"
          dnf install -y ruby ruby-devel libyaml-devel git-all patch cmake xz
      - uses: actions/checkout@v4
      - uses: actions/cache@v4
        with:
          path: examples/ports/archives
          key: examples-${{ hashFiles('examples/Rakefile') }}
      - run: bundle install
      - run: bundle exec rake ${{ matrix.task }}

  freebsd:
    strategy:
      fail-fast: false
      matrix:
        task: ["test:unit", "test:examples"]
    runs-on: ubuntu-latest
    env:
      MAKE: gmake
    steps:
      - uses: actions/checkout@v4
      - uses: actions/cache@v4
        with:
          path: examples/ports/archives
          key: examples-${{ hashFiles('examples/Rakefile') }}
      - uses: vmactions/freebsd-vm@v1
        with:
          envs: MAKE
          usesh: true
          copyback: false
          prepare: pkg install -y ruby devel/ruby-gems pkgconf git cmake devel/gmake textproc/libyaml security/gnupg
          run: |
            git config --global --add safe.directory /home/runner/work/mini_portile/mini_portile
            gem install bundler
            bundle install
            bundle exec rake ${{ matrix.task }}

  openbsd:
    strategy:
      fail-fast: false
      matrix:
        task: ["test:unit", "test:examples"]
    runs-on: ubuntu-latest
    env:
      MAKE: gmake
    steps:
    - uses: actions/checkout@v4
    - uses: vmactions/openbsd-vm@v1
      with:
        envs: MAKE
        usesh: true
        copyback: false
        prepare: |
          pkg_add ruby%3.1 gmake cmake git pkgconf security/gnupg
          ln -sf /usr/local/bin/ruby31 /usr/local/bin/ruby
          ln -sf /usr/local/bin/bundle31 /usr/local/bin/bundle
          ln -sf /usr/local/bin/bundler31 /usr/local/bin/bundler
          ln -sf /usr/local/bin/erb31 /usr/local/bin/erb
          ln -sf /usr/local/bin/gem31 /usr/local/bin/gem
          ln -sf /usr/local/bin/irb31 /usr/local/bin/irb
          ln -sf /usr/local/bin/racc31 /usr/local/bin/racc
          ln -sf /usr/local/bin/rake31 /usr/local/bin/rake
          ln -sf /usr/local/bin/rbs31 /usr/local/bin/rbs
          ln -sf /usr/local/bin/rdbg31 /usr/local/bin/rdbg
          ln -sf /usr/local/bin/rdoc31 /usr/local/bin/rdoc
          ln -sf /usr/local/bin/ri31 /usr/local/bin/ri
          ln -sf /usr/local/bin/syntax_suggest31 /usr/local/bin/syntax_suggest
          ln -sf /usr/local/bin/typeprof31 /usr/local/bin/typeprof
        run: |
          git config --global --add safe.directory /home/runner/work/mini_portile/mini_portile
          gem install bundler
          bundle install
          bundle exec rake ${{ matrix.task }}
