name: Packaging(Linux)

on:
  push:
    branches:
      - master
      - fix*
    paths-ignore:
      - 'README.md'
      - 'LICENSE'
      - 'docs/**'

  pull_request:
    paths-ignore:
      - 'README.md'
      - 'LICENSE'
      - 'docs/**'
      - 'data/translations/*.ts'

  workflow_dispatch:

env:
  PRODUCT: flameshot
  RELEASE: 1
  # dockerfiles, see https://github.com/flameshot-org/flameshot-dockerfiles
  # docker images, see https://quay.io/repository/flameshot-org/ci-building
  DOCKER_REPO: quay.io/flameshot-org/ci-building
  # building tool: https://github.com/flameshot-org/packpack
  PACKPACK_REPO: flameshot-org/packpack

jobs:
  deb-pack:
    name: Build deb on ${{ matrix.dist.name }} ${{ matrix.dist.arch }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        dist:
          - {
              name: debian-12,
              os: debian,
              symbol: bookworm,
              arch: amd64
            }
          - {
              name: ubuntu-22.04,
              os: ubuntu,
              symbol: jammy,
              arch: amd64
            }
          - {
              name: ubuntu-24.04,
              os: ubuntu,
              symbol: noble,
              arch: amd64
            }

    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Checkout Source code
        if: github.event_name == 'push'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
#          ref: master

      - name: Checkout Source code
        if: github.event_name == 'pull_request'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Checkout Source code
        if: github.event_name == 'workflow_dispatch'
        uses: actions/checkout@v4
        with:
          ref: ${{ github.sha }}

      - name: Set env & Print flameshot version
        shell: bash
        run: |
          last_committed_tag=$(git tag -l --sort=-v:refname | head -1)
          git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)
          git_hash=$(git rev-parse --short HEAD)
          ver_info=${last_committed_tag}+git${git_revno}.${git_hash}
          echo "=======FLAMESHOT VERSION========"
          echo ${last_committed_tag:1}
          echo "Details: ${ver_info}"
          echo "================================"
          # This will allow to build pre-preleases without git tag
          # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV
          echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV
          echo "VER_INFO=${ver_info}" >> $GITHUB_ENV

      - name: Get packpack tool
        uses: actions/checkout@v4
        with:
          repository: ${{ env.PACKPACK_REPO }}
          path: tools
          ref: multiarch
          set-safe-directory: $GITHUB_WORKSPACE/tools

      - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }}
        env:
          OS: ${{ matrix.dist.os }}
          DIST: ${{ matrix.dist.symbol }}
          #DOCKER_ARCH: ${{ matrix.dist.arch }}
          ## I cannot see if ARCH is used anywhere. Should we remove it?
          #ARCH: ${{ matrix.dist.arch }}
        run: |
          cp -r $GITHUB_WORKSPACE/packaging/debian $GITHUB_WORKSPACE
          bash $GITHUB_WORKSPACE/tools/packpack
          mv $GITHUB_WORKSPACE/build/${PRODUCT}_${VERSION}-${RELEASE}_${{ matrix.dist.arch }}.deb $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb

      - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package
        run: |
          cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; }
          sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb | tee ${PRODUCT}-${VERSION}-${RELEASE}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb.sha256sum

      - name: Artifact Upload
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }}
          path: |
            ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb
            ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.${{ matrix.dist.name }}.${{ matrix.dist.arch }}.deb.sha256sum
          overwrite: true

  rpm-pack:
    name: Build rpm on ${{ matrix.dist.name }} ${{ matrix.dist.arch }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        dist:
          - {
              name: fedora-41,
              os: fedora,
              symbol: 41,
              arch: x86_64
            }
          - {
              name: fedora-42,
              os: fedora,
              symbol: 42,
              arch: x86_64
            }
    steps:
      - name: Checkout Source code
        if: github.event_name == 'push'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
#          ref: master

      - name: Checkout Source code
        if: github.event_name == 'pull_request'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Checkout Source code
        if: github.event_name == 'workflow_dispatch'
        uses: actions/checkout@v4
        with:
          ref: ${{ github.sha }}

      - name: Set env & Print flameshot version
        shell: bash
        run: |
          last_committed_tag=$(git tag -l --sort=-v:refname | head -1)
          git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)
          git_hash=$(git rev-parse --short HEAD)
          ver_info=${last_committed_tag}+git${git_revno}.${git_hash}
          echo "=======FLAMESHOT VERSION========"
          echo ${last_committed_tag:1}
          echo "Details: ${ver_info}"
          echo "================================"
          # This will allow to build pre-preleases without git tag
          # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV
          echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV
          echo "VER_INFO=${ver_info}" >> $GITHUB_ENV

      - name: Get packpack tool
        uses: actions/checkout@v4
        with:
          repository: ${{ env.PACKPACK_REPO }}
          path: tools
          ref: master
          set-safe-directory: $GITHUB_WORKSPACE/tools

      - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }}
        if: matrix.dist.os == 'fedora'
        run: |
          mkdir $GITHUB_WORKSPACE/rpm
          cp $GITHUB_WORKSPACE/packaging/rpm/fedora/flameshot.spec $GITHUB_WORKSPACE/rpm
          bash $GITHUB_WORKSPACE/tools/packpack
        env:
          OS: ${{ matrix.dist.os }}
          DIST: ${{ matrix.dist.symbol }}

      - name: Packaging on ${{ matrix.dist.name }} ${{ matrix.dist.arch }}
        if: matrix.dist.os == 'opensuse-leap'
        run: |
          mkdir $GITHUB_WORKSPACE/rpm
          cp $GITHUB_WORKSPACE/packaging/rpm/opensuse/flameshot.spec $GITHUB_WORKSPACE/rpm
          bash $GITHUB_WORKSPACE/tools/packpack
        env:
          OS: ${{ matrix.dist.os }}
          DIST: ${{ matrix.dist.symbol }}

      - name: Package Clean
        if: matrix.dist.os == 'fedora'
        run: |
          rm -f ${{ github.workspace }}/build/${{ env.PRODUCT }}-debuginfo-*.rpm
          rm -f ${{ github.workspace }}/build/${{ env.PRODUCT }}-debugsource-*.rpm
          rm -f ${{ github.workspace }}/build/${{ env.PRODUCT }}-*.src.rpm
          rm -f ${{ github.workspace }}/build/build.log

      - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package
        if: matrix.dist.os == 'fedora'
        run: |
          cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; }
          sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.fc*.${{ matrix.dist.arch }}.rpm | tee ${PRODUCT}-${VERSION}-${RELEASE}.fc${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm.sha256sum

      - name: SHA256Sum of ${{ matrix.dist.name }} ${{ matrix.dist.arch }} package
        if: matrix.dist.os == 'opensuse-leap'
        run: |
          mv $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-lp*.${{ matrix.dist.arch }}.rpm $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm
          cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; }
          sha256sum ${PRODUCT}-${VERSION}-${RELEASE}-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm | tee ${PRODUCT}-${VERSION}-${RELEASE}-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm.sha256sum

      - name: Artifact Upload
        if: matrix.dist.os == 'fedora'
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }}
          path: |
            ${{ github.workspace }}/build/
          overwrite: true

      - name: Artifact Upload
        if: matrix.dist.os == 'opensuse-leap'
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-${{ matrix.dist.name }}-${{ matrix.dist.arch }}
          path: |
            ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm
            ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-lp${{ matrix.dist.symbol }}.${{ matrix.dist.arch }}.rpm.sha256sum
          overwrite: true

#   appimage-pack:
#     name: Build appimage on ${{ matrix.config.name }}
#     runs-on: ubuntu-latest
#     strategy:
#       fail-fast: false
#       matrix:
#         config:
#           - {
#               name: ubuntu-22.04,
#               os: ubuntu,
#               symbol: jammy,
#               arch: amd64,
#               image_repo: quay.io/flameshot-org/ci-building
#             }
#     container:
#       image: ${{ matrix.config.image_repo }}:${{ matrix.config.os }}-${{ matrix.config.symbol }}
#       options: --cap-add SYS_ADMIN --device /dev/fuse --security-opt apparmor:unconfined
#     steps:
#       - name:
#         shell: bash
#         run: |
#           git config --global --add safe.directory "$GITHUB_WORKSPACE"
#
#       - name: Checkout Source code
#         if: github.event_name == 'push'
#         uses: actions/checkout@v4
#         with:
#           fetch-depth: 0
#           ref: master
#       - name: Checkout Source code
#         if: github.event_name == 'pull_request'
#         uses: actions/checkout@v4
#         with:
#           fetch-depth: 0
#           ref: ${{ github.event.pull_request.head.sha }}
#       - name: Set env & Print flameshot version
#         shell: bash
#         run: |
#           last_committed_tag=$(git tag -l --sort=-v:refname | head -1)
#           git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)
#           git_hash=$(git rev-parse --short HEAD)
#           ver_info=${last_committed_tag}+git${git_revno}.${git_hash}
#           echo "=======FLAMESHOT VERSION========"
#           echo ${last_committed_tag:1}
#           echo "Details: ${ver_info}"
#           echo "================================"
#           echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV
#           echo "VER_INFO=${ver_info}" >> $GITHUB_ENV
#       - name: Install Dependencies
#         run: |
#           sudo apt-get -y -qq update
#           sudo apt-get -y --no-install-recommends install \
#             python3 \
#             python3-pip \
#             fuse \
#             patchelf \
#             cmake \
#             extra-cmake-modules \
#             build-essential \
#             qt5-qmake \
#             qtbase5-dev \
#             qtbase5-dev-tools \
#             qttools5-dev-tools \
#             qttools5-dev \
#             libqt5dbus5 \
#             libqt5network5 \
#             libqt5core5a \
#             libqt5widgets5 \
#             libqt5gui5 \
#             libqt5svg5-dev \
#             appstream \
#             hicolor-icon-theme \
#             fcitx-frontend-qt5 \
#             openssl \
#             ca-certificates \
#             jq
#
#       - name: Get go-appimage tool
#       # Will not use linuxdeployqt anymore, because it suopprts currently still-supported mainstream distribution,
#       # which is glibc 2.23. For more information, please see https://github.com/probonopd/linuxdeployqt/issues/340.
#       # Will try new tool https://github.com/probonopd/go-appimage written in golang by probonopd.
#         run: |
#           wget $(curl https://api.github.com/repos/probonopd/go-appimage/releases | jq -r '.[] | select(.tag_name == "continuous") | .assets[] | select((.name | endswith("x86_64.AppImage")) and (.name | contains("appimagetool"))) | .browser_download_url') -O appimagetool
#
#           chmod +x appimagetool
#         env:
#           APPIMAGETOOL_ARCH: x86_64
#       - name: Packaging appimage
#         run: |
#           set -x
#           APPIMAGE_DST_PATH=$GITHUB_WORKSPACE/${PRODUCT}.AppDir
#           mkdir -p ${APPIMAGE_DST_PATH}
#
#           cd $GITHUB_WORKSPACE
#           cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr -DUSE_LAUNCHER_ABSOLUTE_PATH:BOOL=OFF
#           make -j$(nproc) DESTDIR=${APPIMAGE_DST_PATH} install
#
#           $GITHUB_WORKSPACE/appimagetool -s deploy "${APPIMAGE_DST_PATH}/usr/share/applications/org.flameshot.Flameshot.desktop"
#
#           mkdir -p ${APPIMAGE_DST_PATH}/usr/plugins/platforminputcontexts
#           cp \
#             /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so \
#             ${APPIMAGE_DST_PATH}/usr/plugins/platforminputcontexts/
#
#           cp \
#             $GITHUB_WORKSPACE/data/img/app/org.flameshot.Flameshot.png \
#             ${APPIMAGE_DST_PATH}/
#
#           if [ -f "${APPIMAGE_DST_PATH}/lib/x86_64-linux-gnu/libxcb-glx.so.0" ]; then
#             rm ${APPIMAGE_DST_PATH}/lib/x86_64-linux-gnu/libxcb-glx.so.0
#           fi
#
#           chmod +x ${APPIMAGE_DST_PATH}/usr/lib64/ld-*.so.*
#
#
#           VERSION=${VERSION} $GITHUB_WORKSPACE/appimagetool "${APPIMAGE_DST_PATH}"
#           mv $GITHUB_WORKSPACE/Flameshot-${VERSION}-x86_64.AppImage $GITHUB_WORKSPACE/Flameshot-${VERSION}.x86_64.AppImage
#
#
#       - name: SHA256Sum of appimage package
#         run: |
#           cd "$GITHUB_WORKSPACE/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/'!"; exit 11 ; }
#           sha256sum Flameshot-${VERSION}.x86_64.AppImage | tee Flameshot-${VERSION}.x86_64.AppImage.sha256sum
#       - name: Artifact Upload
#         uses: actions/upload-artifact@v4
#         with:
#           name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-appimage-x86_64
#           path: |
#             ${{ github.workspace }}/Flameshot-*.x86_64.AppImage
#             ${{ github.workspace }}/Flameshot-*.x86_64.AppImage.sha256sum
#           overwrite: true
#
  flatpak-pack:
    name: Build flatpak on ubuntu 24.04
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout Source code
        if: github.event_name == 'push'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: master
      - name: Checkout Source code
        if: github.event_name == 'pull_request'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Checkout Source code
        if: github.event_name == 'workflow_dispatch'
        uses: actions/checkout@v4
        with:
          ref: ${{ github.sha }}

      - name: Set env & Print flameshot version
        shell: bash
        run: |
          last_committed_tag=$(git tag -l --sort=-v:refname | head -1)
          git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)
          git_hash=$(git rev-parse --short HEAD)
          ver_info=${last_committed_tag}+git${git_revno}.${git_hash}
          echo "=======FLAMESHOT VERSION========"
          echo ${last_committed_tag:1}
          echo "Details: ${ver_info}"
          echo "================================"
          # This will allow to build pre-preleases without git tag
          # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV
          echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV
          echo "VER_INFO=${ver_info}" >> $GITHUB_ENV

      - name: Setup flatpak
        run: |
          sudo apt-get -y -qq update
          sudo apt-get install -y flatpak flatpak-builder
      - name: Setup Flathub
        run: |
          flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
          flatpak install -y --noninteractive flathub org.kde.Sdk//6.9 org.kde.Platform//6.9
      - name: Packaging flatpak
        run: |
          BUNDLE="org.flameshot.Flameshot_${VERSION}_x86_64.flatpak"
          MANIFEST_PATH=$GITHUB_WORKSPACE/packaging/flatpak/org.flameshot.Flameshot.yml
          RUNTIME_REPO="https://flathub.org/repo/flathub.flatpakrepo"
          APP_ID="org.flameshot.Flameshot"
          BRANCH="master"

          flatpak-builder --user --disable-rofiles-fuse --repo=repo --force-clean flatpak_app ${MANIFEST_PATH} --install-deps-from=flathub
          flatpak build-bundle repo ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APP_ID} ${BRANCH}
          mv $GITHUB_WORKSPACE/org.flameshot.Flameshot_${VERSION}_x86_64.flatpak $GITHUB_WORKSPACE/org.flameshot.Flameshot-${VERSION}.x86_64.flatpak
      - name: SHA256Sum of flatpak package
        run: |
          cd "$GITHUB_WORKSPACE/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/'!"; exit 11 ; }
          sha256sum org.flameshot.Flameshot-${VERSION}.x86_64.flatpak | tee org.flameshot.Flameshot-${VERSION}.x86_64.flatpak.sha256sum
      - name: Artifact Upload
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-flatpak-x86_64
          path: |
            ${{ github.workspace }}/org.flameshot.Flameshot-*.x86_64.flatpak
            ${{ github.workspace }}/org.flameshot.Flameshot-*.x86_64.flatpak.sha256sum
          overwrite: true

  snap-pack:
    name: Build snap on ubuntu latest
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Source code
        if: github.event_name == 'push'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: master
      - name: Checkout Source code
        if: github.event_name == 'pull_request'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}


      - name: Checkout Source code
        if: github.event_name == 'workflow_dispatch'
        uses: actions/checkout@v4
        with:
          ref: ${{ github.sha }}

      - name: Set env & Print flameshot version
        shell: bash
        run: |
          last_committed_tag=$(git tag -l --sort=-v:refname | head -1)
          git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)
          git_hash=$(git rev-parse --short HEAD)
          ver_info=${last_committed_tag}+git${git_revno}.${git_hash}
          echo "=======FLAMESHOT VERSION========"
          echo ${last_committed_tag:1}
          echo "Details: ${ver_info}"
          echo "================================"
          # This will allow to build pre-preleases without git tag
          # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV
          echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV
          echo "VER_INFO=${ver_info}" >> $GITHUB_ENV

      - name: Packaging snap
        uses: snapcore/action-build@v1
        id: snapcraft

      - name: Rename snap name
        shell: bash
        run: |
          mkdir -p $GITHUB_WORKSPACE/build
          cp ${{ steps.snapcraft.outputs.snap }} $GITHUB_WORKSPACE/build/${PRODUCT}-${VERSION}-${RELEASE}.amd64.snap
      - name: SHA256Sum of snap package
        run: |
          cd "$GITHUB_WORKSPACE/build/" || { >&2 echo "Cannot cd to '$GITHUB_WORKSPACE/build/'!"; exit 11 ; }
          sha256sum ${PRODUCT}-${VERSION}-${RELEASE}.amd64.snap | tee ${PRODUCT}-${VERSION}-${RELEASE}.amd64.snap.sha256sum
      - name: Artifact Upload
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-snap-x86_64
          path: |
            ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.amd64.snap
            ${{ github.workspace }}/build/${{ env.PRODUCT }}-*-${{ env.RELEASE }}.amd64.snap.sha256sum
          overwrite: true
