bfree 0.1.1

A better free, human by default
Documentation
name: Release

on:
  workflow_dispatch:

permissions:
  contents: write

jobs:
  release:
    name: Create GitHub Release
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Read version from Cargo.toml
        id: cargo_version
        run: |
          VERSION=$(grep -m1 '^version = "' Cargo.toml | sed -E 's/version = "([^"]+)"/\1/')
          if [[ -z "$VERSION" ]]; then
            echo "Could not read version from Cargo.toml"
            exit 1
          fi
          if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            echo "Invalid Cargo.toml version: $VERSION"
            echo "Expected format: MAJOR.MINOR.PATCH (example: 0.1.0)"
            exit 1
          fi
          echo "version=$VERSION" >> "$GITHUB_OUTPUT"

      - name: Fail if release tag already exists
        env:
          TAG: v${{ steps.cargo_version.outputs.version }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          if gh release view "$TAG" >/dev/null 2>&1; then
            echo "Release already exists for tag: $TAG"
            exit 1
          fi

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo artifacts
        uses: Swatinem/rust-cache@v2

      - name: Run tests
        run: cargo test --all-targets --all-features

      - name: Build release assets
        run: cargo build --release

      - name: Create GitHub Release + upload assets
        uses: softprops/action-gh-release@v2
        with:
          tag_name: v${{ steps.cargo_version.outputs.version }}
          generate_release_notes: true
          files: |
            target/release/bfree
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Setup SSH agent for AUR
        uses: webfactory/ssh-agent@v0.9.0
        with:
          ssh-private-key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}

      - name: Add AUR host key
        run: |
          mkdir -p ~/.ssh
          ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts

      - name: Clone AUR repo
        run: git clone ssh://aur@aur.archlinux.org/bfree.git aur-bfree

      - name: Update PKGBUILD and .SRCINFO
        working-directory: aur-bfree
        env:
          VERSION: ${{ steps.cargo_version.outputs.version }}
          GH_REPO: ${{ github.repository }}
        run: |
          TAG="v${VERSION}"
          SRC_URL="https://github.com/${GH_REPO}/archive/refs/tags/${TAG}.tar.gz"

          curl -L --fail -o source.tar.gz "${SRC_URL}"
          SHA256="$(sha256sum source.tar.gz | awk '{print $1}')"

          cat > PKGBUILD <<EOF
          pkgname=bfree
          pkgver=${VERSION}
          pkgrel=1
          pkgdesc="A better free, human by default"
          arch=('x86_64')
          url="https://github.com/${GH_REPO}"
          license=('MIT')
          depends=('glibc')
          makedepends=('cargo')
          source=("${SRC_URL}")
          sha256sums=('${SHA256}')

          build() {
            cd "\${srcdir}/bfree-\${pkgver}"
            cargo build --release --locked
          }

          package() {
            cd "\${srcdir}/bfree-\${pkgver}"
            install -Dm755 target/release/bfree "\${pkgdir}/usr/bin/bfree"
            install -Dm644 README.md "\${pkgdir}/usr/share/doc/\${pkgname}/README.md"
          }
          EOF

          cat > .SRCINFO <<EOF
          pkgbase = bfree
            pkgdesc = A better free, human by default
            pkgver = ${VERSION}
            pkgrel = 1
            url = https://github.com/${GH_REPO}
            arch = x86_64
            license = MIT
            makedepends = cargo
            depends = glibc
            source = ${SRC_URL}
            sha256sums = ${SHA256}

          pkgname = bfree
          EOF

      - name: Commit and push AUR changes
        working-directory: aur-bfree
        env:
          VERSION: ${{ steps.cargo_version.outputs.version }}
          AUR_NAME: ${{ secrets.AUR_NAME }}
          AUR_EMAIL: ${{ secrets.AUR_EMAIL }}
        run: |
          git config user.name "${AUR_NAME:-github-actions[bot]}"
          git config user.email "${AUR_EMAIL:-41898282+github-actions[bot]@users.noreply.github.com}"

          git add PKGBUILD .SRCINFO
          if git diff --cached --quiet; then
            echo "No AUR metadata changes to push."
            exit 0
          fi
          git commit -m "release: v${VERSION}"
          git push