From 18eb622850de850f0b63f7044765fb374599c330 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Tue, 17 Oct 2023 23:53:20 -0600 Subject: [PATCH] chore(pwsh): add tooling & configs --- .vimrc | 6 ++++++ _scripts/pwsh-fmt | 27 ++++++++++++++++++++++++ _scripts/pwsh-fmt.ps1 | 40 +++++++++++++++++++++++++++++++++++ _scripts/pwsh-lint | 36 +++++++++++++++++++++++++++++++ _scripts/pwsh-lint.ps1 | 48 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 .vimrc create mode 100755 _scripts/pwsh-fmt create mode 100755 _scripts/pwsh-fmt.ps1 create mode 100755 _scripts/pwsh-lint create mode 100755 _scripts/pwsh-lint.ps1 diff --git a/.vimrc b/.vimrc new file mode 100644 index 0000000..e9bdc05 --- /dev/null +++ b/.vimrc @@ -0,0 +1,6 @@ +" Note: You must enable per-project .vimrc in your ~/.vimrc +" set secure +" set exrc + +" PowerShell settings +let g:ale_powershell_psscriptanalyzer_exclusions = "PSAvoidUsingWriteHost,PSUseDeclaredVarsMoreThanAssignments" diff --git a/_scripts/pwsh-fmt b/_scripts/pwsh-fmt new file mode 100755 index 0000000..f993fd1 --- /dev/null +++ b/_scripts/pwsh-fmt @@ -0,0 +1,27 @@ +#!/bin/sh +set -e +set -u + +echo "Formatting */*.ps1 ... " +for my_ps1 in */*.ps1; do + my_dir="$( + dirname "${my_ps1}" + )" + if test -L "${my_ps1}" || + test -L "${my_dir}" || + ! test -f "${my_ps1}" || + ! test -d "${my_dir}"; then + printf ' SKIP %s (non-regular file or parent directory)\n' "${my_ps1}" + continue + fi + + printf " %s" "${my_ps1}" + + # -Settings ./Settings/CodeFormatting.psd1 + my_new_file="$( + pwsh -Command "Invoke-Formatter -ScriptDefinition (Get-Content -Path '${my_ps1}' -Raw)" + )" + printf '%s\n' "${my_new_file}" > "${my_ps1}" + + printf '\n' +done diff --git a/_scripts/pwsh-fmt.ps1 b/_scripts/pwsh-fmt.ps1 new file mode 100755 index 0000000..f6c9eef --- /dev/null +++ b/_scripts/pwsh-fmt.ps1 @@ -0,0 +1,40 @@ +#!/usr/bin/env pwsh + +$ErrorActionPreference = "Stop" + +Write-Host "Formatting */*.ps1 ... " + +$my_cwd = Get-Location +$my_dirs = Get-ChildItem -Directory +$my_status = 0 + +foreach ($my_dir in $my_dirs) { + + $my_files = Get-ChildItem -Path $my_dir.FullName -File -Filter *.ps1 + foreach ($my_file in $my_files) { + $my_ps1 = [System.IO.Path]::GetRelativePath($my_cwd, $my_file.FullName) + $my_dir = [System.IO.Path]::GetDirectoryName($my_file.FullName) + + if (-Not (Test-Path -PathType Leaf -Path $my_ps1) -or + -Not (Test-Path -PathType Container -Path $my_dir)) { + Write-Host (" SKIP {0} (non-regular file or parent directory)" -f $my_ps1) + continue + } + + Write-Host (" {0}" -f $my_ps1) + + $text = Get-Content -Path $my_ps1 -Raw + $my_new_file = Invoke-Formatter -ScriptDefinition $text + $my_new_file = $my_new_file.Trim() + + # note: trailing newline is added back on write + $my_new_file | Set-Content -Path $my_ps1 + + $my_new_file = $my_new_file + "`n" + IF ($text -ne $my_new_file) { + $my_status = 1 + } + } +} + +exit $my_status diff --git a/_scripts/pwsh-lint b/_scripts/pwsh-lint new file mode 100755 index 0000000..5a01c6d --- /dev/null +++ b/_scripts/pwsh-lint @@ -0,0 +1,36 @@ +#!/bin/sh +set -e +set -u + +echo "Formatting */*.ps1 ..." + +for my_ps1 in */*.ps1; do + my_dir="$( + dirname "${my_ps1}" + )" + if test -L "${my_ps1}" || + test -L "${my_dir}" || + ! test -f "${my_ps1}" || + ! test -d "${my_dir}"; then + printf ' SKIP %s (non-regular file or parent directory)\n' "${my_ps1}" + continue + fi + + printf " %s" "${my_ps1}" + + # -Settings ./PSScriptAnalyzerSettings.psd1 + pwsh -Command "Invoke-ScriptAnalyzer -Fix -ExcludeRule PSAvoidUsingWriteHost,PSUseDeclaredVarsMoreThanAssignment -Path '$my_ps1'" + + # + # fmt MUST happen after lint due to Byte-Order Marker (BOM) issues + # See https://github.com/PowerShell/PSScriptAnalyzer/issues/1743 + # + + # -Settings ./Settings/CodeFormatting.psd1 + my_new_file="$( + pwsh -Command "Invoke-Formatter -ScriptDefinition (Get-Content -Path '${my_ps1}' -Raw)" + )" + printf '%s\n' "${my_new_file}" > "${my_ps1}" + + printf '\n' +done diff --git a/_scripts/pwsh-lint.ps1 b/_scripts/pwsh-lint.ps1 new file mode 100755 index 0000000..f342a6a --- /dev/null +++ b/_scripts/pwsh-lint.ps1 @@ -0,0 +1,48 @@ +#!/usr/bin/env pwsh + +$ErrorActionPreference = "Stop" + +Write-Host "Linting */*.ps1 ... " + +$my_cwd = Get-Location +$my_dirs = Get-ChildItem -Directory +$my_status = 0 + +foreach ($my_dir in $my_dirs) { + + $my_files = Get-ChildItem -Path $my_dir.FullName -File -Filter *.ps1 + foreach ($my_file in $my_files) { + $my_ps1 = [System.IO.Path]::GetRelativePath($my_cwd, $my_file.FullName) + $my_dir = [System.IO.Path]::GetDirectoryName($my_file.FullName) + + if (-Not (Test-Path -PathType Leaf -Path $my_ps1) -or + -Not (Test-Path -PathType Container -Path $my_dir)) { + Write-Host (" SKIP {0} (non-regular file or parent directory)" -f $my_ps1) + continue + } + + Write-Host (" {0}" -f $my_ps1) + + $my_old_file = (Get-Content -Path $my_ps1 -Raw) + Invoke-ScriptAnalyzer -Fix -ExcludeRule PSAvoidUsingWriteHost, PSUseDeclaredVarsMoreThanAssignment -Path $my_ps1 + + # + # fmt MUST happen after lint due to Byte-Order Marker (BOM) issues + # See https://github.com/PowerShell/PSScriptAnalyzer/issues/1743 + # + + $my_fixed_file = (Get-Content -Path $my_ps1 -Raw) + $my_new_file = Invoke-Formatter -ScriptDefinition $my_fixed_file + $my_new_file = $my_new_file.Trim() + + # note: trailing newline is added back on write + $my_new_file | Set-Content -Path $my_ps1 + + $my_new_file = $my_new_file + "`n" + IF ($my_old_file -ne $my_new_file) { + $my_status = 1 + } + } +} + +exit $my_status