mirror of
https://github.com/ChrisTitusTech/winutil
synced 2026-06-04 14:17:27 +00:00
simplify Compile.ps1 by alot (#4484)
* Update Compile.ps1 * Delete tools/Invoke-Preprocessing.ps1 * Update .gitignore * Update Compile.ps1 * Update Compile.ps1 * Update Compile.ps1 * Update Compile.ps1 * Update Compile.ps1 * Update .gitignore * Update Compile.ps1 * Update Compile.ps1 * Update Compile.ps1 * Merge branch 'main' into patch-5
This commit is contained in:
+25
-119
@@ -1,144 +1,50 @@
|
||||
param (
|
||||
[switch]$Run,
|
||||
[string]$Arguments
|
||||
[switch]$Run
|
||||
)
|
||||
|
||||
if ((Get-Item ".\winutil.ps1" -ErrorAction SilentlyContinue).IsReadOnly) {
|
||||
Remove-Item ".\winutil.ps1" -Force
|
||||
}
|
||||
|
||||
$OFS = "`r`n"
|
||||
$scriptname = "winutil.ps1"
|
||||
$workingdir = $PSScriptRoot
|
||||
$OFS = "`r`n" # Makes it so we dont need to add -Raw to every Get-Content command
|
||||
|
||||
# Variable to sync between runspaces
|
||||
$sync = [Hashtable]::Synchronized(@{})
|
||||
$sync.configs = @{}
|
||||
|
||||
function Update-Progress {
|
||||
param (
|
||||
[Parameter(Mandatory, position=0)]
|
||||
[string]$StatusMessage,
|
||||
# Create the script in memory.
|
||||
$script = [System.Collections.Generic.List[string]]::new()
|
||||
|
||||
[Parameter(Mandatory, position=1)]
|
||||
[ValidateRange(0,100)]
|
||||
[int]$Percent,
|
||||
|
||||
[Parameter(position=2)]
|
||||
[string]$Activity = "Compiling"
|
||||
)
|
||||
|
||||
Write-Progress -Activity $Activity -Status $StatusMessage -PercentComplete $Percent
|
||||
}
|
||||
|
||||
Update-Progress "Pre-req: Running Preprocessor..." 0
|
||||
|
||||
# Dot source the 'Invoke-Preprocessing' Function from 'tools/Invoke-Preprocessing.ps1' Script
|
||||
$preprocessingFilePath = ".\tools\Invoke-Preprocessing.ps1"
|
||||
. $preprocessingFilePath
|
||||
|
||||
$excludedFiles = @()
|
||||
|
||||
# Add directories only if they exist
|
||||
if (Test-Path '.\.git\') { $excludedFiles += '.\.git\' }
|
||||
if (Test-Path '.\binary\') { $excludedFiles += '.\binary\' }
|
||||
|
||||
# Add files that should always be excluded
|
||||
$excludedFiles += @(
|
||||
'.\.gitignore',
|
||||
'.\.gitattributes',
|
||||
'.\.github\CODEOWNERS',
|
||||
'.\LICENSE',
|
||||
"$preprocessingFilePath",
|
||||
'*.png',
|
||||
'.\.preprocessor_hashes.json'
|
||||
$script.Add(
|
||||
((Get-Content -Path scripts\start.ps1) -replace '#{replaceme}', (Get-Date -Format 'yy.MM.dd'))
|
||||
)
|
||||
|
||||
$msg = "Pre-req: Code Formatting"
|
||||
Invoke-Preprocessing -WorkingDir "$workingdir" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg
|
||||
$script.Add((Get-ChildItem -Path functions -Recurse -File | Get-Content))
|
||||
|
||||
# Create the script in memory.
|
||||
Update-Progress "Pre-req: Allocating Memory" 0
|
||||
$script_content = [System.Collections.Generic.List[string]]::new()
|
||||
Get-ChildItem config | ForEach-Object {
|
||||
$obj = Get-Content -Path $_.FullName | ConvertFrom-Json
|
||||
|
||||
Update-Progress "Adding: Version" 10
|
||||
$script_content.Add($(Get-Content "scripts\start.ps1").replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)"))
|
||||
|
||||
Update-Progress "Adding: Functions" 20
|
||||
Get-ChildItem "functions" -Recurse -File | ForEach-Object {
|
||||
$script_content.Add($(Get-Content $psitem.FullName))
|
||||
}
|
||||
Update-Progress "Adding: Config *.json" 40
|
||||
Get-ChildItem "config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
|
||||
$json = (Get-Content $psitem.FullName -Raw)
|
||||
$jsonAsObject = $json | ConvertFrom-Json
|
||||
|
||||
# Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file
|
||||
if ($psitem.Name -eq "applications.json") {
|
||||
foreach ($appEntryName in $jsonAsObject.PSObject.Properties.Name) {
|
||||
$appEntryContent = $jsonAsObject.$appEntryName
|
||||
$jsonAsObject.PSObject.Properties.Remove($appEntryName)
|
||||
$jsonAsObject | Add-Member -MemberType NoteProperty -Name "WPFInstall$appEntryName" -Value $appEntryContent
|
||||
if ($_.Name -eq "applications.json") {
|
||||
$fixed = [ordered]@{}
|
||||
foreach ($p in $obj.PSObject.Properties) {
|
||||
$fixed["WPFInstall$($p.Name)"] = $p.Value
|
||||
}
|
||||
$obj = [pscustomobject]$fixed
|
||||
}
|
||||
|
||||
# Line 90 requires no whitespace inside the here-strings, to keep formatting of the JSON in the final script.
|
||||
$json = @"
|
||||
$($jsonAsObject | ConvertTo-Json -Depth 3)
|
||||
"@
|
||||
$json = $obj | ConvertTo-Json -Depth 10
|
||||
|
||||
$sync.configs.$($psitem.BaseName) = $json | ConvertFrom-Json
|
||||
$script_content.Add($(Write-Output "`$sync.configs.$($psitem.BaseName) = @'`r`n$json`r`n'@ `| ConvertFrom-Json" ))
|
||||
$sync.configs[$_.BaseName] = $obj
|
||||
$script.Add("`$sync.configs.$($_.BaseName) = @'`r`n$json`r`n'@ | ConvertFrom-Json")
|
||||
}
|
||||
|
||||
# Read the entire XAML file as a single string, preserving line breaks
|
||||
$xaml = Get-Content "$workingdir\xaml\inputXML.xaml" -Raw
|
||||
$xaml = Get-Content -Path xaml\inputXML.xaml
|
||||
$script.Add('$inputXML = @''' + "`n" + $xaml + "`n" + '''@')
|
||||
|
||||
Update-Progress "Adding: Xaml " 90
|
||||
$autounattendXml = Get-Content -Path tools\autounattend.xml
|
||||
$script.Add("`$WinUtilAutounattendXml = @'`r`n$autounattendXml`r`n'@")
|
||||
|
||||
# Add the XAML content to $script_content using a here-string
|
||||
$script_content.Add(@"
|
||||
`$inputXML = @'
|
||||
$xaml
|
||||
'@
|
||||
"@)
|
||||
$script.Add((Get-Content -Path scripts\main.ps1))
|
||||
|
||||
Update-Progress "Adding: autounattend.xml" 95
|
||||
$autounattendRaw = Get-Content "$workingdir\tools\autounattend.xml" -Raw
|
||||
# Strip XML comments (<!-- ... -->, including multi-line)
|
||||
$autounattendRaw = [regex]::Replace($autounattendRaw, '<!--.*?-->', '', [System.Text.RegularExpressions.RegexOptions]::Singleline)
|
||||
# Drop blank lines and trim trailing whitespace per line
|
||||
$autounattendXml = ($autounattendRaw -split "`r?`n" |
|
||||
Where-Object { $_.Trim() -ne '' } |
|
||||
ForEach-Object { $_.TrimEnd() }) -join "`r`n"
|
||||
$script_content.Add(@"
|
||||
`$WinUtilAutounattendXml = @'
|
||||
$autounattendXml
|
||||
'@
|
||||
"@)
|
||||
Set-Content -Path winutil.ps1 -Value $script
|
||||
|
||||
$script_content.Add($(Get-Content "scripts\main.ps1"))
|
||||
|
||||
Update-Progress "Removing temporary files" 99
|
||||
Remove-Item "xaml\inputApp.xaml" -ErrorAction SilentlyContinue
|
||||
Remove-Item "xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
|
||||
Remove-Item "xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
|
||||
|
||||
Set-Content -Path "$scriptname" -Value ($script_content -join "`r`n") -Encoding ascii
|
||||
Write-Progress -Activity "Compiling" -Completed
|
||||
|
||||
Update-Progress -Activity "Validating" -StatusMessage "Checking winutil.ps1 Syntax" -Percent 0
|
||||
try {
|
||||
Get-Command -Syntax .\winutil.ps1 | Out-Null
|
||||
} catch {
|
||||
Write-Warning "Syntax Validation for 'winutil.ps1' has failed"
|
||||
Write-Host "$($Error[0])" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
Write-Progress -Activity "Validating" -Completed
|
||||
|
||||
if ($run) {
|
||||
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
|
||||
.\Winutil.ps1 $Arguments
|
||||
break
|
||||
if ($Run) {
|
||||
.\Winutil.ps1
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user