syntext 1.0.0

Hybrid code search index for agent workflows
Documentation
name: Release

on:
  push:
    tags:
      - 'v[0-9]*'

jobs:
  build-linux:
    name: Linux ${{ matrix.deb_arch }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: x86_64-unknown-linux-gnu
            deb_arch: amd64
          - target: aarch64-unknown-linux-gnu
            deb_arch: arm64
    steps:
      - uses: actions/checkout@v5

      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.target }}

      - name: Install cross
        run: cargo install cross --git https://github.com/cross-rs/cross

      - name: Install cargo-deb
        if: matrix.target == 'x86_64-unknown-linux-gnu'
        run: cargo install cargo-deb

      - name: Build binary
        run: cross build --release --target ${{ matrix.target }}

      - name: Stage binary and deb
        env:
          TARGET: ${{ matrix.target }}
          DEB_ARCH: ${{ matrix.deb_arch }}
          VERSION: ${{ github.ref_name }}
        run: |
          VER="${VERSION#v}"
          mkdir -p dist
          cp "target/${TARGET}/release/st" "dist/st-${VER}-linux-${DEB_ARCH}"
          if [ "${TARGET}" = "x86_64-unknown-linux-gnu" ]; then
            cargo deb --no-build --target "${TARGET}" \
              --output "dist/syntext_${VER}_${DEB_ARCH}.deb"
          fi

      - uses: actions/upload-artifact@v4
        with:
          name: linux-${{ matrix.deb_arch }}
          path: dist/

  build-macos:
    name: macOS ${{ matrix.suffix }}
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: aarch64-apple-darwin
            runner: macos-14
            suffix: macos-arm64
          - target: x86_64-apple-darwin
            runner: macos-15-intel
            suffix: macos-x86_64
    steps:
      - uses: actions/checkout@v5

      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - uses: Swatinem/rust-cache@v2
        with:
          key: ${{ matrix.target }}

      - name: Build binary
        run: cargo build --release --target ${{ matrix.target }}

      - name: Stage binary
        env:
          TARGET: ${{ matrix.target }}
          SUFFIX: ${{ matrix.suffix }}
          VERSION: ${{ github.ref_name }}
        run: |
          VER="${VERSION#v}"
          mkdir -p dist
          cp "target/${TARGET}/release/st" "dist/st-${VER}-${SUFFIX}"
          # zip for Homebrew cask; archive must contain a file named "st" so brew links it correctly
          cp "target/${TARGET}/release/st" dist/st
          cd dist && zip "st-${VER}-${SUFFIX}.zip" st && rm st

      - uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.suffix }}
          path: dist/

  build-wasm:
    name: WASM (bundler)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5

      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown

      - uses: Swatinem/rust-cache@v2
        with:
          key: wasm32-unknown-unknown

      - name: Install wasm-pack
        run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

      - name: Build WASM package
        run: wasm-pack build --target bundler -- --features wasm --no-default-features

      - name: Package artifact
        env:
          VERSION: ${{ github.ref_name }}
        run: |
          VER="${VERSION#v}"
          mkdir -p dist
          tar -czf "dist/syntext-wasm-${VER}.tar.gz" -C pkg .

      - uses: actions/upload-artifact@v4
        with:
          name: wasm-bundler
          path: dist/

  release:
    name: Publish GitHub Release
    needs: [build-linux, build-macos, build-wasm]
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/download-artifact@v4
        with:
          path: artifacts/
          merge-multiple: true

      - name: Generate SHA256 checksums
        run: |
          cd artifacts
          sha256sum * > SHA256SUMS
          cat SHA256SUMS

      - uses: softprops/action-gh-release@v2
        with:
          files: artifacts/*
          generate_release_notes: true

  publish-crate:
    name: Publish to crates.io
    needs: [build-linux, build-macos]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5

      - uses: dtolnay/rust-toolchain@stable

      - name: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: cargo publish

  update-homebrew-cask:
    name: Update Homebrew Cask
    needs: [release]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5

      - name: Set version
        id: ver
        run: echo "VER=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"

      - uses: actions/download-artifact@v4
        with:
          name: macos-arm64
          path: zips/arm64/

      - uses: actions/download-artifact@v4
        with:
          name: macos-x86_64
          path: zips/x86_64/

      - name: Compute SHA256
        id: sha
        run: |
          VER="${{ steps.ver.outputs.VER }}"
          ARM_SHA=$(sha256sum "zips/arm64/st-${VER}-macos-arm64.zip" | awk '{print $1}')
          X86_SHA=$(sha256sum "zips/x86_64/st-${VER}-macos-x86_64.zip" | awk '{print $1}')
          echo "arm=${ARM_SHA}" >> "$GITHUB_OUTPUT"
          echo "x86=${X86_SHA}" >> "$GITHUB_OUTPUT"

      - uses: actions/checkout@v5
        with:
          repository: whit3rabbit/homebrew-tap
          token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
          path: homebrew-tap

      - name: Generate cask
        env:
          VER: ${{ steps.ver.outputs.VER }}
          ARM: ${{ steps.sha.outputs.arm }}
          X86: ${{ steps.sha.outputs.x86 }}
        run: |
          chmod +x scripts/render_homebrew_cask.sh
          scripts/render_homebrew_cask.sh \
            packaging/homebrew/Casks/syntext.rb \
            homebrew-tap/Casks/syntext.rb \
            "${VER}" \
            "${ARM}" \
            "${X86}"
          ruby -c homebrew-tap/Casks/syntext.rb

      - name: Commit and push cask
        working-directory: homebrew-tap
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add Casks/syntext.rb
          git diff --cached --quiet && echo "No changes" && exit 0
          git commit -m "Update syntext cask to ${{ steps.ver.outputs.VER }}"
          git push origin main