on:
  workflow_dispatch:
  schedule:
  - cron: 0 6 * * *
  push:
    branches:
    - main
    paths:
    - configure
    - m4/version.m4
    - .github/build/windows/download-configure.sh
    - .github/build/windows/download-dependencies.sh
    - .github/workflows/release.yml
  pull_request:
    branches:
    - main
    paths:
    - .github/workflows/release.yml

name: Release
permissions:
  contents: read
jobs:
  version:
    name: Set version
    runs-on: ubuntu-24.04
    outputs:
      version: ${{ steps.version.outputs.version }}
      publish: ${{ steps.version.outputs.publish }}

    steps:
    - name: Clone ImageMagick
      uses: actions/checkout@v5
      with:
        fetch-depth: 0

    - name: Set version
      id: version
      run: |
        version=$(grep -oP "PACKAGE_VERSION='\K[0-9\.-]*" configure)
        echo "version=$version" >> $GITHUB_OUTPUT
        echo "version=$version"
        tag=$(git describe --tags HEAD --exact-match || true)
        if [[ "$tag" == "$version" ]]; then
          echo "publish=true" >> $GITHUB_OUTPUT
          echo "publish=true"
        fi

  changelog:
    name: Create ChangeLog.md
    runs-on: ubuntu-24.04
    needs:
      - version

    steps:
    - name: Clone ImageMagick
      uses: actions/checkout@v5
      with:
        fetch-depth: 0

    - name: Install dependencies
      run: npm install -g auto-changelog

    - name: Create ChangeLog.md
      env:
        VERSION: ${{needs.version.outputs.version}}
      run: |
        if ! git tag -l | grep -q "^$VERSION$"; then
          git tag $VERSION
        fi
        auto-changelog --sort-commits date
        mkdir -p Artifacts
        mv ChangeLog.md Artifacts/ChangeLog.md

    - name: Upload ChangeLog.md
      uses: actions/upload-artifact@v5
      with:
        name: ChangeLog
        path: Artifacts

  windows_installer:
    name: Windows ${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.architecture}} (${{matrix.buildType}})
    runs-on: windows-2022
    needs:
      - changelog
      - version

    permissions:
      contents: read
      id-token: write

    strategy:
      fail-fast: false
      matrix:
        architecture: [ x64, x86 ]
        buildType: [ dynamic, static ]
        quantum: [ Q16, Q8 ]
        hdri: [ hdri, noHdri ]
        exclude:
          - quantum: Q8
            hdri: hdri
        include:
          - architecture: x64
            bit: 64
          - architecture: x86
            bit: 32
          - buildType: dynamic
            typeName: dll
          - buildType: static
            typeName: static
          - hdri: hdri
            hdri_flag: -HDRI

    steps:
    - name: Install Strawberry Perl
      if: ${{matrix.buildType == 'dynamic'}}
      shell: cmd
      run: |
        powershell Invoke-WebRequest -Uri https://github.com/ImageMagick/Windows/releases/download/build-binaries-2025-08-30/strawberry-perl-5.30.2.1-${{matrix.bit}}bit.msi -OutFile strawberry-perl-5.30.2.1-${{matrix.bit}}bit.msi
        msiexec /i strawberry-perl-5.30.2.1-${{matrix.bit}}bit.msi /qn INSTALLDIR="C:\Strawberry${{matrix.bit}}"
        mv "C:\Strawberry" "C:\Strawberry64"

    - name: Install Inno Setup
      shell: cmd
      run: |
        powershell Invoke-WebRequest -Uri https://github.com/ImageMagick/Windows/releases/download/build-binaries-2025-08-30/innosetup-6.2.0.exe -OutFile innosetup-6.2.0.exe
        innosetup-6.2.0.exe /SILENT /SUPPRESSMSGBOXES /NORESTART /SP-

    - name: Clone ImageMagick
      uses: actions/checkout@v5
      with:
        path: ImageMagick

    - name: Download configure
      shell: cmd
      run: |
        ImageMagick\.github\build\windows\download-configure.cmd

    - name: Download dependencies
      shell: cmd
      run: |
        ImageMagick\.github\build\windows\download-dependencies.cmd windows-${{matrix.architecture}}-${{matrix.buildType}}-openMP.zip

    - name: Download ChangeLog.md
      uses: actions/download-artifact@v6
      with:
        name: ChangeLog
        path: ImageMagick

    - name: Configure ImageMagick
      shell: cmd
      working-directory: Configure
      run: |
        Configure.Release.x64.exe /noWizard /VS2022 /installedSupport /deprecated /${{matrix.hdri}} /${{matrix.quantum}} /${{matrix.architecture}} /${{matrix.buildType}}

    - name: Build ImageMagick
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        msbuild /m /t:Rebuild /p:Configuration=Release,Platform=${{matrix.architecture}}

    - name: Build PerlMagick
      if: ${{matrix.buildType == 'dynamic'}}
      shell: cmd
      run: |
        set PATH=
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        cd ImageMagick\PerlMagick
        set PATH=%PATH%;C:\Strawberry${{matrix.bit}}\c\bin;C:\Strawberry${{matrix.bit}}\perl\site\bin;C:\Strawberry${{matrix.bit}}\perl\bin;C:\WINDOWS\System32\WindowsPowerShell\v1.0
        perl "Makefile.PL" "MAKE=nmake"
        nmake
        nmake release

    - name: Sign executables and libraries
      uses: ImageMagick/.github/actions/code-signing@main
      with:
        client-id: ${{secrets.AZURE_CLIENT_ID}}
        tenant-id: ${{secrets.AZURE_TENANT_ID}}
        subscription-id: ${{secrets.AZURE_SUBSCRIPTION_ID}}
        directory: Artifacts\bin

    - name: Create installer
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        "C:\Program Files (x86)\Inno Setup 6\iscc.exe" Configure\Installer\Inno\ImageMagick.iss

    - name: Sign installer
      uses: ImageMagick/.github/actions/code-signing@main
      with:
        client-id: ${{secrets.AZURE_CLIENT_ID}}
        tenant-id: ${{secrets.AZURE_TENANT_ID}}
        subscription-id: ${{secrets.AZURE_SUBSCRIPTION_ID}}
        directory: Configure\Installer\Inno\Artifacts

    - uses: actions/upload-artifact@v5
      with:
        name: ImageMagick-${{needs.version.outputs.version}}-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.typeName}}-${{matrix.architecture}}.exe
        path: Configure\Installer\Inno\Artifacts

  windows_source:
    name: Windows source
    runs-on: windows-2022
    needs:
      - changelog
      - version

    steps:
    - name: Clone ImageMagick/Windows
      uses: actions/checkout@v5
      with:
        repository: ImageMagick/Windows
        ref: refs/heads/main

    - name: Clone repositories
      shell: cmd
      run: |
        clone-repositories-im6.cmd

    - name: Download ChangeLog.md
      uses: actions/download-artifact@v6
      with:
        name: ChangeLog
        path: ImageMagick

    - name: Create source archive
      shell: cmd
      run: |
        mkdir source
        move Configure source
        move Dependencies source
        move ImageMagick source
        7z a ImageMagick-${{needs.version.outputs.version}}-Windows.7z .\source\*

    - uses: actions/upload-artifact@v5
      with:
        name: ImageMagick-${{needs.version.outputs.version}}-Windows.7z
        path: ImageMagick-${{needs.version.outputs.version}}-Windows.7z

  windows_portable:
    name: Windows portable ${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.architecture}}
    runs-on: windows-2022
    needs:
      - changelog
      - version

    permissions:
      contents: read
      id-token: write

    strategy:
      fail-fast: false
      matrix:
        architecture: [ x64, x86 ]
        quantum: [ Q16, Q8 ]
        hdri: [ hdri, noHdri ]
        exclude:
          - quantum: Q8
            hdri: hdri
        include:
          - hdri: hdri
            hdri_flag: -HDRI

    steps:
    - name: Clone ImageMagick
      uses: actions/checkout@v5
      with:
        path: ImageMagick

    - name: Download configure
      shell: cmd
      run: |
        ImageMagick\.github\build\windows\download-configure.cmd

    - name: Download dependencies
      shell: cmd
      run: |
        ImageMagick\.github\build\windows\download-dependencies.cmd windows-${{matrix.architecture}}-static-openMP-linked-runtime.zip

    - name: Download ChangeLog.md
      uses: actions/download-artifact@v6
      with:
        name: ChangeLog
        path: ImageMagick

    - name: Configure ImageMagick
      shell: cmd
      working-directory: Configure
      run: |
        Configure.Release.x64.exe /noWizard /VS2022 /${{matrix.hdri}} /${{matrix.quantum}} /${{matrix.architecture}} /static /linkRuntime

    - name: Build ImageMagick
      shell: cmd
      run: |
        call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat"
        msbuild /m /t:Rebuild /p:Configuration=Release,Platform=${{matrix.architecture}}

    - name: Sign executables and libraries
      uses: ImageMagick/.github/actions/code-signing@main
      with:
        client-id: ${{secrets.AZURE_CLIENT_ID}}
        tenant-id: ${{secrets.AZURE_TENANT_ID}}
        subscription-id: ${{secrets.AZURE_SUBSCRIPTION_ID}}
        directory: Artifacts\bin

    - name: Copy Files
      shell: pwsh
      run: |
        [void](New-Item -Name "portable" -ItemType directory)
        Copy-Item "Artifacts\bin\*.exe" "portable"
        Copy-Item "Artifacts\bin\*.xml" "portable"
        Copy-Item "Artifacts\bin\sRGB.icc" "portable"

        Copy-Item "Artifacts\NOTICE.txt" "portable"
        Copy-Item "ImageMagick\ChangeLog.md" "portable"
        Copy-Item "ImageMagick\LICENSE" "portable\LICENSE.txt"
        7z a ImageMagick-${{needs.version.outputs.version}}-portable-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.architecture}}.7z .\portable\*

    - uses: actions/upload-artifact@v5
      with:
        name: ImageMagick-${{needs.version.outputs.version}}-portable-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.architecture}}.7z
        path: ImageMagick-${{needs.version.outputs.version}}-portable-${{matrix.quantum}}${{matrix.hdri_flag}}-${{matrix.architecture}}.7z

  release:
    name: Publish Release
    if: ${{ needs.version.outputs.publish == 'true' }}
    runs-on: ubuntu-24.04
    needs:
      - version
      - windows_installer
      - windows_portable
      - windows_source

    permissions:
      contents: write

    steps:
    - name: Clone ImageMagick
      uses: actions/checkout@v5

    - name: Download artifacts
      uses: actions/download-artifact@v6
      with:
        path: artifacts
        merge-multiple: true

    - name: Publish release
      env:
        GH_TOKEN: ${{github.token}}
      run: gh release create ${{needs.version.outputs.version}} --title "${{needs.version.outputs.version}}" ${{github.workspace}}/artifacts/*.7z ${{github.workspace}}/artifacts/*.exe
