loop_cmd 0.1.16

A command-line tool for executing commands across multiple directories
Documentation
name: Release

on:
  push:
    branches:
      - main

permissions:
  contents: write

jobs:
  create_release:
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.get_upload_url.outputs.upload_url }}
      version: ${{ steps.get_version.outputs.version }}
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Set up Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - name: Check for version bump
        id: check_version
        run: |
          # Get the current version from Cargo.toml
          current_version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
          echo "Current version: $current_version"

          # Get the last version before the PR
          git checkout $(git rev-list -n 1 HEAD^)
          previous_version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
          echo "Previous version: $previous_version"

          # Compare versions
          if [ "$current_version" != "$previous_version" ]; then
            echo "Version was already bumped in PR"
            echo "::set-output name=bumped::true"
          else
            echo "Version was not bumped in PR"
            echo "::set-output name=bumped::false"
          fi

          # Return to the current commit
          git checkout -

      - name: Bump version
        if: steps.check_version.outputs.bumped == 'false'
        run: |
          ./bump_version.sh patch
          cargo update --package loop_cmd
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add Cargo.toml Cargo.lock
          git commit -m "Bump version to $(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')"
          git push
        shell: bash

      - name: Verify version update
        run: |
          toml_version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
          lock_version=$(grep '^name = "loop_cmd"' -A 2 Cargo.lock | grep 'version =' | sed -E 's/version = "(.*)"/\1/')
          echo "Cargo.toml version: $toml_version"
          echo "Cargo.lock version: $lock_version"
          if [ "$toml_version" != "$lock_version" ]; then
            echo "Error: Version mismatch between Cargo.toml and Cargo.lock"
            exit 1
          fi
        shell: bash

      - name: Get version
        id: get_version
        run: |
          version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
          echo "Version from Cargo.toml: $version"
          if [ -z "$version" ]; then
            echo "Error: Unable to extract version from Cargo.toml"
            exit 1
          fi
          echo "version=$version" >> $GITHUB_OUTPUT
        shell: bash

      - name: Verify version
        run: |
          echo "Extracted version: ${{ steps.get_version.outputs.version }}"
          if [ "${{ steps.get_version.outputs.version }}" = "v" ]; then
            echo "Error: Version extraction failed. Got 'v' instead of a proper version number."
            exit 1
          fi
        shell: bash

      - name: Check existing release
        id: check_release
        run: |
          release_id=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
            "https://api.github.com/repos/${{ github.repository }}/releases/tags/v${{ steps.get_version.outputs.version }}" \
            | jq -r '.id')
          if [ "$release_id" != "null" ]; then
            echo "release_id=$release_id" >> $GITHUB_OUTPUT
            echo "release_exists=true" >> $GITHUB_OUTPUT
          else
            echo "release_exists=false" >> $GITHUB_OUTPUT
          fi
        shell: bash

      - name: Create Release
        id: create_release
        if: steps.check_release.outputs.release_exists == 'false'
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: v${{ steps.get_version.outputs.version }}
          release_name: Release v${{ steps.get_version.outputs.version }}
          draft: false
          prerelease: false

      - name: Get Release Upload URL
        id: get_upload_url
        run: |
          if [ "${{ steps.check_release.outputs.release_exists }}" == "true" ]; then
            upload_url=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
              "https://api.github.com/repos/${{ github.repository }}/releases/${{ steps.check_release.outputs.release_id }}" \
              | jq -r '.upload_url')
          else
            upload_url="${{ steps.create_release.outputs.upload_url }}"
          fi
          echo "upload_url=$upload_url" >> $GITHUB_OUTPUT

  build_linux:
    needs: create_release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          ref: main
      - name: Set up Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - name: Build for Linux (x86_64)
        run: |
          rustup target add x86_64-unknown-linux-musl
          cargo build --release --target x86_64-unknown-linux-musl

      - name: Upload Linux (x86_64) 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: ./target/x86_64-unknown-linux-musl/release/loop
          asset_name: loop-linux-x86_64
          asset_content_type: application/octet-stream

  build_macos:
    needs: create_release
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
        with:
          ref: main
      - name: Set up Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - name: Build for macOS (x86_64)
        run: |
          rustup target add x86_64-apple-darwin
          cargo build --release --target x86_64-apple-darwin

      - name: Upload macOS (x86_64) 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: ./target/x86_64-apple-darwin/release/loop
          asset_name: loop-darwin-x86_64
          asset_content_type: application/octet-stream

      - name: Build for macOS (ARM64)
        run: |
          rustup target add aarch64-apple-darwin
          cargo build --release --target aarch64-apple-darwin

      - name: Upload macOS (ARM64) 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: ./target/aarch64-apple-darwin/release/loop
          asset_name: loop-darwin-arm64
          asset_content_type: application/octet-stream

  build_windows:
    needs: create_release
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v3
        with:
          ref: main
      - name: Set up Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true

      - name: Build for Windows (x86_64)
        run: |
          cargo build --release

      - name: Upload Windows (x86_64) 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: ./target/release/loop.exe
          asset_name: loop-windows-x86_64.exe
          asset_content_type: application/vnd.microsoft.portable-executable