treadlers 0.1.0

A Rust library for controlling Treadly treadmills via Bluetooth Low Energy
Documentation
name: Release

on:
  push:
    branches: [ master ]
    tags: [ 'v*' ]

env:
  CARGO_TERM_COLOR: always

permissions:
  contents: write
  issues: write
  pull-requests: write

jobs:
  check-version:
    name: Check Version
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.version.outputs.version }}
      version-changed: ${{ steps.version.outputs.changed }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      with:
        fetch-depth: 0
        
    - name: Get version from Cargo.toml
      id: version
      run: |
        VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
        echo "version=${VERSION}" >> $GITHUB_OUTPUT
        
        # Check if version changed since last release
        if git tag -l "v${VERSION}" | grep -q "v${VERSION}"; then
          echo "changed=false" >> $GITHUB_OUTPUT
        else
          echo "changed=true" >> $GITHUB_OUTPUT
        fi

  pre-release-checks:
    name: Pre-Release Checks
    runs-on: ubuntu-latest
    needs: check-version
    if: needs.check-version.outputs.version-changed == 'true'
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      
    - name: Install system dependencies
      run: |
        sudo apt-get update
        sudo apt-get install -y libdbus-1-dev pkg-config libudev-dev
      
    - name: Install Rust toolchain
      uses: dtolnay/rust-toolchain@stable
      
    - name: Cache dependencies
      uses: Swatinem/rust-cache@v2
      
    - name: Check formatting
      run: cargo fmt -- --check
      
    - name: Run Clippy
      run: cargo clippy --all-targets --all-features -- -D warnings
      
    - name: Run tests
      run: cargo test --verbose
      
    - name: Run doctests
      run: cargo test --doc --verbose
      
    - name: Check documentation
      run: cargo doc --no-deps --document-private-items --all-features
      env:
        RUSTDOCFLAGS: -D warnings
        
    - name: Dry run publish
      run: cargo publish --dry-run --token ${{ secrets.CRATES_IO_TOKEN }}

  create-release:
    name: Create Release
    runs-on: ubuntu-latest
    needs: [check-version, pre-release-checks]
    if: needs.check-version.outputs.version-changed == 'true'
    outputs:
      version: ${{ needs.check-version.outputs.version }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      with:
        fetch-depth: 0
        
    - name: Generate changelog
      id: changelog
      run: |
        # Generate changelog from git commits since last tag
        LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
        if [ -z "$LAST_TAG" ]; then
          CHANGELOG=$(git log --pretty=format:"- %s" --no-merges)
        else
          CHANGELOG=$(git log ${LAST_TAG}..HEAD --pretty=format:"- %s" --no-merges)
        fi
        
        # Save changelog to file for GitHub release
        echo "## Changes" > CHANGELOG.md
        echo "" >> CHANGELOG.md
        echo "$CHANGELOG" >> CHANGELOG.md
        
        # Set output for later use
        echo "changelog<<EOF" >> $GITHUB_OUTPUT
        echo "$CHANGELOG" >> $GITHUB_OUTPUT
        echo "EOF" >> $GITHUB_OUTPUT
        
    - name: Create GitHub Release
      id: create_release
      uses: softprops/action-gh-release@v2
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: v${{ needs.check-version.outputs.version }}
        name: Release v${{ needs.check-version.outputs.version }}
        body_path: CHANGELOG.md
        draft: false
        prerelease: false

  publish-crates:
    name: Publish to Crates.io
    runs-on: ubuntu-latest
    needs: [check-version, create-release]
    if: needs.check-version.outputs.version-changed == 'true'
    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      
    - name: Install system dependencies
      run: |
        sudo apt-get update
        sudo apt-get install -y libdbus-1-dev pkg-config libudev-dev
      
    - name: Install Rust toolchain
      uses: dtolnay/rust-toolchain@stable
      
    - name: Cache dependencies
      uses: Swatinem/rust-cache@v2
      
    - name: Publish to crates.io
      run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}