function Invoke-FileLinter { <# .SYNOPSIS Runs the file linter for all src files found in current repository. .DESCRIPTION Invoke-FileLinter runs the basic file tests and generates a report file for furher usage in the drone pipeline. .INPUTS [None] .OUTPUTS [DroneHelper.FileLinter.Report] .EXAMPLE Invoke-FileLinter .NOTES #> [CmdletBinding()] [OutputType('DroneHelper.FileLinter.Report')] param ( [Parameter(Mandatory = $false)] [switch]$PassThru ) begin { } process { $FileSet = @() $Repo = Get-RepoPath $RawFiles = (Get-ChildItem -Path $Repo.src.Path -Recurse -File).FullName Write-Debug -Message ('EXCLUDE Filter. {0}' -f $Env:EXCLUDE) if ($Env:EXCLUDE) { $Files = $RawFiles -notmatch $Env:EXCLUDE Write-Debug -Message ('Raw File List: {0} | Filtered Files: {1}' -f $RawFiles.Count, $Files.Count) } else { $Files = $RawFiles } foreach ($file in $Files) { Write-Verbose -Message ('Running FileLinter tests for: {0}' -f $file) $FileResults = [PSCustomObject]@{ Name = $file FailedCount = 0 Tests = [ordered]@{ Encoding = (Test-FileEncoding -Path $file) BOM = (Test-FileBOM -Path $file) EOL = (Test-FileEOL -Path $file) EOF = (Test-FileEOF -Path $file) TAB = (Test-FileTab -Path $file) TailingWhite = (Test-FileTailingWhitespace -Path $file) } } Write-Verbose -Message ('Populating property FailedCount for current file.') foreach ($item in $FileResults.Tests.Keys.GetEnumerator()) { if (($FileResults.Tests.$item) -ne $true) { $FileResults.FailedCount++ } } $FileSet += [PSCustomObject]$FileResults } $LinterReport = [PSCustomObject]@{ Success = $null FilesCount = ($FileSet | Measure-Object).Count FailedCount = 0 Files = $FileSet } Write-Verbose -Message ('Populating total FailedCount property.') foreach ($i in $LinterReport.Files.FailedCount) { if ($i -ne 0) { $LinterReport.FailedCount = $LinterReport.FailedCount + $i } } if ($LinterReport.FailedCount -eq 0) { $LinterReport.Success = $true } else { $LinterReport.Success = $false } $LinterReport.PSObject.TypeNames.Insert(0, 'DroneHelper.FileLinter.Report') $LinterReport.Files | Out-String | Write-Verbose -Verbose $LinterReport | Format-Table -Property @( 'Success', 'FilesCount', 'FailedCount' ) | Out-String | Write-Verbose -Verbose $ResultParams = @{ Type = 'FileLinter' Path = $Repo.Build.FileLinterLogPath InputObject = $LinterReport } Write-ResultFile @ResultParams if (-not ($LinterReport.Success)) { Write-FailureStateFile -StepName 'FileLinter' throw 'FileLinter failed!' } } end { if ($PassThru.IsPresent) { Write-Output $LinterReport } } }