Bootstrap Git during Windows source installs
ci / test (push) Canceled after 0s
ci / fuzz-smoke (push) Canceled after 0s
ci / macos-client (macos-aarch64, macos-14) (push) Canceled after 0s
ci / macos-client (macos-x86_64, macos-13) (push) Canceled after 0s
ci / windows-client (push) Canceled after 0s
ci / package-release (linux-x86_64, ubuntu-latest, , , ) (push) Canceled after 0s
ci / package-release (macos-aarch64, macos-14, , , ) (push) Canceled after 0s
ci / package-release (macos-x86_64, macos-13, , , ) (push) Canceled after 0s
ci / package-release (windows-aarch64, windows-latest, aarch64, windows, aarch64-pc-windows-msvc) (push) Canceled after 0s
ci / package-release (windows-x86_64, windows-latest, , , ) (push) Canceled after 0s
ci / remote-bench (push) Canceled after 0s
ci / publish-gitea-release (push) Canceled after 0s

This commit is contained in:
DuProcess
2026-07-16 22:07:52 -04:00
parent 0102d453bd
commit 07879a1558
2 changed files with 46 additions and 1 deletions
+30 -1
View File
@@ -50,6 +50,35 @@ function Ensure-Cargo {
} }
} }
function Ensure-Git {
if (Get-Command git -ErrorAction SilentlyContinue) {
return
}
if (-not (Get-Command winget -ErrorAction SilentlyContinue)) {
throw "git not found and winget is unavailable; install Git from https://git-scm.com/download/win or set DOSH_USE_PREBUILT=1"
}
Write-Info "git not found; installing Git with winget"
winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements
$gitBins = @()
if ($env:ProgramFiles) {
$gitBins += (Join-Path $env:ProgramFiles "Git\cmd")
}
if (${env:ProgramFiles(x86)}) {
$gitBins += (Join-Path ${env:ProgramFiles(x86)} "Git\cmd")
}
if ($env:LOCALAPPDATA) {
$gitBins += (Join-Path $env:LOCALAPPDATA "Programs\Git\cmd")
}
foreach ($gitBin in $gitBins) {
if ((Test-Path $gitBin) -and -not (PathList-Contains $env:Path $gitBin)) {
$env:Path = "$gitBin;$env:Path"
}
}
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
throw "git was installed but is not available in this terminal yet; open a new terminal and rerun dosh update"
}
}
function Normalize-Arch { function Normalize-Arch {
$arch = if ($env:PROCESSOR_ARCHITEW6432) { $env:PROCESSOR_ARCHITEW6432 } else { $env:PROCESSOR_ARCHITECTURE } $arch = if ($env:PROCESSOR_ARCHITEW6432) { $env:PROCESSOR_ARCHITEW6432 } else { $env:PROCESSOR_ARCHITECTURE }
switch ($arch) { switch ($arch) {
@@ -433,7 +462,7 @@ function Install-FromSource {
if (-not $Repo) { if (-not $Repo) {
throw "DOSH_REPO is required when running the installer from irm/iex" throw "DOSH_REPO is required when running the installer from irm/iex"
} }
Require-Command git Ensure-Git
$sourceCache = Assert-SafeUpdateCache $UpdateCache $sourceCache = Assert-SafeUpdateCache $UpdateCache
$parent = Split-Path -Parent $sourceCache $parent = Split-Path -Parent $sourceCache
New-Item -ItemType Directory -Force -Path $parent | Out-Null New-Item -ItemType Directory -Force -Path $parent | Out-Null
+16
View File
@@ -219,6 +219,22 @@ fn windows_installer_bootstraps_rust_for_source_fallback_like_unix() {
assert!(!ps1.contains("Require-Command cargo")); assert!(!ps1.contains("Require-Command cargo"));
} }
#[test]
fn windows_installer_bootstraps_git_for_source_fallback_like_unix() {
let ps1 = include_str!("../install.ps1");
assert!(ps1.contains("function Ensure-Git"));
assert!(ps1.contains("git not found; installing Git with winget"));
assert!(ps1.contains("winget install --id Git.Git"));
assert!(ps1.contains("--accept-package-agreements --accept-source-agreements"));
assert!(ps1.contains("Join-Path $env:ProgramFiles \"Git\\cmd\""));
assert!(ps1.contains("Join-Path ${env:ProgramFiles(x86)} \"Git\\cmd\""));
assert!(ps1.contains("Join-Path $env:LOCALAPPDATA \"Programs\\Git\\cmd\""));
assert!(ps1.contains("PathList-Contains $env:Path $gitBin"));
assert!(ps1.contains("$env:Path = \"$gitBin;$env:Path\""));
assert!(ps1.contains("Ensure-Git"));
assert!(!ps1.contains("Require-Command git"));
}
#[test] #[test]
fn windows_installer_honors_quiet_update_mode() { fn windows_installer_honors_quiet_update_mode() {
let ps1 = include_str!("../install.ps1"); let ps1 = include_str!("../install.ps1");