From 3c634a5b8738936e0bfee360b9a2c23b7839ead2 Mon Sep 17 00:00:00 2001 From: "Mr.k" Date: Mon, 19 Aug 2024 21:20:14 +0300 Subject: [PATCH] Improve Compile Script a bit Deduplicating a lot of un-needed pre-fixes - Improve implementation for 'Invoke-Preprocessing' Script Tool --- Compile.ps1 | 41 +++++++++-------- functions/private/Get-TabXaml.ps1 | 2 +- tools/Invoke-Preprocessing.ps1 | 75 ++++++++++++++++++++++--------- 3 files changed, 78 insertions(+), 40 deletions(-) diff --git a/Compile.ps1 b/Compile.ps1 index f86fbce6..2e42c480 100644 --- a/Compile.ps1 +++ b/Compile.ps1 @@ -7,6 +7,9 @@ $OFS = "`r`n" $scriptname = "winutil.ps1" $workingdir = $PSScriptRoot +Push-Location +Set-Location $workingdir + # Variable to sync between runspaces $sync = [Hashtable]::Synchronized(@{}) $sync.PSScriptRoot = $workingdir @@ -41,11 +44,11 @@ if (-NOT $SkipPreprocessing) { # Dot source the 'Invoke-Preprocessing' Function from 'tools/Invoke-Preprocessing.ps1' Script $preprocessingFilePath = ".\tools\Invoke-Preprocessing.ps1" - . "$(($workingdir -replace ('\\$', '')) + '\' + ($preprocessingFilePath -replace ('\.\\', '')))" + . $preprocessingFilePath $excludedFiles = @('.\.git\', '.\.gitignore', '.\.gitattributes', '.\.github\CODEOWNERS', '.\LICENSE', "$preprocessingFilePath", '*.png', '*.exe') $msg = "Pre-req: Code Formatting" - Invoke-Preprocessing -WorkingDir "$workingdir" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg + Invoke-Preprocessing -WorkingDir "$workingdir" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg -ThrowExceptionOnEmptyFilesList } # Create the script in memory. @@ -56,14 +59,14 @@ Update-Progress "Adding: Header" 5 $script_content.Add($header) Update-Progress "Adding: Version" 10 -$script_content.Add($(Get-Content "$workingdir\scripts\start.ps1").replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)")) +$script_content.Add($(Get-Content "scripts\start.ps1").replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)")) Update-Progress "Adding: Functions" 20 -Get-ChildItem "$workingdir\functions" -Recurse -File | ForEach-Object { +Get-ChildItem "functions" -Recurse -File | ForEach-Object { $script_content.Add($(Get-Content $psitem.FullName)) } Update-Progress "Adding: Config *.json" 40 -Get-ChildItem "$workingdir\config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object { +Get-ChildItem "config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object { $json = (Get-Content $psitem.FullName).replace("'","''") @@ -108,10 +111,10 @@ Get-ChildItem "$workingdir\config" | Where-Object {$psitem.extension -eq ".json" $script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" )) } -$xaml = (Get-Content "$workingdir\xaml\inputXML.xaml").replace("'","''") +$xaml = (Get-Content "xaml\inputXML.xaml").replace("'","''") # Dot-source the Get-TabXaml function -. "$workingdir\functions\private\Get-TabXaml.ps1" +. "functions\private\Get-TabXaml.ps1" Update-Progress "Building: Xaml " 75 $appXamlContent = Get-TabXaml "applications" 5 @@ -127,28 +130,27 @@ $xaml = $xaml -replace "{{InstallPanel_features}}", $featuresXamlContent $script_content.Add($(Write-output "`$inputXML = '$xaml'")) -$script_content.Add($(Get-Content "$workingdir\scripts\main.ps1")) +$script_content.Add($(Get-Content "scripts\main.ps1")) if ($Debug) { Update-Progress "Writing debug files" 95 - $appXamlContent | Out-File -FilePath "$workingdir\xaml\inputApp.xaml" -Encoding ascii - $tweaksXamlContent | Out-File -FilePath "$workingdir\xaml\inputTweaks.xaml" -Encoding ascii - $featuresXamlContent | Out-File -FilePath "$workingdir\xaml\inputFeatures.xaml" -Encoding ascii + $appXamlContent | Out-File -FilePath "xaml\inputApp.xaml" -Encoding ascii + $tweaksXamlContent | Out-File -FilePath "xaml\inputTweaks.xaml" -Encoding ascii + $featuresXamlContent | Out-File -FilePath "xaml\inputFeatures.xaml" -Encoding ascii } else { Update-Progress "Removing temporary files" 99 - Remove-Item "$workingdir\xaml\inputApp.xaml" -ErrorAction SilentlyContinue - Remove-Item "$workingdir\xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue - Remove-Item "$workingdir\xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue + Remove-Item "xaml\inputApp.xaml" -ErrorAction SilentlyContinue + Remove-Item "xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue + Remove-Item "xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue } -Set-Content -Path "$workingdir\$scriptname" -Value ($script_content -join "`r`n") -Encoding ascii +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 { $null = Get-Command -Syntax .\winutil.ps1 -} -catch { +} catch { Write-Warning "Syntax Validation for 'winutil.ps1' has failed" Write-Host "$($Error[0])" -ForegroundColor Red } @@ -156,9 +158,10 @@ Write-Progress -Activity "Validating" -Completed if ($run) { try { - Start-Process -FilePath "pwsh" -ArgumentList "$workingdir\$scriptname" + Start-Process -FilePath "pwsh" -ArgumentList "$scriptname" } catch { - Start-Process -FilePath "powershell" -ArgumentList "$workingdir\$scriptname" + Start-Process -FilePath "powershell" -ArgumentList "$scriptname" } } +Pop-Location diff --git a/functions/private/Get-TabXaml.ps1 b/functions/private/Get-TabXaml.ps1 index 5eef6417..c58974f1 100644 --- a/functions/private/Get-TabXaml.ps1 +++ b/functions/private/Get-TabXaml.ps1 @@ -119,7 +119,7 @@ function Get-TabXaml { } # Dot-source the Get-WPFObjectName function - . "$($sync.PSScriptRoot)\functions\private\Get-WPFObjectName.ps1" + . "functions\private\Get-WPFObjectName.ps1" $categorycontent = $($category -replace '^.__', '') $categoryname = Get-WPFObjectName -type "Label" -name $categorycontent diff --git a/tools/Invoke-Preprocessing.ps1 b/tools/Invoke-Preprocessing.ps1 index 22130d4f..092799d2 100644 --- a/tools/Invoke-Preprocessing.ps1 +++ b/tools/Invoke-Preprocessing.ps1 @@ -73,6 +73,18 @@ } $count = $ExcludedFiles.Count + + # Make sure there's a * at the end of folders in ExcludedFiles list + if ($count -gt 0) { + for ($i = 0; $i -lt $count; $i++) { + $excludedFile = $ExcludedFiles[$i] + $isFolder = ($excludedFile) -match '\\$' + if ($isFolder) { $ExcludedFiles[$i] = $excludedFile + '*' } + } + } + + # Validate the ExcludedFiles List before continuing on, + # that's if there's a list in the first place, and '-SkipExcludedFilesValidation' was not provided. if ((-NOT ($count -eq 0)) -AND (-NOT $SkipExcludedFilesValidation)) { for ($i = 0; $i -lt $count; $i++) { $excludedFile = $ExcludedFiles[$i] @@ -83,11 +95,49 @@ } $failedFilesList = $failedFilesList -replace (',\s*$', '') if (-NOT $failedFilesList -eq "") { - throw "[Invoke-Preprocessing] One or more File Paths & File Patterns were not found, you can use '-SkipExcludedFilesValidation' switch to skip this check, and the failed files are: $failedFilesList" + throw "[Invoke-Preprocessing] One or more File Paths and/or File Patterns were not found, you can use '-SkipExcludedFilesValidation' switch to skip this check, the failed to validate are: $failedFilesList" } } - $files = Get-ChildItem $WorkingDir -Recurse -Exclude $ExcludedFiles -File + # Get Files List + [System.Collections.ArrayList]$files = Get-ChildItem $WorkingDir -Recurse -Exclude $ExcludedFiles -File + $numOfFiles = $files.Count + + # Only keep the 'FullName' Property for every entry in the list + for ($i = 0; $i -lt $numOfFiles; $i++) { + $file = $files[$i] + $files[$i] = $file.FullName + } + + # If a file(s) are found in Exclude List, + # Remove the file from files list. + for ($j = 0; $j -lt $excludedFiles.Count; $j++) { + # Prepare some variables + $excluded = $excludedFiles[$j] + $pathToFind = ($excluded) -replace ('^\.\\', '') + $pathToFind = $WorkingDir + '\' + $pathToFind + $index = -1 # reset index on every iteration + + # Handle paths with wildcards in a different implementation + $matches = ($pathToFind) -match '^.*?\*' + + if ($matches) { + $filesToCheck = Get-ChildItem -Recurse -Path "$pathToFind" -File + if ($filesToCheck) { + for ($k = 0; $k -lt $filesToCheck.Count; $k++) { + $fileToCheck = $filesToCheck[$k] + $index = $files.IndexOf("$fileToCheck") + if ($index -ge 0) { $files.RemoveAt($index) } + } + } + } else { + $index = $files.IndexOf("$pathToFind") + if ($index -ge 0) { $files.RemoveAt($index) } + } + } + + # Make sure 'numOfFiles' is synced with the actual Number of Files found in '$files' + # This's done because previous may or may not edit the files list, so we should update it $numOfFiles = $files.Count if ($numOfFiles -eq 0) { @@ -99,26 +149,11 @@ } for ($i = 0; $i -lt $numOfFiles; $i++) { - $file = $files[$i] - - # If the file is in Exclude List, don't proceed to check/modify said file. - $fileIsExcluded = $False - for ($j = 0; $j -lt $excludedFiles.Count; $j++) { - $excluded = $excludedFiles[$j] - $strToCompare = ($excluded) -replace ('^\.\\', '') - if ($file.FullName.Contains("$strToCompare")) { - $fileIsExcluded = $True - break - } - } - - if ($fileIsExcluded) { - continue - } + $fullFileName = $files[$i] # TODO: # make more formatting rules, and document them in WinUtil Official Documentation - (Get-Content "$file").TrimEnd() ` + (Get-Content "$fullFileName").TrimEnd() ` -replace ('\t', ' ') ` -replace ('\)\s*\{', ') {') ` -replace ('(?if|for|foreach)\s*(?\([.*?]\))\s*\{', '${keyword} ${condition} {') ` @@ -130,7 +165,7 @@ -replace ('\}\s*Catch\s*(?(\[.*?\]\s*(\,)?\s*)+)\s*\{', '} catch ${exceptions} {') ` -replace ('\}\s*Catch\s*(?\[.*?\])\s*\{', '} catch ${exceptions} {') ` -replace ('(?\[.*?\])\s*(?\$.*?(,|\s*\)))', '${parameter_type}${str_after_type}') ` - | Set-Content "$file" + | Set-Content "$fullFileName" Write-Progress -Activity $ProgressActivity -Status "$ProgressStatusMessage - Finished $i out of $numOfFiles" -PercentComplete (($i/$numOfFiles)*100) }