cc-switch 0.1.21

A CLI tool for managing multiple Claude API configurations and automatically switching between them
Documentation
name: Update Homebrew Formula

on:
  release:
    types: [published]
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to update (e.g., 0.0.28)'
        required: true
        type: string

env:
  CARGO_TERM_COLOR: always

permissions:
  contents: write

jobs:
  update-formula:
    name: Update Homebrew Formula
    runs-on: ubuntu-latest
    if: github.event_name == 'release' || github.event_name == 'workflow_dispatch'
    permissions:
      contents: write

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

    - name: Extract version from tag
      id: version
      run: |
        if [ "${{ github.event_name }}" = "release" ]; then
          # Extract version from release tag name
          VERSION="${{ github.event.release.tag_name }}"
          VERSION="${VERSION#v}"  # Remove 'v' prefix if present
        else
          VERSION="${{ github.event.inputs.version }}"
        fi
        echo "version=$VERSION" >> $GITHUB_OUTPUT
        echo "Extracted version: $VERSION"

    - name: Wait for release assets with verification
      run: |
        echo "Waiting for release assets to be available..."
        VERSION="${{ steps.version.outputs.version }}"
        BASE_URL="https://github.com/Linuxdazhao/cc_auto_switch/releases/download/v${VERSION}"
        
        # Define all files to check
        FILES=(
          "cc-switch-x86_64-apple-darwin.tar.gz"
          "cc-switch-aarch64-apple-darwin.tar.gz"
          "cc-switch-x86_64-unknown-linux-gnu.tar.gz"
          "cc-switch-aarch64-unknown-linux-gnu.tar.gz"
        )
        
        # Wait up to 10 minutes for all files to be available
        MAX_ATTEMPTS=60
        SLEEP_TIME=10
        
        for attempt in $(seq 1 $MAX_ATTEMPTS); do
          echo "Attempt $attempt/$MAX_ATTEMPTS - Checking file availability..."
          all_available=true
          
          for file in "${FILES[@]}"; do
            url="${BASE_URL}/${file}"
            if ! curl -sSL --fail --head "$url" > /dev/null 2>&1; then
              echo "File not yet available: $file"
              all_available=false
              break
            fi
          done
          
          if [ "$all_available" = true ]; then
            echo "All files are now available!"
            break
          fi
          
          if [ $attempt -eq $MAX_ATTEMPTS ]; then
            echo "ERROR: Not all files became available within the timeout period"
            exit 1
          fi
          
          echo "Waiting ${SLEEP_TIME} seconds before next check..."
          sleep $SLEEP_TIME
        done

    - name: Download and calculate checksums
      id: checksums
      run: |
        VERSION="${{ steps.version.outputs.version }}"
        BASE_URL="https://github.com/Linuxdazhao/cc_auto_switch/releases/download/v${VERSION}"
        
        # Function to download and calculate checksum with retry
        calculate_sha() {
          local filename=$1
          local max_retries=3
          local retry=0
          
          while [ $retry -lt $max_retries ]; do
            echo "Downloading $filename (attempt $((retry + 1))/$max_retries)" >&2
            
            # Download file with verbose error reporting
            if curl -sSL --fail --max-time 60 \
                   --retry 3 --retry-delay 5 --retry-max-time 300 \
                   "${BASE_URL}/${filename}" -o "${filename}"; then
              
              # Verify file was downloaded and has content
              if [ -s "${filename}" ]; then
                local sha=$(sha256sum "${filename}" | cut -d' ' -f1)
                echo "Successfully calculated SHA256 for $filename: $sha" >&2
                echo "$sha"
                rm -f "${filename}"  # Clean up
                return 0
              else
                echo "ERROR: Downloaded file is empty: $filename" >&2
              fi
            else
              echo "ERROR: Failed to download $filename (HTTP error or timeout)" >&2
            fi
            
            retry=$((retry + 1))
            if [ $retry -lt $max_retries ]; then
              echo "Retrying in 10 seconds..." >&2
              sleep 10
            fi
          done
          
          echo "ERROR: Failed to download $filename after $max_retries attempts" >&2
          return 1
        }
        
        # Calculate checksums for all platforms
        echo "Calculating SHA256 checksums for all platforms..."
        
        MAC_INTEL_SHA=$(calculate_sha "cc-switch-x86_64-apple-darwin.tar.gz")
        if [ $? -ne 0 ]; then exit 1; fi
        
        MAC_ARM_SHA=$(calculate_sha "cc-switch-aarch64-apple-darwin.tar.gz")
        if [ $? -ne 0 ]; then exit 1; fi
        
        LINUX_INTEL_SHA=$(calculate_sha "cc-switch-x86_64-unknown-linux-gnu.tar.gz")
        if [ $? -ne 0 ]; then exit 1; fi
        
        LINUX_ARM_SHA=$(calculate_sha "cc-switch-aarch64-unknown-linux-gnu.tar.gz")
        if [ $? -ne 0 ]; then exit 1; fi
        
        # Set outputs with validation
        echo "Setting GitHub outputs..."
        echo "mac_intel_sha=$MAC_INTEL_SHA" >> $GITHUB_OUTPUT
        echo "mac_arm_sha=$MAC_ARM_SHA" >> $GITHUB_OUTPUT
        echo "linux_intel_sha=$LINUX_INTEL_SHA" >> $GITHUB_OUTPUT
        echo "linux_arm_sha=$LINUX_ARM_SHA" >> $GITHUB_OUTPUT
        
        # Display summary
        echo "=== SHA256 Checksums Summary ==="
        echo "macOS Intel (x86_64): $MAC_INTEL_SHA"
        echo "macOS ARM (aarch64):  $MAC_ARM_SHA"
        echo "Linux Intel (x86_64): $LINUX_INTEL_SHA"
        echo "Linux ARM (aarch64):  $LINUX_ARM_SHA"

    - name: Checkout tap repository
      uses: actions/checkout@v4
      with:
        repository: Linuxdazhao/homebrew-cc-switch
        token: ${{ secrets.HOMEBREW_TAP_TOKEN || secrets.GITHUB_TOKEN }}
        path: homebrew-cc-switch

    - name: Update formula
      run: |
        cd homebrew-cc-switch
        VERSION="${{ steps.version.outputs.version }}"

        # Copy template and replace placeholders
        cp ../.github/workflows/formula-template.rb Formula/cc-switch.rb
        sed -i "s/__VERSION__/${VERSION}/g" Formula/cc-switch.rb
        sed -i "s/__MAC_ARM_SHA__/${{ steps.checksums.outputs.mac_arm_sha }}/g" Formula/cc-switch.rb
        sed -i "s/__MAC_INTEL_SHA__/${{ steps.checksums.outputs.mac_intel_sha }}/g" Formula/cc-switch.rb
        sed -i "s/__LINUX_ARM_SHA__/${{ steps.checksums.outputs.linux_arm_sha }}/g" Formula/cc-switch.rb
        sed -i "s/__LINUX_INTEL_SHA__/${{ steps.checksums.outputs.linux_intel_sha }}/g" Formula/cc-switch.rb

        echo "Updated formula content:"
        cat Formula/cc-switch.rb

    - name: Commit and push changes
      run: |
        cd homebrew-cc-switch
        git config --global user.name "github-actions[bot]"
        git config --global user.email "github-actions[bot]@users.noreply.github.com"
        
        git add Formula/cc-switch.rb
        git commit -m "Update cc-switch to v${{ steps.version.outputs.version }}

        - Update version to ${{ steps.version.outputs.version }}
        - Update SHA256 checksums for all platforms
        
        🤖 Auto-updated by GitHub Actions"
        
        git push origin main