Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync eng/common directory with azure-sdk-tools for PR 9013 #37475

Merged
merged 6 commits into from
Sep 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 17 additions & 192 deletions eng/common/scripts/check-spelling-in-changed-files.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,16 @@ Optional location to use for cspell.json path. Default value is
.PARAMETER ExitWithError
Exit with error code 1 if spelling errors are detected.

.PARAMETER Test
Run test functions against the script logic
.PARAMETER SourceCommittish
Commit SHA (or ref) used for file list generation. This is the later commit. The
default value is useful for Azure DevOps pipelines. The default value is
`${env:SYSTEM_PULLREQUEST_SOURCECOMMITID}`

.PARAMETER TargetCommittish
Commit SHA (or ref) used for file list generation. This is the "base" commit.
The default value is useful for Azure DevOps pipelines. The default value is
`origin/${env:SYSTEM_PULLREQUEST_TARGETBRANCH}` with some string manipulation to
remove the `refs/heads/` prefix.

.EXAMPLE
./eng/common/scripts/check-spelling-in-changed-files.ps1
Expand All @@ -57,199 +65,14 @@ Param (
[switch] $ExitWithError,

[Parameter()]
[switch] $Test
[string]$SourceCommittish = "${env:SYSTEM_PULLREQUEST_SOURCECOMMITID}",

[Parameter()]
[string]$TargetCommittish = ("origin/${env:SYSTEM_PULLREQUEST_TARGETBRANCH}" -replace "refs/heads/")
)

Set-StrictMode -Version 3.0

function TestSpellChecker() {
Test-Exit0WhenAllFilesExcluded
ResetTest
Test-Exit1WhenIncludedFileHasSpellingError
ResetTest
Test-Exit0WhenIncludedFileHasNoSpellingError
ResetTest
Test-Exit1WhenChangedFileAlreadyHasSpellingError
ResetTest
Test-Exit0WhenUnalteredFileHasSpellingError
ResetTest
Test-Exit0WhenSpellingErrorsAndNoExitWithError
}

function Test-Exit0WhenAllFilesExcluded() {
# Arrange
"sepleing errrrrorrrrr" > ./excluded/excluded-file.txt
git add -A
git commit -m "One change"

# Act
&"$PSScriptRoot/check-spelling-in-changed-files.ps1" `
-CspellConfigPath "./.vscode/cspell.json" `
-SpellCheckRoot "./" `
-ExitWithError

# Assert
if ($LASTEXITCODE -ne 0) {
throw "`$LASTEXITCODE != 0"
}
}

function Test-Exit1WhenIncludedFileHasSpellingError() {
# Arrange
"sepleing errrrrorrrrr" > ./included/included-file.txt
git add -A
git commit -m "One change"

# Act
&"$PSScriptRoot/check-spelling-in-changed-files.ps1" `
-CspellConfigPath "./.vscode/cspell.json" `
-SpellCheckRoot "./" `
-ExitWithError

# Assert
if ($LASTEXITCODE -ne 1) {
throw "`$LASTEXITCODE != 1"
}
}

function Test-Exit0WhenIncludedFileHasNoSpellingError() {
# Arrange
"correct spelling" > ./included/included-file.txt
git add -A
git commit -m "One change"

# Act
&"$PSScriptRoot/check-spelling-in-changed-files.ps1" `
-CspellConfigPath "./.vscode/cspell.json" `
-SpellCheckRoot "./" `
-ExitWithError

# Assert
if ($LASTEXITCODE -ne 0) {
throw "`$LASTEXITCODE != 0"
}
}

function Test-Exit1WhenChangedFileAlreadyHasSpellingError() {
# Arrange
"sepleing errrrrorrrrr" > ./included/included-file.txt
git add -A
git commit -m "First change"

"A statement without spelling errors" >> ./included/included-file.txt
git add -A
git commit -m "Second change"

# Act
&"$PSScriptRoot/check-spelling-in-changed-files.ps1" `
-CspellConfigPath "./.vscode/cspell.json" `
-SpellCheckRoot "./" `
-ExitWithError

# Assert
if ($LASTEXITCODE -ne 1) {
throw "`$LASTEXITCODE != 1"
}
}

function Test-Exit0WhenUnalteredFileHasSpellingError() {
# Arrange
"sepleing errrrrorrrrr" > ./included/included-file-1.txt
git add -A
git commit -m "One change"

"A statement without spelling errors" > ./included/included-file-2.txt
git add -A
git commit -m "Second change"

# Act
&"$PSScriptRoot/check-spelling-in-changed-files.ps1" `
-CspellConfigPath "./.vscode/cspell.json" `
-SpellCheckRoot "./" `
-ExitWithError

# Assert
if ($LASTEXITCODE -ne 0) {
throw "`$LASTEXITCODE != 0"
}
}

function Test-Exit0WhenSpellingErrorsAndNoExitWithError() {
# Arrange
"sepleing errrrrorrrrr" > ./included/included-file-1.txt
git add -A
git commit -m "One change"

# Act
&"$PSScriptRoot/check-spelling-in-changed-files.ps1" `
-CspellConfigPath "./.vscode/cspell.json" `
-SpellCheckRoot "./"

# Assert
if ($LASTEXITCODE -ne 0) {
throw "`$LASTEXITCODE != 0"
}
}

function SetupTest($workingDirectory) {
Write-Host "Create test temp dir: $workingDirectory"
New-Item -ItemType Directory -Force -Path $workingDirectory | Out-Null

Push-Location $workingDirectory | Out-Null
git init

New-Item -ItemType Directory -Force -Path "./excluded"
New-Item -ItemType Directory -Force -Path "./included"
New-Item -ItemType Directory -Force -Path "./.vscode"

"Placeholder" > "./excluded/placeholder.txt"
"Placeholder" > "./included/placeholder.txt"

$configJsonContent = @"
{
"version": "0.1",
"language": "en",
"ignorePaths": [
".vscode/cspell.json",
"excluded/**"
]
}
"@
$configJsonContent > "./.vscode/cspell.json"

git add -A
git commit -m "Init"
}

function ResetTest() {
# Empty out the working tree
git checkout .
git clean -xdf

$revCount = git rev-list --count HEAD
if ($revCount -gt 1) {
# Reset N-1 changes so there is only the initial commit
$revisionsToReset = $revCount - 1
git reset --hard HEAD~$revisionsToReset
}
}

function TeardownTest($workingDirectory) {
Pop-Location | Out-Null
Write-Host "Remove test temp dir: $workingDirectory"
Remove-Item -Path $workingDirectory -Recurse -Force | Out-Null
}

if ($Test) {
$workingDirectory = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())

SetupTest $workingDirectory
TestSpellChecker
TeardownTest $workingDirectory
Write-Host "Test complete"
exit 0
}

$ErrorActionPreference = "Continue"
. $PSScriptRoot/common.ps1

Expand All @@ -266,7 +89,9 @@ if (!(Test-Path $CspellConfigPath)) {
# Lists names of files that were in some way changed between the
# current branch and default target branch. Excludes files that were deleted to
# prevent errors in Resolve-Path
$changedFilesList = Get-ChangedFiles
$changedFilesList = Get-ChangedFiles `
-SourceCommittish $SourceCommittish `
-TargetCommittish $TargetCommittish

$changedFiles = @()
foreach ($file in $changedFilesList) {
Expand Down
39 changes: 5 additions & 34 deletions eng/common/spelling/Invoke-Cspell.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ If set the PackageInstallCache will not be deleted. Use if there are multiple
calls to Invoke-Cspell.ps1 to prevent creating multiple working directories and
redundant calls `npm ci`.

.PARAMETER Test
Run test functions against the script logic

.EXAMPLE
./eng/common/scripts/Invoke-Cspell.ps1 -ScanGlobs 'sdk/*/*/PublicAPI/**/*.md'

Expand Down Expand Up @@ -64,10 +61,7 @@ param(
[string] $PackageInstallCache = (Join-Path ([System.IO.Path]::GetTempPath()) "cspell-tool-path"),

[Parameter()]
[switch] $LeavePackageInstallCache,

[Parameter()]
[switch] $Test
[switch] $LeavePackageInstallCache
)

Set-StrictMode -Version 3.0
Expand All @@ -82,30 +76,6 @@ if (!(Test-Path $CSpellConfigPath)) {
exit 1
}

function Test-VersionReportMatches() {
# Arrange
$expectedPackageVersion = '6.12.0'

# Act
$actual = &"$PSScriptRoot/Invoke-Cspell.ps1" `
-JobType '--version'

# Assert
if ($actual -ne $expectedPackageVersion) {
throw "Mismatched version. Expected:`n$expectedPackageVersion`n`nActual:`n$actual"
}
}

function TestInvokeCspell() {
Test-VersionReportMatches
}

if ($Test) {
TestInvokeCspell
Write-Host "Test complete"
exit 0
}

# Prepare the working directory if it does not already have requirements in
# place.
if (!(Test-Path $PackageInstallCache)) {
Expand Down Expand Up @@ -170,10 +140,11 @@ try {
npm ci | Write-Host

# Use the mutated configuration file when calling cspell
$command = "npx cspell $JobType --config $CSpellConfigPath --no-must-find-files --root $SpellCheckRoot --relative"
$command = "npm exec --no -- cspell $JobType --config $CSpellConfigPath --no-must-find-files --root $SpellCheckRoot --relative"
Write-Host $command
$cspellOutput = npx `
--no-install `
$cspellOutput = npm exec `
--no `
-- `
cspell `
$JobType `
--config $CSpellConfigPath `
Expand Down