isomage 0.4.0

Browse and extract files from ISO images without mounting them
Documentation
name: Release

on:
  push:
    tags: ["v*"]

permissions:
  contents: write

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: macos-latest
            target: aarch64-apple-darwin
            artifact: isomage-macos-arm64
          - os: macos-latest
            target: x86_64-apple-darwin
            artifact: isomage-macos-x86_64
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            artifact: isomage-linux-x86_64
          - os: ubuntu-latest
            target: aarch64-unknown-linux-musl
            artifact: isomage-linux-arm64
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}
      - name: Install musl tools (Linux x86_64)
        if: matrix.target == 'x86_64-unknown-linux-musl'
        run: |
          sudo apt-get update
          sudo apt-get install -y musl-tools
      - name: Install musl tools (Linux arm64)
        if: matrix.target == 'aarch64-unknown-linux-musl'
        run: |
          sudo apt-get update
          sudo apt-get install -y gcc-aarch64-linux-gnu musl-tools
          echo '[target.aarch64-unknown-linux-musl]' >> ~/.cargo/config.toml
          echo 'linker = "aarch64-linux-gnu-gcc"' >> ~/.cargo/config.toml
      - name: Build
        run: cargo build --release --target ${{ matrix.target }}
      - name: Package
        run: |
          cp target/${{ matrix.target }}/release/isomage ${{ matrix.artifact }}
          chmod +x ${{ matrix.artifact }}
          tar czf ${{ matrix.artifact }}.tar.gz ${{ matrix.artifact }}
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.artifact }}
          path: ${{ matrix.artifact }}.tar.gz

  release:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          merge-multiple: true
      - name: Create checksums
        run: sha256sum *.tar.gz > checksums.txt
      - name: Create release
        uses: softprops/action-gh-release@v2
        with:
          generate_release_notes: true
          files: |
            *.tar.gz
            checksums.txt

  publish-crate:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Publish to crates.io
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  update-homebrew:
    needs: release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          merge-multiple: true
      - name: Compute SHA256s
        id: sha
        run: |
          echo "macos_arm64=$(sha256sum isomage-macos-arm64.tar.gz | cut -d' ' -f1)" >> $GITHUB_OUTPUT
          echo "macos_x86_64=$(sha256sum isomage-macos-x86_64.tar.gz | cut -d' ' -f1)" >> $GITHUB_OUTPUT
          echo "linux_x86_64=$(sha256sum isomage-linux-x86_64.tar.gz | cut -d' ' -f1)" >> $GITHUB_OUTPUT
          echo "linux_arm64=$(sha256sum isomage-linux-arm64.tar.gz | cut -d' ' -f1)" >> $GITHUB_OUTPUT
      - name: Update Homebrew formula
        env:
          HOMEBREW_TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
          TAG: ${{ github.ref_name }}
        run: |
          git clone https://x-access-token:${HOMEBREW_TAP_TOKEN}@github.com/JackDanger/homebrew-tap.git
          cd homebrew-tap
          cat > Formula/isomage.rb << RUBY
          class Isomage < Formula
            desc "Browse and extract files from ISO images without mounting them"
            homepage "https://github.com/JackDanger/isomage"
            license "MIT"
            version "${TAG#v}"

            on_macos do
              if Hardware::CPU.arm?
                url "https://github.com/JackDanger/isomage/releases/download/${TAG}/isomage-macos-arm64.tar.gz"
                sha256 "${{ steps.sha.outputs.macos_arm64 }}"
              else
                url "https://github.com/JackDanger/isomage/releases/download/${TAG}/isomage-macos-x86_64.tar.gz"
                sha256 "${{ steps.sha.outputs.macos_x86_64 }}"
              end
            end

            on_linux do
              if Hardware::CPU.arm?
                url "https://github.com/JackDanger/isomage/releases/download/${TAG}/isomage-linux-arm64.tar.gz"
                sha256 "${{ steps.sha.outputs.linux_arm64 }}"
              else
                url "https://github.com/JackDanger/isomage/releases/download/${TAG}/isomage-linux-x86_64.tar.gz"
                sha256 "${{ steps.sha.outputs.linux_x86_64 }}"
              end
            end

            def install
              Dir.glob("isomage-*").each do |f|
                bin.install f => "isomage"
              end
            end

            test do
              assert_match "isomage", shell_output("#{bin}/isomage --version")
            end
          end
          RUBY
          git config user.email "github@jackdanger.com"
          git config user.name "Jack Danger"
          git add Formula/isomage.rb
          git commit -m "isomage ${TAG}"
          git push