name: common_cocoapods

permissions:
  contents: read

on:
  workflow_call:
    # Re-usable workflows do not automatically inherit the caller's secrets.
    #
    # If the calling workflow uses a secret in the `setup_command` input, then
    # it also must pass the secret to the re-usable workflow.
    #
    # Example:
    #
    #   pod_lib_lint:
    #     uses: ./.github/workflows/common_cocoapods.yml
    #     with:
    #       product: FirebaseFoo
    #       setup_command: |
    #         scripts/decrypt_gha_secret.sh \
    #           /path/to/GoogleService-Info.plist.gpg \
    #           /path/to/dest/GoogleService-Info.plist "$plist_secret"
    #     secrets:
    #       plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
    #
    secrets:
      plist_secret:
        required: false

    inputs:
      # The product to test be tested (e.g. `FirebaseABTesting`).
      product:
        type: string
        required: true

      # The platforms to build on. Defaults to all.
      # To target specific platforms, pass a comma or space separated string of
      # platforms.
      #
      # Examples:
      # - build/test only for macOS: `macOS`
      # - build/test only for macOS and tvOS: `macOS, tvOS`
      platforms:
        type: string
        required: false
        default: "iOS, tvOS, macOS, watchOS"

      # By default, all platforms will be tested (see matrix in `spm` job).
      # To build instead of test, pass a comma or space separated string of
      # platforms.
      #
      # Platform options: [iOS, tvOS, macOS, watchOS, catalyst, visionOS]
      #
      # Note: Build-only platforms must be represented in the `platforms` input
      # (which defaults to all platforms) in order to take effect.
      #
      # Examples:
      # - build only for macOS: `macOS`
      # - build only for macOS and tvOS: `macOS, tvOS`
      # - build only for all platforms: `all`
      buildonly_platforms:
       type: string
       required: false
       default: ""

      # Whether to lint with `--allow-warnings`. Defaults to false.
      allow_warnings:
        type: boolean
        required: false
        default: false

      # Whether to lint with `--analyze`. Defaults to true.
      analyze:
        type: boolean
        required: false
        default: true

      # Whether to lint with `--verbose`. Defaults to false.
      verbose:
        type: boolean
        required: false
        default: false

      # Whether to additionally build with Swift 6. Defaults to false.
      supports_swift6:
        type: boolean
        required: false
        default: false

      # A comma separated (no spaces) string that will be passed to
      # pod lib lint's `--test-specs=` argument. By default, all
      # test specs will be tested.
      test_specs:
       type: string
       required: false
       default: ""

      # A command to execute before testing.
      #
      # This is useful for additional set up, like starting an emulator or
      # downloading test data.
      #
      # Note, this step has an env var set to decrypt plists. Use
      # "$plist_secret" in the given command. See `secrets` documentation
      # at top of this file.
      #
      # Example: `FirebaseFunctions/Backend/start.sh synchronous`
      setup_command:
        type: string
        required: false
        default: ""

      # The timeout (in minutes) for the linting to complete. Defaults to 15.
      timeout_minutes:
        type: number
        required: false
        default: 15

jobs:
  pod-lib-lint:
    # Run on the main repo's scheduled jobs or pull requests and manual workflow invocations.
    if: (github.repository == 'firebase/firebase-ios-sdk' && github.event_name == 'schedule') || contains(fromJSON('["pull_request", "workflow_dispatch"]'), github.event_name)
    strategy:
      matrix:
        os: [macos-15]
        xcode: [Xcode_16.4]
        platform: [iOS, tvOS, macOS, watchOS]
        include:
          - os: macos-14
            xcode: Xcode_16.2
            platform: iOS
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Setup Bundler
      run: scripts/setup_bundler.sh
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
    - name: Set conditional environment variable, if needed.
      if: inputs.product == 'FirebaseAuth'
      run: echo "FIREBASE_CI=true" >> $GITHUB_ENV
    - name: Set podspec Swift version to 6.0, if supported.
      if: inputs.supports_swift6 == true && matrix.os != 'macos-14'
      run: sed -i "" "s/s.swift_version[[:space:]]*=[[:space:]]*'5.9'/s.swift_version = '6.0'/" ${{ inputs.product }}.podspec
    - name: Run setup command, if needed.
      if: inputs.setup_command != ''
      env:
        plist_secret: ${{ secrets.plist_secret }}
      run: ${{ inputs.setup_command }}
    - uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3
      if: contains(join(inputs.platforms), matrix.platform) || matrix.os == 'macos-14'
      with:
        timeout_minutes: ${{ inputs.timeout_minutes }}
        max_attempts: 3
        retry_wait_seconds: 120
        command: |
          scripts/pod_lib_lint.rb ${{ inputs.product }}.podspec --platforms=${{ matrix.platform }} \
            ${{ inputs.allow_warnings == true && '--allow-warnings' || '' }} \
            ${{ inputs.verbose == true && '--verbose' || '' }} \
            ${{ inputs.analyze == false && '--no-analyze' || '' }} \
            ${{ inputs.test_specs != '' && format('--test-specs={0}', inputs.test_specs) || '' }} \
            ${{ (contains(inputs.buildonly_platforms, matrix.platform) || contains(inputs.buildonly_platforms, 'all')) && '--skip-tests' || '' }}
