# GitHub Actions workflow generated by ci/actions-templates/gen-workflows.sh
# Do not edit this file in .github/workflows

name: CI

on:
  merge_group:
  pull_request:
    branches:
      - "*"
  push:
    branches:
      - main
      - stable
  schedule:
    - cron: "30 0 * * 1,3,5" # At 00:30 UTC on Monday, Wednesday, and Friday

jobs:

  # This is ci/actions-templates/windows-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-windows-pr: # job-name skip-main skip-stable
    runs-on: ${{ matrix.os || 'windows-latest' }}
    if: ${{ contains('["pull_request", "merge_group"]', github.event_name) }} # skip-main skip-stable
    env:
      RUSTFLAGS: -Ctarget-feature=+crt-static
      RUST_MIN_STACK: 16777216
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-pc-windows-msvc
          - aarch64-pc-windows-msvc
          - x86_64-pc-windows-gnu
        include:
          - target: x86_64-pc-windows-msvc
            run_tests: YES
          - target: x86_64-pc-windows-gnu
            arch: x86_64
            mingwdir: mingw64
            gcc: x86_64-w64-mingw32-gcc
          - target: aarch64-pc-windows-msvc
            # Architecture of the rustup build that installs Rust in this workflow.
            rustup_arch: aarch64
            os: windows-11-arm
            run_tests: YES
    steps:
      - uses: actions/checkout@v6
        # v2 defaults to a shallow checkout, but we need at least to the previous tag
        with:
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          New-Item "${env:USERPROFILE}\.cargo\registry" -ItemType Directory -Force
          New-Item "${env:USERPROFILE}\.cargo\git" -ItemType Directory -Force
        shell: powershell
      - name: Install NASM
        # Building `aws-lc-rs` for Windows MSVC depends on `NASM`.
        # See: https://aws.github.io/aws-lc-rs/requirements/windows.html
        uses: ilammy/setup-nasm@v1
        if: matrix.mingwdir == ''
      - name: Install mingw
        uses: bwoodsend/setup-winlibs-action@v1
        if: matrix.mingwdir != ''
        with:
          architecture: ${{ matrix.arch }}
      - name: Verify mingw gcc installation
        shell: powershell
        if: matrix.mingwdir != ''
        run: |
          Get-Command ${{ matrix.gcc }}
          ${{ matrix.gcc }} --version
      - name: Set PATH
        run: |
          echo "${env:USERPROFILE}\.cargo\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
          echo "TARGET=${{ matrix.target }}" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
        shell: bash
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using win.rustup.rs
        env:
          RUSTUP_ARCH: ${{ matrix.rustup_arch || 'x86_64' }}
        run: |
          # Disable the download progress bar which can cause perf issues
          $ProgressPreference = "SilentlyContinue"
          Invoke-WebRequest "https://win.rustup.rs/${env:RUSTUP_ARCH}" -OutFile rustup-init.exe
          .\rustup-init.exe -y --default-host=${env:RUSTUP_ARCH}-pc-windows-msvc --profile=minimal
          del rustup-init.exe
        shell: powershell
      - name: Ensure stable toolchain is up to date
        run: rustup update stable
        shell: bash
      - name: Install the target
        run: |
          rustup target install ${{ matrix.target }}
      - name: Run a full build
        env:
          TARGET: ${{ matrix.target }}
          BUILD_PROFILE: ${{ matrix.mode }}
        run: bash ci/run.bash
      - name: Run cargo check
        if: matrix.mode != 'release'
        env:
          TARGET: ${{ matrix.target }}
        # os-specific code leads to lints escaping if we only run this in one target
        run: |
          cargo check --all --all-targets --features test
          git ls-files -- '*.rs' | xargs touch
      - name: Run cargo clippy
        if: matrix.mode != 'release' && matrix.mingwdir == ''
        env:
          TARGET: ${{ matrix.target }}
        run: |
          rustup component add clippy
          cargo clippy --all-targets --all-features -- -D warnings
      - name: Upload the built artifact
        if: matrix.mode == 'release'
        uses: actions/upload-artifact@v7
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init.exe
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          Get-Command aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          .\ci\prepare-deploy.ps1
        shell: powershell
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive dist s3://dev-static-rust-lang-org/rustup/dist
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive dist s3://rustup-builds/${{ github.sha }}/dist
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache

  # This is ci/actions-templates/windows-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-windows-main: # job-name skip-pr skip-stable
    runs-on: ${{ matrix.os || 'windows-latest' }}
    if: ${{ (github.event_name == 'push' && github.ref_name == 'main') }} # skip-pr skip-stable
    env:
      RUSTFLAGS: -Ctarget-feature=+crt-static
      RUST_MIN_STACK: 16777216
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-pc-windows-msvc
          - aarch64-pc-windows-msvc
          - x86_64-pc-windows-gnu
        include:
          - target: x86_64-pc-windows-msvc
            run_tests: YES
          - target: x86_64-pc-windows-gnu
            arch: x86_64
            mingwdir: mingw64
            gcc: x86_64-w64-mingw32-gcc
          - target: aarch64-pc-windows-msvc
            # Architecture of the rustup build that installs Rust in this workflow.
            rustup_arch: aarch64
            os: windows-11-arm
            run_tests: YES
    steps:
      - uses: actions/checkout@v6
        # v2 defaults to a shallow checkout, but we need at least to the previous tag
        with:
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          New-Item "${env:USERPROFILE}\.cargo\registry" -ItemType Directory -Force
          New-Item "${env:USERPROFILE}\.cargo\git" -ItemType Directory -Force
        shell: powershell
      - name: Install NASM
        # Building `aws-lc-rs` for Windows MSVC depends on `NASM`.
        # See: https://aws.github.io/aws-lc-rs/requirements/windows.html
        uses: ilammy/setup-nasm@v1
        if: matrix.mingwdir == ''
      - name: Install mingw
        uses: bwoodsend/setup-winlibs-action@v1
        if: matrix.mingwdir != ''
        with:
          architecture: ${{ matrix.arch }}
      - name: Verify mingw gcc installation
        shell: powershell
        if: matrix.mingwdir != ''
        run: |
          Get-Command ${{ matrix.gcc }}
          ${{ matrix.gcc }} --version
      - name: Set PATH
        run: |
          echo "${env:USERPROFILE}\.cargo\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
          echo "TARGET=${{ matrix.target }}" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
        shell: bash
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using win.rustup.rs
        env:
          RUSTUP_ARCH: ${{ matrix.rustup_arch || 'x86_64' }}
        run: |
          # Disable the download progress bar which can cause perf issues
          $ProgressPreference = "SilentlyContinue"
          Invoke-WebRequest "https://win.rustup.rs/${env:RUSTUP_ARCH}" -OutFile rustup-init.exe
          .\rustup-init.exe -y --default-host=${env:RUSTUP_ARCH}-pc-windows-msvc --profile=minimal
          del rustup-init.exe
        shell: powershell
      - name: Ensure stable toolchain is up to date
        run: rustup update stable
        shell: bash
      - name: Install the target
        run: |
          rustup target install ${{ matrix.target }}
      - name: Run a full build
        env:
          TARGET: ${{ matrix.target }}
          BUILD_PROFILE: ${{ matrix.mode }}
        run: bash ci/run.bash
      - name: Run cargo check
        if: matrix.mode != 'release'
        env:
          TARGET: ${{ matrix.target }}
        # os-specific code leads to lints escaping if we only run this in one target
        run: |
          cargo check --all --all-targets --features test
          git ls-files -- '*.rs' | xargs touch
      - name: Run cargo clippy
        if: matrix.mode != 'release' && matrix.mingwdir == ''
        env:
          TARGET: ${{ matrix.target }}
        run: |
          rustup component add clippy
          cargo clippy --all-targets --all-features -- -D warnings
      - name: Upload the built artifact
        if: matrix.mode == 'release'
        uses: actions/upload-artifact@v7
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init.exe
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          Get-Command aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          .\ci\prepare-deploy.ps1
        shell: powershell
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive dist s3://dev-static-rust-lang-org/rustup/dist
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive dist s3://rustup-builds/${{ github.sha }}/dist
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache

  # This is ci/actions-templates/windows-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-windows-stable: # job-name skip-main skip-pr
    runs-on: ${{ matrix.os || 'windows-latest' }}
    if: ${{ github.event_name == 'push' && github.ref_name == 'stable' || github.event_name == 'schedule' }} # skip-pr skip-main
    env:
      RUSTFLAGS: -Ctarget-feature=+crt-static
      RUST_MIN_STACK: 16777216
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-pc-windows-msvc
          - i686-pc-windows-msvc # skip-pr skip-main
          - aarch64-pc-windows-msvc
          - x86_64-pc-windows-gnu
          - i686-pc-windows-gnu # skip-pr skip-main
        include:
          - target: x86_64-pc-windows-msvc
            run_tests: YES
          - target: x86_64-pc-windows-gnu
            arch: x86_64
            mingwdir: mingw64
            gcc: x86_64-w64-mingw32-gcc
          - target: aarch64-pc-windows-msvc
            # Architecture of the rustup build that installs Rust in this workflow.
            rustup_arch: aarch64
            os: windows-11-arm
            run_tests: YES
          - target: i686-pc-windows-gnu # skip-pr skip-main
            arch: i686 # skip-pr skip-main
            mingwdir: mingw32 # skip-pr skip-main
            gcc: i686-w64-mingw32-gcc # skip-pr skip-main
    steps:
      - uses: actions/checkout@v6
        # v2 defaults to a shallow checkout, but we need at least to the previous tag
        with:
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          New-Item "${env:USERPROFILE}\.cargo\registry" -ItemType Directory -Force
          New-Item "${env:USERPROFILE}\.cargo\git" -ItemType Directory -Force
        shell: powershell
      - name: Install NASM
        # Building `aws-lc-rs` for Windows MSVC depends on `NASM`.
        # See: https://aws.github.io/aws-lc-rs/requirements/windows.html
        uses: ilammy/setup-nasm@v1
        if: matrix.mingwdir == ''
      - name: Install mingw
        uses: bwoodsend/setup-winlibs-action@v1
        if: matrix.mingwdir != ''
        with:
          architecture: ${{ matrix.arch }}
      - name: Verify mingw gcc installation
        shell: powershell
        if: matrix.mingwdir != ''
        run: |
          Get-Command ${{ matrix.gcc }}
          ${{ matrix.gcc }} --version
      - name: Set PATH
        run: |
          echo "${env:USERPROFILE}\.cargo\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
          echo "TARGET=${{ matrix.target }}" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
        shell: bash
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using win.rustup.rs
        env:
          RUSTUP_ARCH: ${{ matrix.rustup_arch || 'x86_64' }}
        run: |
          # Disable the download progress bar which can cause perf issues
          $ProgressPreference = "SilentlyContinue"
          Invoke-WebRequest "https://win.rustup.rs/${env:RUSTUP_ARCH}" -OutFile rustup-init.exe
          .\rustup-init.exe -y --default-host=${env:RUSTUP_ARCH}-pc-windows-msvc --profile=minimal
          del rustup-init.exe
        shell: powershell
      - name: Ensure stable toolchain is up to date
        run: rustup update stable
        shell: bash
      - name: Install the target
        run: |
          rustup target install ${{ matrix.target }}
      - name: Run a full build
        env:
          TARGET: ${{ matrix.target }}
          BUILD_PROFILE: ${{ matrix.mode }}
        run: bash ci/run.bash
      - name: Run cargo check
        if: matrix.mode != 'release'
        env:
          TARGET: ${{ matrix.target }}
        # os-specific code leads to lints escaping if we only run this in one target
        run: |
          cargo check --all --all-targets --features test
          git ls-files -- '*.rs' | xargs touch
      - name: Run cargo clippy
        if: matrix.mode != 'release' && matrix.mingwdir == ''
        env:
          TARGET: ${{ matrix.target }}
        run: |
          rustup component add clippy
          cargo clippy --all-targets --all-features -- -D warnings
      - name: Upload the built artifact
        if: matrix.mode == 'release'
        uses: actions/upload-artifact@v7
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init.exe
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          Get-Command aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          .\ci\prepare-deploy.ps1
        shell: powershell
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive dist s3://dev-static-rust-lang-org/rustup/dist
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive dist s3://rustup-builds/${{ github.sha }}/dist
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache

  # This is ci/actions-templates/linux-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-linux-pr: # job-name skip-main skip-stable
    runs-on: ${{ matrix.os || 'ubuntu-latest' }}
    if: ${{ contains('["pull_request", "merge_group"]', github.event_name) }} # skip-main skip-stable
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-unknown-linux-gnu
          - armv7-unknown-linux-gnueabihf
          - aarch64-linux-android
          - aarch64-unknown-linux-gnu
        include:
          - target: x86_64-unknown-linux-gnu
            run_tests: YES
            #snap_arch: amd64
            # We add an ARM-based host to the following target.
            # We need to do that because rust's CI uses ARM-based runners
            # to generate their Dockerfiles.
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-24.04-arm
            run_tests: YES
          - target: armv7-unknown-linux-gnueabihf
            #snap_arch: armhf
    steps:
      - name: Clone repo
        uses: actions/checkout@v6
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=none --profile=minimal -y
      - name: Ensure Stable is up to date
        run: |
          if rustc +stable -vV >/dev/null 2>/dev/null; then
            rustup toolchain uninstall stable
          fi
          rustup toolchain install --profile=minimal stable
      - name: Ensure we have our goal target installed
        run: |
          rustup target install "$TARGET"
      - name: Determine which docker we need to run in
        run: |
          case "$TARGET" in
            *-linux-android*) DOCKER=android   ;; # Android uses a local docker image
            *)                DOCKER="$TARGET" ;;
          esac
          echo "DOCKER=$DOCKER" >> $GITHUB_ENV
      - name: Fetch the base docker images from rust-lang/rust
        run: bash ci/fetch-rust-docker.bash "${TARGET}"
      - name: Maybe build a docker from there
        run: |
          if [ -f "ci/docker/$DOCKER/Dockerfile" ]; then
            # HACK: A possible regression in Docker will make this step fail
            # when BuildKit is enabled, so disabling it for now. See
            # <https://github.com/rust-lang/rustup/issues/4720> for more info.
            DOCKER_BUILDKIT=0 docker build -t "rustup/$DOCKER" -f "ci/docker/${DOCKER}/Dockerfile" .
          fi
      - name: Run the build within the docker image
        env:
          BUILD_PROFILE: ${{ matrix.mode }}
        run: |
          mkdir -p "${PWD}/target"
          chown -R "$(id -u)":"$(id -g)" "${PWD}/target"
          docker run \
            --entrypoint sh \
            --env BUILD_PROFILE="${BUILD_PROFILE}" \
            --env CARGO_HOME=/cargo \
            --env CARGO_TARGET_DIR=/checkout/target \
            --env LIBZ_SYS_STATIC=1 \
            --env SKIP_TESTS="${SKIP_TESTS}" \
            --env TARGET="${TARGET}" \
            --env INSTALL_BINDGEN=1 \
            --init \
            --rm \
            --tty \
            --user "$(id -u)":"$(id -g)" \
            --volume "$(rustc --print sysroot)":/rustc-sysroot:ro \
            --volume "${HOME}/.cargo:/cargo" \
            --volume "${PWD}":/checkout:ro \
            --volume "${PWD}"/target:/checkout/target \
            --workdir /checkout \
            "rustup/$DOCKER" \
            -c 'PATH="${PATH}":/rustc-sysroot/bin bash ci/run.bash'
      - name: Upload the built artifact
        uses: actions/upload-artifact@v7
        if: matrix.mode == 'release'
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          which aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          bash ci/prepare-deploy.bash
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws s3 cp --recursive deploy/ s3://dev-static-rust-lang-org/rustup/
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive deploy/ s3://rustup-builds/${{ github.sha }}
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache

  # This is ci/actions-templates/linux-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-linux-main: # job-name skip-pr skip-stable
    runs-on: ${{ matrix.os || 'ubuntu-latest' }}
    if: ${{ (github.event_name == 'push' && github.ref_name == 'main') }} # skip-pr skip-stable
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-unknown-linux-gnu
          - armv7-unknown-linux-gnueabihf
          - aarch64-linux-android
          - aarch64-unknown-linux-gnu
          - powerpc64-unknown-linux-gnu    # skip-pr
          - x86_64-unknown-linux-musl      # skip-pr
        include:
          - target: x86_64-unknown-linux-gnu
            run_tests: YES
            #snap_arch: amd64
            # We add an ARM-based host to the following target.
            # We need to do that because rust's CI uses ARM-based runners
            # to generate their Dockerfiles.
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-24.04-arm
            run_tests: YES
          - target: armv7-unknown-linux-gnueabihf
            #snap_arch: armhf
    steps:
      - name: Clone repo
        uses: actions/checkout@v6
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=none --profile=minimal -y
      - name: Ensure Stable is up to date
        run: |
          if rustc +stable -vV >/dev/null 2>/dev/null; then
            rustup toolchain uninstall stable
          fi
          rustup toolchain install --profile=minimal stable
      - name: Ensure we have our goal target installed
        run: |
          rustup target install "$TARGET"
      - name: Determine which docker we need to run in
        run: |
          case "$TARGET" in
            *-linux-android*) DOCKER=android   ;; # Android uses a local docker image
            *)                DOCKER="$TARGET" ;;
          esac
          echo "DOCKER=$DOCKER" >> $GITHUB_ENV
      - name: Fetch the base docker images from rust-lang/rust
        run: bash ci/fetch-rust-docker.bash "${TARGET}"
      - name: Maybe build a docker from there
        run: |
          if [ -f "ci/docker/$DOCKER/Dockerfile" ]; then
            # HACK: A possible regression in Docker will make this step fail
            # when BuildKit is enabled, so disabling it for now. See
            # <https://github.com/rust-lang/rustup/issues/4720> for more info.
            DOCKER_BUILDKIT=0 docker build -t "rustup/$DOCKER" -f "ci/docker/${DOCKER}/Dockerfile" .
          fi
      - name: Run the build within the docker image
        env:
          BUILD_PROFILE: ${{ matrix.mode }}
        run: |
          mkdir -p "${PWD}/target"
          chown -R "$(id -u)":"$(id -g)" "${PWD}/target"
          docker run \
            --entrypoint sh \
            --env BUILD_PROFILE="${BUILD_PROFILE}" \
            --env CARGO_HOME=/cargo \
            --env CARGO_TARGET_DIR=/checkout/target \
            --env LIBZ_SYS_STATIC=1 \
            --env SKIP_TESTS="${SKIP_TESTS}" \
            --env TARGET="${TARGET}" \
            --env INSTALL_BINDGEN=1 \
            --init \
            --rm \
            --tty \
            --user "$(id -u)":"$(id -g)" \
            --volume "$(rustc --print sysroot)":/rustc-sysroot:ro \
            --volume "${HOME}/.cargo:/cargo" \
            --volume "${PWD}":/checkout:ro \
            --volume "${PWD}"/target:/checkout/target \
            --workdir /checkout \
            "rustup/$DOCKER" \
            -c 'PATH="${PATH}":/rustc-sysroot/bin bash ci/run.bash'
      - name: Upload the built artifact
        uses: actions/upload-artifact@v7
        if: matrix.mode == 'release'
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          which aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          bash ci/prepare-deploy.bash
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws s3 cp --recursive deploy/ s3://dev-static-rust-lang-org/rustup/
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive deploy/ s3://rustup-builds/${{ github.sha }}
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache

  # This is ci/actions-templates/linux-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-linux-stable: # job-name skip-main skip-pr
    runs-on: ${{ matrix.os || 'ubuntu-latest' }}
    if: ${{ github.event_name == 'push' && github.ref_name == 'stable' || github.event_name == 'schedule' }} # skip-pr skip-main
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-unknown-linux-gnu
          - armv7-unknown-linux-gnueabihf
          - aarch64-linux-android
          - aarch64-unknown-linux-gnu
          - aarch64-unknown-linux-musl     # skip-pr skip-main
          - powerpc64-unknown-linux-gnu    # skip-pr
          - x86_64-unknown-linux-musl      # skip-pr
          - i686-unknown-linux-gnu         # skip-pr skip-main
          - arm-unknown-linux-gnueabi      # skip-pr skip-main
          - arm-unknown-linux-gnueabihf    # skip-pr skip-main
          - x86_64-pc-solaris              # skip-pr skip-main
          - x86_64-unknown-freebsd         # skip-pr skip-main
          - x86_64-unknown-netbsd          # skip-pr skip-main
          - x86_64-unknown-illumos         # skip-pr skip-main
          - powerpc-unknown-linux-gnu      # skip-pr skip-main
          - powerpc64le-unknown-linux-gnu  # skip-pr skip-main
          - powerpc64le-unknown-linux-musl # skip-pr skip-main
          - s390x-unknown-linux-gnu        # skip-pr skip-main
          - sparcv9-sun-solaris            # skip-pr skip-main
          - arm-linux-androideabi          # skip-pr skip-main
          - armv7-linux-androideabi        # skip-pr skip-main
          - x86_64-linux-android           # skip-pr skip-main
          - riscv64gc-unknown-linux-gnu    # skip-pr skip-main
          - loongarch64-unknown-linux-gnu  # skip-pr skip-main
          - loongarch64-unknown-linux-musl # skip-pr skip-main
        include:
          - target: x86_64-unknown-linux-gnu
            run_tests: YES
            #snap_arch: amd64
          - target: i686-unknown-linux-gnu # skip-pr skip-main
            #snap_arch: i386  # skip-pr skip-main
            # We add an ARM-based host to the following target.
            # We need to do that because rust's CI uses ARM-based runners
            # to generate their Dockerfiles.
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-24.04-arm
            run_tests: YES
          - target: armv7-unknown-linux-gnueabihf
            #snap_arch: armhf
          - target: powerpc64le-unknown-linux-gnu # skip-pr skip-main
            #snap_arch: ppc64el # skip-pr skip-main
          - target: s390x-unknown-linux-gnu # skip-pr skip-main
            #snap_arch: s390x # skip-pr skip-main
    steps:
      - name: Clone repo
        uses: actions/checkout@v6
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=none --profile=minimal -y
      - name: Ensure Stable is up to date
        run: |
          if rustc +stable -vV >/dev/null 2>/dev/null; then
            rustup toolchain uninstall stable
          fi
          rustup toolchain install --profile=minimal stable
      - name: Ensure we have our goal target installed
        run: |
          rustup target install "$TARGET"
      - name: Determine which docker we need to run in
        run: |
          case "$TARGET" in
            *-linux-android*) DOCKER=android   ;; # Android uses a local docker image
            *)                DOCKER="$TARGET" ;;
          esac
          echo "DOCKER=$DOCKER" >> $GITHUB_ENV
      - name: Fetch the base docker images from rust-lang/rust
        run: bash ci/fetch-rust-docker.bash "${TARGET}"
      - name: Maybe build a docker from there
        run: |
          if [ -f "ci/docker/$DOCKER/Dockerfile" ]; then
            # HACK: A possible regression in Docker will make this step fail
            # when BuildKit is enabled, so disabling it for now. See
            # <https://github.com/rust-lang/rustup/issues/4720> for more info.
            DOCKER_BUILDKIT=0 docker build -t "rustup/$DOCKER" -f "ci/docker/${DOCKER}/Dockerfile" .
          fi
      - name: Run the build within the docker image
        env:
          BUILD_PROFILE: ${{ matrix.mode }}
        run: |
          mkdir -p "${PWD}/target"
          chown -R "$(id -u)":"$(id -g)" "${PWD}/target"
          docker run \
            --entrypoint sh \
            --env BUILD_PROFILE="${BUILD_PROFILE}" \
            --env CARGO_HOME=/cargo \
            --env CARGO_TARGET_DIR=/checkout/target \
            --env LIBZ_SYS_STATIC=1 \
            --env SKIP_TESTS="${SKIP_TESTS}" \
            --env TARGET="${TARGET}" \
            --env INSTALL_BINDGEN=1 \
            --init \
            --rm \
            --tty \
            --user "$(id -u)":"$(id -g)" \
            --volume "$(rustc --print sysroot)":/rustc-sysroot:ro \
            --volume "${HOME}/.cargo:/cargo" \
            --volume "${PWD}":/checkout:ro \
            --volume "${PWD}"/target:/checkout/target \
            --workdir /checkout \
            "rustup/$DOCKER" \
            -c 'PATH="${PATH}":/rustc-sysroot/bin bash ci/run.bash'
      - name: Upload the built artifact
        uses: actions/upload-artifact@v7
        if: matrix.mode == 'release'
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          which aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          bash ci/prepare-deploy.bash
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws s3 cp --recursive deploy/ s3://dev-static-rust-lang-org/rustup/
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive deploy/ s3://rustup-builds/${{ github.sha }}
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache
  # This is ci/actions-templates/macos-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-macos-x86_64: # job-name skip-aarch64
    env: # skip-aarch64
      MACOSX_DEPLOYMENT_TARGET: 10.12 # skip-aarch64
    runs-on: macos-15-intel # skip-aarch64
    permissions:
      id-token: write
      contents: read
    strategy:
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-apple-darwin # skip-aarch64
    steps:
      - uses: actions/checkout@v6
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
          echo "SKIP_TESTS=" >> $GITHUB_ENV
          echo "LZMA_API_STATIC=1" >> $GITHUB_ENV
      - name: Skip tests
        if: matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=none --profile=minimal -y
      - name: Ensure Stable is up to date
        run: |
          if rustc +stable -vV >/dev/null 2>/dev/null; then
            rustup toolchain uninstall stable
          fi
          rustup toolchain install --profile=minimal stable
      - name: Ensure we have our goal target installed
        run: |
          rustup target install "$TARGET"
      - name: Run a full build and test
        env:
          BUILD_PROFILE: ${{ matrix.mode }}
        shell: arch -x86_64 bash -e {0} # skip-aarch64
        run: bash ci/run.bash
      - name: Dump dynamic link targets
        if: matrix.mode == 'release'
        run: |
          otool -L target/${TARGET}/release/rustup-init
          if otool -L target/${TARGET}/release/rustup-init | grep -q -F /usr/local/; then
            echo >&2 "Unfortunately there are /usr/local things in the link. Fail."
            exit 1
          fi
      - name: Upload the built artifact
        if: matrix.mode == 'release'
        uses: actions/upload-artifact@v7
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          brew install --overwrite awscli
          which aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          bash ci/prepare-deploy.bash
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws s3 cp --recursive deploy/ s3://dev-static-rust-lang-org/rustup/
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive deploy/ s3://rustup-builds/${{ github.sha }}
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache
      - name: Flush cache
        # This is a workaround for a bug with GitHub Actions Cache that causes
        # corrupt cache entries (particularly in the target directory). See
        # https://github.com/actions/cache/issues/403 and
        # https://github.com/rust-lang/cargo/issues/8603.
        run: sudo /usr/sbin/purge
  # This is ci/actions-templates/macos-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-macos-aarch64: # job-name skip-x86_64
    env: # skip-x86_64
      MACOSX_DEPLOYMENT_TARGET: 11.0 # skip-x86_64
    runs-on: macos-latest # skip-x86_64
    permissions:
      id-token: write
      contents: read
    strategy:
      matrix:
        mode:
          - dev
          - release
        target:
          - aarch64-apple-darwin # skip-x86_64
    steps:
      - uses: actions/checkout@v6
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
          echo "SKIP_TESTS=" >> $GITHUB_ENV
          echo "LZMA_API_STATIC=1" >> $GITHUB_ENV
      - name: Skip tests
        if: matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=none --profile=minimal -y
      - name: Ensure Stable is up to date
        run: |
          if rustc +stable -vV >/dev/null 2>/dev/null; then
            rustup toolchain uninstall stable
          fi
          rustup toolchain install --profile=minimal stable
      - name: Ensure we have our goal target installed
        run: |
          rustup target install "$TARGET"
      - name: Run a full build and test
        env:
          BUILD_PROFILE: ${{ matrix.mode }}
        run: bash ci/run.bash
      - name: Dump dynamic link targets
        if: matrix.mode == 'release'
        run: |
          otool -L target/${TARGET}/release/rustup-init
          if otool -L target/${TARGET}/release/rustup-init | grep -q -F /usr/local/; then
            echo >&2 "Unfortunately there are /usr/local things in the link. Fail."
            exit 1
          fi
      - name: Upload the built artifact
        if: matrix.mode == 'release'
        uses: actions/upload-artifact@v7
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          brew install --overwrite awscli
          which aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/main')
        run: |
          bash ci/prepare-deploy.bash
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws s3 cp --recursive deploy/ s3://dev-static-rust-lang-org/rustup/
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v6
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive deploy/ s3://rustup-builds/${{ github.sha }}
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache
      - name: Flush cache
        # This is a workaround for a bug with GitHub Actions Cache that causes
        # corrupt cache entries (particularly in the target directory). See
        # https://github.com/actions/cache/issues/403 and
        # https://github.com/rust-lang/cargo/issues/8603.
        run: sudo /usr/sbin/purge

  # This is ci/actions-templates/freebsd-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-freebsd-main: # job-name skip-stable
    runs-on: ubuntu-latest
    if: ${{ (github.event_name == 'push' && github.ref_name == 'main') || github.event_name == 'schedule' }} # skip-stable
    steps:
    - uses: actions/checkout@v6
      with:
        # v2 defaults to a shallow checkout, but we need at least to the previous tag
        fetch-depth: 0
    - name: Acquire tags for the repo
      run: |
        git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
    - name: Run a full build
      uses: vmactions/freebsd-vm@v1
      with:
        release: 13.2
        usesh: true
        copyback: false
        prepare: |
          pkg install -y git gmake bash sudo \
            `# The following packages are required by 'aws-lc-rs':` \
            cmake-core llvm-devel-lite rust-bindgen-cli
        run: |
          echo "========="
          echo "create non-root user and log into it"
          pw group add -n tester
          pw user add -n tester -g tester -s `which bash`
          pw user mod tester -d `pwd`
          chown -R tester .
          sudo -u tester bash ci/freebsd/script.bash

  # This is ci/actions-templates/freebsd-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-freebsd-stable: # job-name skip-main
    runs-on: ubuntu-latest
    if: ${{ github.event_name == 'push' && github.ref_name == 'stable' }} # skip-main
    steps:
    - uses: actions/checkout@v6
      with:
        # v2 defaults to a shallow checkout, but we need at least to the previous tag
        fetch-depth: 0
    - name: Acquire tags for the repo
      run: |
        git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
    - name: Run a full build
      uses: vmactions/freebsd-vm@v1
      with:
        release: 13.2
        usesh: true
        copyback: false
        prepare: |
          pkg install -y git gmake bash sudo \
            `# The following packages are required by 'aws-lc-rs':` \
            cmake-core llvm-devel-lite rust-bindgen-cli
        run: |
          echo "========="
          echo "create non-root user and log into it"
          pw group add -n tester
          pw user add -n tester -g tester -s `which bash`
          pw user mod tester -d `pwd`
          chown -R tester .
          sudo -u tester bash ci/freebsd/script.bash

  # This is ci/actions-templates/centos-fmt-clippy.yaml
  # Do not edit this file in .github/workflows
  check: # job-name
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
    steps:
      - name: Clone repo
        uses: actions/checkout@v6
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Run CI workflow generation checks
        run: |
          ./ci/actions-templates/gen-workflows.sh
          git diff --exit-code
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
      - name: Cache cargo registry and git trees
        uses: actions/cache@v5
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v5
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ runner.os }}-cargo-clippy-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ runner.os }}-cargo-clippy-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=stable --profile=minimal -c=rustfmt -c=clippy -y
      - name: Run the centos check within the docker image
        run: |
          docker run \
            --volume "$PWD":/checkout:ro \
            --workdir /checkout \
            --tty \
            --init \
            --rm \
            centos:7 \
            sh ./ci/raw_init.sh
      - name: Run shell checks
        run: |
          shellcheck -x -s dash -- rustup-init.sh
          git ls-files -- '*.sh' | xargs shellcheck -x -s dash
          git ls-files -- '*.bash' | xargs shellcheck -x -s bash
      - name: Install taplo
        uses: taiki-e/install-action@v2
        with:
          tool: taplo
          fallback: none
      - name: Run TOML formatting checks
        run: |
          taplo fmt
          git diff --exit-code
      - name: Run Rust formatting checks
        run: |
          cargo fmt --all --check
      - name: Run cargo check and clippy
        run: |
          cargo check --all --all-targets --features test
          git ls-files -- '*.rs' | xargs touch
          cargo clippy --all-targets --all-features -- -D warnings

  # This is ci/actions-templates/all-features-template.yaml
  # Do not edit this file in .github/workflows
  #
  # This is an additional workflow to test building with all feature combinations.
  # Unlike our main workflows, this doesn't self-test the rustup install scripts,
  # nor run on the rust docker images. This permits a smaller workflow without the
  # templating and so on.
  build-all-features: # job-name
    runs-on: ${{ matrix.os }}
    if: ${{ contains('["pull_request", "merge_group"]', github.event_name) }}
    strategy:
      fail-fast: false
      matrix:
        include:
          # Might add more targets in future.
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          - os: windows-latest
            target: x86_64-pc-windows-msvc
    steps:
      - name: Clone repo
        uses: actions/checkout@v6
      - name: Install rustup stable
        run: rustup toolchain install stable --profile minimal
      - name: Install Protoc
        uses: arduino/setup-protoc@v1
        with:
          version: "3.x"
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Install OpenSSL
        if: ${{ contains(matrix.os, 'windows') }}
        run: |
          Get-Command openssl
          openssl version
          echo "OPENSSL_LIB_DIR=C:/Program Files/OpenSSL/lib/VC/x64/MD" >> $env:GITHUB_ENV
          echo "OPENSSL_DIR=C:/Program Files/OpenSSL/" >> $env:GITHUB_ENV
          echo "OPENSSL_INCLUDE_DIR=C:/Program Files/OpenSSL/include" >> $env:GITHUB_ENV
      - name: Install NASM
        # Building `aws-lc-rs` for Windows MSVC depends on `NASM`.
        # See: https://aws.github.io/aws-lc-rs/requirements/windows.html
        uses: ilammy/setup-nasm@v1
        if: ${{ contains(matrix.os, 'windows') }}
      - name: Set environment variables appropriately for the build
        shell: bash
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
      - name: Cache Cargo
        uses: Swatinem/rust-cache@v2
      - name: Install cargo-all-features
        shell: bash
        run: which cargo-check-all-features || cargo install cargo-all-features --git https://github.com/rbtcollins/cargo-all-features.git
      - name: Ensure we have our goal target installed
        run: |
          rustup target install ${{ matrix.target }}
      - name: Build every combination
        env:
          RUSTFLAGS: -D warnings
        run: |
          cargo check-all-features --root-only

  # This is ci/actions-templates/test-docs-templates.yaml
  # Do not edit this file in .github/workflows
  #
  # Builds docs for both stable and main branches.
  # stable is placed in the root of the gh-pages branch, while main is placed at /devel
  doc: # job-name
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Install mdbook
        uses: taiki-e/install-action@v2
        env:
          # renovate: datasource=crate depName=mdbook
          MDBOOK_VERSION: "0.4.43"
        with:
          tool: mdbook@${{ env.MDBOOK_VERSION }}
      - name: Build user-guide (stable)
        if: ${{ !contains('["pull_request", "merge_group"]', github.event_name) }}
        run: |
          git checkout stable
          # Support both old and new directory structure during the transition
          cd doc/user-guide || cd doc
          mdbook build
          mv book ${{ runner.temp }}
      - name: Build user-guide (main)
        run: |
          git checkout main
          cd doc/user-guide
          mdbook build
          mkdir -p ${{ runner.temp }}/book
          mv book ${{ runner.temp }}/book/devel
      - name: Build dev-guide (main)
        run: |
          git checkout main
          cd doc/dev-guide
          mdbook build
          mkdir -p ${{ runner.temp }}/book
          mv book ${{ runner.temp }}/book/dev-guide
      - name: Deploy to GitHub
        if: ${{ !contains('["pull_request", "merge_group"]', github.event_name) }}
        run: |
          cd ${{ runner.temp }}/book
          git config --global init.defaultBranch main
          git init
          git config user.name "Deploy from CI"
          git config user.email ""
          git add . .nojekyll
          git commit -m "Deploy $GITHUB_REF $GITHUB_SHA to gh-pages"
          git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY
          git push --force --set-upstream origin main:gh-pages

  # This is ci/actions-templates/conclusion-template.yaml
  # Do not edit this file in .github/workflows
  conclusion:
    # https://github.com/PyO3/pyo3/blob/42601f3af94242b017402b763a495798a92da8f8/.github/workflows/ci.yml#L452-L472
    if: always()
    runs-on: ubuntu-latest
    steps:
      - name: Result
        run: |
          jq -C <<< "${needs}"
          # Check if all needs were successful or skipped.
          "$(jq -r 'all(.result as $result | (["success", "skipped"] | contains([$result])))' <<< "${needs}")"
        env:
          needs: ${{ toJson(needs) }}
    needs:
      - build-all-features
      - check
      - build-freebsd-main
      - build-freebsd-stable
      - build-linux-pr
      - build-linux-main
      - build-linux-stable
      - build-macos-aarch64
      - build-macos-x86_64
      - doc
      - build-windows-pr
      - build-windows-main
      - build-windows-stable
