git-delta 0.19.2

A syntax-highlighting pager for git
name: Continuous Deployment

on:
  push:
    tags:
      - '[0-9]+.[0-9]+.[0-9]+'

jobs:
  publish:
    name: Publishing for ${{ matrix.job.os }}
    runs-on: ${{ matrix.job.os }}
    strategy:
      matrix:
        job:
          - os: macos-latest
            target: aarch64-apple-darwin
            use-cross: false
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            use-cross: false
          - os: ubuntu-22.04
            target: x86_64-unknown-linux-gnu
            use-cross: false
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            use-cross: true
          - os: ubuntu-22.04
            target: i686-unknown-linux-gnu
            use-cross: true
          - os: ubuntu-22.04
            target: arm-unknown-linux-gnueabihf
            use-cross: true
          - os: ubuntu-22.04
            target: aarch64-unknown-linux-gnu
            use-cross: true

    steps:
      - name: Installing Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.job.target }}
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install cross
        if: matrix.job.use-cross
        uses: taiki-e/install-action@v2
        with:
          tool: cross
      - name: Cargo build
        env:
          MACOSX_DEPLOYMENT_TARGET: 10.7
        shell: bash
        run: |
          if [[ "${{ matrix.job.use-cross }}" == "true" ]]; then
            cross build --release --target ${{ matrix.job.target }}
          else
            cargo build --release --target ${{ matrix.job.target }}
          fi

      - name: Install required dependencies
        shell: bash
        run: |
          if [[ ${{ matrix.job.target }} == arm-unknown-linux-gnueabihf ]]; then
              sudo apt update
              sudo apt-get install -y binutils-arm-linux-gnueabihf
          fi
          if [[ ${{ matrix.job.target }} == aarch64-unknown-linux-gnu ]]; then
              sudo apt update
              sudo apt-get install -y binutils-aarch64-linux-gnu
          fi

      - name: Packaging final binary
        shell: bash
        env:
          TARGET: ${{ matrix.job.target }}
          PROJECT_NAME: delta
          PACKAGE_NAME: git-delta
          OS_NAME: ${{ matrix.job.os }}
        run: ./etc/ci/before_deploy.sh

      - name: Releasing assets
        uses: softprops/action-gh-release@v2
        with:
          draft: true
          files: |
            delta-*-${{ matrix.job.target }}.*
            git-delta*.deb
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  verify-release:
    name: Verify release assets
    needs: publish
    runs-on: ubuntu-latest
    env:
      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: Wait for release assets to be available
        run: sleep 10

      - name: Check all expected assets exist
        run: |
          tag="${GITHUB_REF#refs/tags/}"
          expected=(
            "delta-${tag}-aarch64-apple-darwin.tar.gz"
            "delta-${tag}-aarch64-unknown-linux-gnu.tar.gz"
            "delta-${tag}-arm-unknown-linux-gnueabihf.tar.gz"
            "delta-${tag}-i686-unknown-linux-gnu.tar.gz"
            "delta-${tag}-x86_64-pc-windows-msvc.zip"
            "delta-${tag}-x86_64-unknown-linux-gnu.tar.gz"
            "delta-${tag}-x86_64-unknown-linux-musl.tar.gz"
            "git-delta_${tag}_amd64.deb"
            "git-delta_${tag}_arm64.deb"
            "git-delta_${tag}_armhf.deb"
            "git-delta_${tag}_i386.deb"
            "git-delta-musl_${tag}_amd64.deb"
          )
          actual=$(gh release view "$tag" --repo "$GITHUB_REPOSITORY" --json assets -q '.assets[].name' | sort)
          missing=()
          for asset in "${expected[@]}"; do
            if ! echo "$actual" | grep -qxF "$asset"; then
              missing+=("$asset")
            fi
          done
          if [[ ${#missing[@]} -gt 0 ]]; then
            echo "FAIL: missing release assets:"
            printf '  %s\n' "${missing[@]}"
            exit 1
          fi
          echo "All ${#expected[@]} expected assets present."

      - name: Verify .deb installability on Debian 12
        run: |
          tag="${GITHUB_REF#refs/tags/}"
          deb_url="https://github.com/${GITHUB_REPOSITORY}/releases/download/${tag}/git-delta_${tag}_amd64.deb"
          docker run --rm debian:12 bash -c "
            set -e
            apt-get update -qq > /dev/null 2>&1
            apt-get install -y -qq curl > /dev/null 2>&1
            curl -fsSL -o /tmp/delta.deb '$deb_url'
            dpkg -i /tmp/delta.deb
            delta --version
          "

      - name: Verify .deb libc6 dependencies are Debian 12 compatible
        run: |
          tag="${GITHUB_REF#refs/tags/}"
          max_libc="2.36"
          for arch in amd64 arm64 armhf i386; do
            deb_url="https://github.com/${GITHUB_REPOSITORY}/releases/download/${tag}/git-delta_${tag}_${arch}.deb"
            curl -fsSL -o "/tmp/delta-${arch}.deb" "$deb_url"
            depends=$(dpkg-deb -f "/tmp/delta-${arch}.deb" Depends)
            echo "${arch}: ${depends}"
            libc_ver=$(echo "$depends" | grep -oP 'libc6 \(>= \K[0-9.]+')
            if [ "$(printf '%s\n%s' "$libc_ver" "$max_libc" | sort -V | tail -1)" != "$max_libc" ]; then
              echo "FAIL: ${arch} requires libc6 >= ${libc_ver}, but Debian 12 has ${max_libc}"
              exit 1
            fi
          done
          echo "All .deb packages are Debian 12 compatible."

  publish-to-cargo:
    name: Publishing to Cargo
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - run: cargo publish --token ${{ secrets.CARGO_API_KEY }} --allow-dirty

  publish-to-winget:
    name: Publish to WinGet
    runs-on: ubuntu-latest
    needs: publish
    steps:
      - uses: vedantmgoyal2009/winget-releaser@v2
        with:
          identifier: dandavison.delta
          version: ${{ github.ref_name }}
          installers-regex: '-pc-windows-msvc\.zip$'
          token: ${{ secrets.WINGET_TOKEN }}