# # This file should be kept in sync across https://www.github.com/dotnet/wpf and dotnet-wpf-int repos. # # One-time setup for Wpf's custom toolset function InitializeWpfCustomToolset() { if (Test-Path variable:global:_WpfToolsetBuildProj) { return $global:_WpfToolsetBuildProj } $nugetCache = GetNuGetPackageCachePath # Get all sdks listed in repo's 'global.json' file $msbuild_sdks = $GlobalJson.'msbuild-sdks' # Determine if WpfArcadeSdk is present in this repo's 'global.json' file. # # The Arcade.Wpf.Sdk will only be present in 'global.json' if it is not available in the # local repo (under repo_root/eng/wpfarcadesdk). The WpfArcadeSdk will be available # in the internal WPF repo's 'global.json' only (dotnet-wpf-int), as it needs to resolve # the location during build time from the NuGet cache. The public WPF GitHub repo has # a local copy of the WPF Arcade SDK and a 'global.json' entry for the sdk is not required. if ('Microsoft.DotNet.Arcade.Wpf.Sdk' -in $msbuild_sdks.PSobject.Properties.Name) { # Get the version of the Wpf Arcade SDK for the toolset location file name $wpfToolsetVersion = $GlobalJson.'msbuild-sdks'.'Microsoft.DotNet.Arcade.Wpf.Sdk' $wpfToolsetLocationFile = Join-Path $ToolsetDir "$wpfToolsetVersion.txt" # If toolset file already exists, one-time setup has already run if (Test-Path $wpfToolsetLocationFile) { $path = Get-Content $wpfToolsetLocationFile -TotalCount 1 if (Test-Path $path) { return $global:_WpfToolsetBuildProj = $path } } if (-not $restore) { Write-Host "Wpf Toolset version $toolsetVersion has not been restored." -ForegroundColor Red ExitWithExitCode 1 } # Install WPF git hooks when WpfArcadeSdk is located in the NuGet cache (dotnet-wpf-int) if (!$ci) { $installGitHooksProject = Join-Path $ToolsetDir "wpfInstallWPFPreCommitGitHook.proj" '' | Set-Content $installGitHooksProject $installGitHooksBinLog = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "InstallGitHooks.binlog") } else { "" } MSBuild $installGitHooksProject $installGitHooksBinlog /t:InstallWPFPreCommitGitHook /clp:ErrorsOnly`;NoSummary } # Write toolset location (e.g., dotnet-wpf-int\artifacts\toolset\4.8.0-preview7.19322.1.txt) $proj = Join-Path $ToolsetDir "wpfRestore.proj" $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "WpfToolsetRestore.binlog") } else { "" } '' | Set-Content $proj MSBuild $proj $bl /t:__WriteToolsetLocation /clp:ErrorsOnly`;NoSummary /p:__ToolsetLocationOutputFile=$wpfToolsetLocationFile # Verify toolset file was successfully written $path = Get-Content $wpfToolsetLocationFile -TotalCount 1 if (!(Test-Path $path)) { throw "Invalid toolset path: $path" } return $global:_WpfToolsetBuildProj = $path } } # Installs custom WPF git hook to prevent modification of generated files function InstallCustomWPFGitHooksFromLocalToolsPath { # Install the githook using the inline task if WpfArcadeSdk is located in # engineering root. This should only be the case for the public GitHub repo # (e.g., dotnet-wpf/eng/wpfarcadesdk.) $WPFArcadeSDKPath = Join-Path $EngRoot "wpfarcadesdk"; if (Test-Path $WPFArcadeSDKPath) { # Install the githook using the script $WPFPreCommitGitHookSource = Join-Path $EngRoot "wpfarcadesdk\tools\pre-commit.githook" $WPFPreCommitGitHookDest = Join-Path $RepoRoot ".git\hooks\pre-commit" if (-not (Test-Path $WPFPreCommitGitHookSource)) { Write-Host "WPF PreCommit GitHook file is missing: $WPFPreCommitGitHookSource" ExitWithExitCode 1 } Write-Host "Detecting WPF Git hooks..." if (-not (Test-Path $WPFPreCommitGitHookDest)) { Write-Host "Installing WPF Git pre-commit hook..." try { Copy-Item -Path $WPFPreCommitGitHookSource -Destination $WPFPreCommitGitHookDest } catch { Write-Host "Error: WPF Git pre-commit hook installation failed!" Write-Host $_ Write-Host $_.Exception Write-Host $_.ScriptStackTrace ExitWithExitCode 1 } } else { Write-Host "Detected existing WPF Git pre-commit hook." } } else { Write-Host "InstallCustomWPFGitHooks: WpfArcadeSdk was not available in repo's engineering root."; } } InitializeWpfCustomToolset if (!$ci) { InstallCustomWPFGitHooksFromLocalToolsPath } . $PsScriptRoot\common\init-tools-native.ps1 -InstallDirectory $PSScriptRoot\..\.tools\native -GlobalJsonFile $PSScriptRoot\..\global.json