emulsion 12.0.0

A fast and minimalistic image viewer
name: Draft New Release with Distributables

on:
  workflow_dispatch:
  push:
    # Sequence of patterns matched against refs/tags
    tags:
    - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10

jobs:
  create_release:
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      version: ${{ steps.get_version.outputs.VERSION }}
    steps:
    - name: Get the version
      id: get_version
      run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
    - name: Create Release
      id: create_release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ github.ref }}
        release_name: Release ${{ github.ref }}
        draft: true
        prerelease: false

  windows:
    needs: create_release
    runs-on: windows-latest
    env:
      EMULSION_VERSION: ${{ needs.create_release.outputs.version }}
      INSTALLER_NAME: ${{ format('Emulsion-Windows-{0}.exe', needs.create_release.outputs.version) }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
    - name: Setup Rust
      uses: dtolnay/rust-toolchain@stable
    - name: Print installer name
      run: |

        Write-Host $Env:INSTALLER_NAME
    - name: Install NSIS
      run: |

        iex "& {$(irm get.scoop.sh)} -RunAsAdmin"
        scoop bucket add extras
        scoop install nsis
    - name: Print NSIS version
      run: makensis -VERSION
    - name: Fetch Prerequisites
      working-directory: ./distribution/windows/prerequisites
      run: (New-Object System.Net.WebClient).DownloadFile('https://aka.ms/vs/16/release/vc_redist.x64.exe', 'vc_redist.x64.exe')

    - name: Install avif build dependencies (Windows)
      run: |

        choco install pkgconfiglite nasm ninja
        python -m pip install meson

        $newPath = "$($env:SystemDrive)\Program Files\NASM\"
        $currentPath = $Env:PATH
        Set-Content -Path $env:GITHUB_PATH -Value "$newPath;$currentPath"

        echo "Set the PATH environment variable to:"
        echo "$newPath;$currentPath"

        # From: https://docs.rs/system-deps/6.2.2/system_deps/index.html
        echo "SYSTEM_DEPS_BUILD_INTERNAL=always" >> $env:GITHUB_ENV
        echo "SYSTEM_DEPS_LINK=static" >> $env:GITHUB_ENV

    - name: where gcc 
      run: |

        echo $Env:PATH
        echo $(where gcc)

      # Everything after this step is within the "Developer Command Prompt for Microsoft Visual C++".
      # This is required for dav1d to build correctly, using msvc
    - name: Build the executable
      run: |

        echo $Env:PATH
        # Get-Command gcc

        # ---------------------------------------------------------
        # Remove from the PATH the god damn gcc toolchains and
        # other shit that conflict with building dav1d with msvc

        $pathsToRemove = @("C:\Program Files\Git\bin;", "C:\Program Files\Git\mingw64\bin;", "C:\mingw64\bin;", "C:\Strawberry\c\bin;", "C:\Program Files\LLVM\bin;")

        # Read the content of the file
        $content = $Env:PATH

        # Loop through each path to remove
        foreach ($path in $pathsToRemove) {
          # Remove lines containing the path (case-insensitive)
          $content = $content -ireplace [regex]::Escape("$path"), ""
        }
        # Set-Content -Path $env:GITHUB_PATH -Value $content
        echo "Wrote the following path"
        echo $content
        $Env:PATH = $content

        cargo build --release --features=networking,avif

    - name: Copy executable to distributable folder
      working-directory: ./distribution/windows/
      shell: cmd
      run: |

        mkdir program
        copy /y ..\..\target\release\emulsion.exe program\emulsion.exe
    - name: Create installer
      working-directory: ./distribution/windows/
      shell: pwsh
      run: |

        makensis /DVERSION=$Env:EMULSION_VERSION emulsion.nsi
    - name: Upload Release Asset
      id: upload-release-asset 
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.create_release.outputs.upload_url }} 
        asset_path: ./distribution/windows/Emulsion-Installer.exe
        asset_name: ${{ env.INSTALLER_NAME }}
        asset_content_type: application/octet-stream

  osx:
    needs: create_release
    runs-on: macos-latest
    env:
      INSTALLER_NAME: ${{ format('Emulsion-OSX-{0}.dmg', needs.create_release.outputs.version) }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
    - name: Setup Rust
      uses: dtolnay/rust-toolchain@stable
    - name: Install cargo bundle
      run: cargo install cargo-bundle
    - name: Install avif build dependencies (macOS)
      run: |

        brew install meson ninja nasm
    - name: Setup dav1d (macOS)
      env:
        DAV1D_DIR: dav1d_dir
        LIB_PATH: lib
      run: |

        echo "SYSTEM_DEPS_DAV1D_LINK=static" >> $GITHUB_ENV
        echo "SYSTEM_DEPS_DAV1D_BUILD_INTERNAL=always" >> $GITHUB_ENV

    - name: Create osx app
      run: cargo bundle --release --features=avif
    - name: Install create-dmg
      run: npm install --global create-dmg
    - name: Create .dmg file
      run: ./distribution/macos/create_dmg.sh
    - name: Rename .dmg
      run: mv Emulsion*.dmg Emulsion.dmg
    - name: Upload Release Asset
      id: upload-release-asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.create_release.outputs.upload_url }}
        asset_path: Emulsion.dmg
        asset_name: ${{ env.INSTALLER_NAME }}
        asset_content_type: application/octet-stream

  linux:
    needs: create_release
    runs-on: ubuntu-20.04
    env:
      INSTALLER_NAME: ${{ format('Emulsion-Linux.deb-{0}.deb', needs.create_release.outputs.version) }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
    - name: Setup Rust
      uses: dtolnay/rust-toolchain@stable
    - name: Install cargo bundle
      run: cargo install cargo-bundle
    - name: Install avif build dependencies (linux)
      run: |

        DEBIAN_FRONTEND=noninteractive sudo apt-get update
        DEBIAN_FRONTEND=noninteractive sudo apt-get install -y ninja-build nasm meson
    - name: Setup dav1d - avif dependency (linux)
      env:
        DAV1D_DIR: dav1d_dir
        LIB_PATH: lib/x86_64-linux-gnu
      run: |

        echo "SYSTEM_DEPS_DAV1D_LINK=static" >> $GITHUB_ENV
        echo "SYSTEM_DEPS_DAV1D_BUILD_INTERNAL=always" >> $GITHUB_ENV
    - name: Create deb package
      run: cargo bundle --release --features=avif
    - name: Rename .deb
      run: mv target/release/bundle/deb/*.deb Emulsion.deb
    - name: Upload Release Asset
      id: upload-release-asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.create_release.outputs.upload_url }}
        asset_path: Emulsion.deb
        asset_name: ${{ env.INSTALLER_NAME }}
        asset_content_type: application/octet-stream