ci: Use ReFS for our Windows CI (#23901)

Piotr Osiewicz created

Based on uv's CI setup.

Closes #ISSUE

Release Notes:

- N/A

Change summary

.github/workflows/ci.yml | 29 ++++++++++++++++++++++++++---
to_remove.file           |  0 
2 files changed, 26 insertions(+), 3 deletions(-)

Detailed changes

.github/workflows/ci.yml 🔗

@@ -234,35 +234,58 @@ jobs:
     runs-on: hosted-windows-1
     steps:
       # more info here:- https://github.com/rust-lang/cargo/issues/13020
+      - name: Create Dev Drive using ReFS
+        run: |
+          $Volume = New-VHD -Path C:/zed_dev_drive.vhdx -SizeBytes 30GB |
+                    Mount-VHD -Passthru |
+                    Initialize-Disk -Passthru |
+                    New-Partition -AssignDriveLetter -UseMaximumSize |
+                    Format-Volume -FileSystem ReFS -Confirm:$false -Force
+          Write-Output $Volume
+          Write-Output "DEV_DRIVE=$($Volume.DriveLetter):" >> $env:GITHUB_ENV
       - name: Enable longer pathnames for git
         run: git config --system core.longpaths true
       - name: Checkout repo
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
         with:
           clean: false
+      # actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
+      - name: Copy Git Repo to Dev Drive
+        run: |
+          Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.DEV_DRIVE }}/zed" -Recurse
 
       - name: Cache dependencies
         uses: swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
         with:
           save-if: ${{ github.ref == 'refs/heads/main' }}
+          workspaces: ${{ env.DEV_DRIVE }}/zed
           cache-provider: "github"
+        env:
+          CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo
+          RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup
 
       - name: Configure CI
         run: |
-          mkdir -p ./../.cargo
-          cp ./.cargo/ci-config.toml ./../.cargo/config.toml
+          mkdir -p ${{ env.DEV_DRIVE }}/.cargo -ErrorAction Ignore
+          cp ./.cargo/ci-config.toml ${{ env.DEV_DRIVE }}/.cargo/config.toml
 
       - name: cargo clippy
         # Windows can't run shell scripts, so we need to use `cargo xtask`.
         run: cargo xtask clippy
+        env:
+          CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo
+          RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup
 
       - name: Build Zed
         run: cargo build
+        env:
+          CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo
+          RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup
 
       # Since the Windows runners are stateful, so we need to remove the config file to prevent potential bug.
       - name: Clean CI config file
         if: always()
-        run: Remove-Item -Path "./../.cargo" -Recurse -Force
+        run: Remove-Item -Path "${{ env.DEV_DRIVE }}/.cargo/config.toml"  -Force
 
   bundle-mac:
     timeout-minutes: 120