on: [pull_request]
name: abicheck
env:
  build_options: -Dbuildtype=debug -Denable-true-color=yes -Dwith-proxy=yes -Dc_args=-DPERL_EUPXS_ALWAYS_EXPORT
  prefix: /usr/local
  apt_build_deps: ninja-build libutf8proc-dev libperl-dev libotr5-dev
  get_pip_build_deps: pip3 install setuptools; pip3 install wheel; pip3 install 'meson<0.59.0'
  getabidef_def: getabidef() { awk '$1=="#define" && $2=="IRSSI_ABI_VERSION" { print $3 }' "$1"/include/irssi/src/common.h; }
jobs:
  build-base-ref:
    runs-on: ubuntu-latest
    outputs:
      base_abi: ${{ steps.out.outputs.base_abi }}
    steps:
      - name: set PATH
        run: |
          echo "$HOME/.local/bin" >> $GITHUB_PATH
      - name: prepare required software
        run: |
          sudo apt install $apt_build_deps
          eval "$get_pip_build_deps"
      - name: checkout base ref
        uses: actions/checkout@main
        with:
          path: base.src
          ref: ${{ github.base_ref }}
      - name: build base ref
        run: |
          meson Build.base base.src $build_options
          ninja -C Build.base
          DESTDIR=$PWD/base ninja -C Build.base install
      - id: out
        run: |
          # print versions and abi versions
          eval "$getabidef_def"
          base_abi=$(getabidef base$prefix)
          echo base abi : $base_abi
          ./base$prefix/bin/irssi --version
          echo base_abi=$base_abi >> $GITHUB_OUTPUT
      - uses: actions/upload-artifact@v3
        with:
          name: base.inst
          path: base
          retention-days: 1
  build-merge-ref:
    runs-on: ubuntu-latest
    outputs:
      merge_abi: ${{ steps.out.outputs.merge_abi }}
    steps:
      - name: set PATH
        run: |
          echo "$HOME/.local/bin" >> $GITHUB_PATH
      - name: prepare required software
        run: |
          sudo apt install $apt_build_deps
          eval "$get_pip_build_deps"
      - name: checkout merge ref
        uses: actions/checkout@main
        with:
          path: merge.src
      - name: build merge ref
        run: |
          meson Build.merge merge.src $build_options
          ninja -C Build.merge
          DESTDIR=$PWD/merge ninja -C Build.merge install
      - id: out
        run: |
          # print versions and abi versions
          eval "$getabidef_def"
          merge_abi=$(getabidef merge$prefix)
          echo merge abi : $merge_abi
          ./merge$prefix/bin/irssi --version
          echo merge_abi=$merge_abi >> $GITHUB_OUTPUT
      - uses: actions/upload-artifact@v3
        with:
          name: merge.inst
          path: merge
          retention-days: 1
  check-abi-diff:
    runs-on: ubuntu-latest
    needs:
      - build-merge-ref
      - build-base-ref
    env:
      base_abi: ${{ needs.build-base-ref.outputs.base_abi }}
      merge_abi: ${{ needs.build-merge-ref.outputs.merge_abi }}
    steps:
      - name: prepare required software
        run: |
          sudo apt install abigail-tools
      - name: fetch base build
        uses: actions/download-artifact@v3
        with:
          name: base.inst
          path: base
      - name: fetch merge build
        uses: actions/download-artifact@v3
        with:
          name: merge.inst
          path: merge
      - run: |
          # abipkgdiff
          abipkgdiff -l base merge >abipkgdiff.out && diff_ret=0 || diff_ret=$?
          echo "diff_ret=$diff_ret" >> $GITHUB_ENV
          cat abipkgdiff.out
      - uses: actions/upload-artifact@v3
        with:
          path: abipkgdiff.out
      - run: |
          # Check if no changes are needed
          if [ "$diff_ret" -ne 0 ]; then
              if [ "$base_abi" -lt "$merge_abi" ]; then
                  echo "::warning ::abigail found changes and ABI changed from $base_abi to $merge_abi"
                  exit 0
              else
                  echo "::error ::Looks like the ABI changed but the IRSSI_ABI_VERSION did not"
                  exit $diff_ret
              fi
          else
              if [ "$base_abi" -ne "$merge_abi" ]; then
                  echo "::error ::abigail found no changes yet the IRSSI_ABI_VERSION changed. Is this correct?"
                  exit 1
              else
                  : "No changes detected and IRSSI_ABI_VERSION untouched"
                  exit 0
              fi
          fi
