name: setup-bazel-ci
description: Prepare a Bazel CI runner with shared caches and optional test prerequisites.
inputs:
  target:
    description: Target triple used for cache namespacing.
    required: true
  install-test-prereqs:
    description: Install DotSlash for Bazel-backed test jobs.
    required: false
    default: "false"
outputs:
  repository-cache-path:
    description: Filesystem path used for the Bazel repository cache.
    value: ${{ steps.configure_bazel_repository_cache.outputs.repository-cache-path }}

runs:
  using: composite
  steps:
    # Some integration tests rely on DotSlash being installed.
    # See https://github.com/openai/codex/pull/7617.
    - name: Install DotSlash
      if: inputs.install-test-prereqs == 'true'
      uses: facebook/install-dotslash@1e4e7b3e07eaca387acb98f1d4720e0bee8dbb6a # v2

    - name: Make DotSlash available in PATH (Unix)
      if: inputs.install-test-prereqs == 'true' && runner.os != 'Windows'
      shell: bash
      run: cp "$(which dotslash)" /usr/local/bin

    - name: Make DotSlash available in PATH (Windows)
      if: inputs.install-test-prereqs == 'true' && runner.os == 'Windows'
      shell: pwsh
      run: Copy-Item (Get-Command dotslash).Source -Destination "$env:LOCALAPPDATA\Microsoft\WindowsApps\dotslash.exe"

    - name: Set up Bazel
      uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0

    - name: Configure Bazel repository cache
      id: configure_bazel_repository_cache
      shell: pwsh
      run: |
        # Keep the repository cache under HOME on all runners. Windows `D:\a`
        # cache paths match `.bazelrc`, but `actions/cache/restore` currently
        # returns HTTP 400 for that path in the Windows clippy job.
        $repositoryCachePath = Join-Path $HOME '.cache/bazel-repo-cache'
        "repository-cache-path=$repositoryCachePath" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
        "BAZEL_REPOSITORY_CACHE=$repositoryCachePath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

    - name: Configure Bazel output root (Windows)
      if: runner.os == 'Windows'
      shell: pwsh
      run: |
        # Use the shortest available drive to reduce argv/path length issues,
        # but avoid the drive root because some Windows test launchers mis-handle
        # MANIFEST paths there.
        $hasDDrive = Test-Path 'D:\'
        $bazelOutputUserRoot = if ($hasDDrive) { 'D:\b' } else { 'C:\b' }
        $repoContentsCache = Join-Path $env:RUNNER_TEMP "bazel-repo-contents-cache-$env:GITHUB_RUN_ID-$env:GITHUB_JOB"
        "BAZEL_OUTPUT_USER_ROOT=$bazelOutputUserRoot" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
        "BAZEL_REPO_CONTENTS_CACHE=$repoContentsCache" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

    - name: Expose MSVC SDK environment (Windows)
      if: runner.os == 'Windows'
      shell: pwsh
      run: |
        # Bazel exec-side Rust build scripts do not reliably inherit the MSVC developer
        # shell on GitHub-hosted Windows runners, so discover the latest VS install and
        # ask `VsDevCmd.bat` to materialize the x64/x64 compiler + SDK environment.
        $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
        if (-not (Test-Path $vswhere)) {
          throw "vswhere.exe not found"
        }

        $installPath = & $vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath 2>$null
        if (-not $installPath) {
          throw "Could not locate a Visual Studio installation with VC tools"
        }

        $vsDevCmd = Join-Path $installPath 'Common7\Tools\VsDevCmd.bat'
        if (-not (Test-Path $vsDevCmd)) {
          throw "VsDevCmd.bat not found at $vsDevCmd"
        }

        # Keep the export surface explicit: these are the paths and SDK roots that the
        # MSVC toolchain probes need later when Bazel runs Windows exec-platform build
        # scripts such as `aws-lc-sys`.
        $varsToExport = @(
          'INCLUDE',
          'LIB',
          'LIBPATH',
          'PATH',
          'UCRTVersion',
          'UniversalCRTSdkDir',
          'VCINSTALLDIR',
          'VCToolsInstallDir',
          'WindowsLibPath',
          'WindowsSdkBinPath',
          'WindowsSdkDir',
          'WindowsSDKLibVersion',
          'WindowsSDKVersion'
        )

        # `VsDevCmd.bat` is a batch file, so invoke it under `cmd.exe`, suppress its
        # banner, then dump the resulting environment with `set`. Re-export only the
        # approved keys into `GITHUB_ENV` so later steps inherit the same MSVC context.
        $envLines = & cmd.exe /c ('"{0}" -no_logo -arch=x64 -host_arch=x64 >nul && set' -f $vsDevCmd)
        foreach ($line in $envLines) {
          if ($line -notmatch '^(.*?)=(.*)$') {
            continue
          }

          $name = $matches[1]
          $value = $matches[2]
          if ($varsToExport -contains $name) {
            "$name=$value" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
          }
        }

    - name: Compute cache-stable Windows Bazel PATH
      if: runner.os == 'Windows'
      shell: pwsh
      run: ./.github/scripts/compute-bazel-windows-path.ps1

    - name: Enable Git long paths (Windows)
      if: runner.os == 'Windows'
      shell: pwsh
      run: git config --global core.longpaths true
