forked from microsoft/kiota
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompare-generation.ps1
executable file
·129 lines (108 loc) · 5.12 KB
/
compare-generation.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env pwsh
param(
[Parameter(Mandatory = $true)][string]$descriptionUrl,
[Parameter(Mandatory = $true)][string]$language,
[Parameter(Mandatory = $false)][switch]$dev,
[Parameter(Mandatory = $false)][switch]$preserveOutput
)
if ([string]::IsNullOrEmpty($descriptionUrl)) {
Write-Error "Description URL is empty"
exit 1
}
if ([string]::IsNullOrEmpty($language)) {
Write-Error "Language is empty"
exit 1
}
function New-TemporaryDirectory {
$parent = [System.IO.Path]::GetTempPath()
[string] $name = [System.Guid]::NewGuid()
New-Item -ItemType Directory -Path (Join-Path $parent $name)
}
$rootPath = Join-Path -Path $PSScriptRoot -ChildPath ".."
$Env:KIOTA_TUTORIAL_ENABLED = "false"
$executableName = "kiota"
if ($IsWindows) {
$executableName = "kiota.exe"
}
switch ($dev) {
$true {
Write-Warning "Using kiota in dev mode"
$kiotaExec = Join-Path -Path $rootPath -ChildPath "src" -AdditionalChildPath "kiota", "bin", "Debug", "net8.0", $executableName
break
}
default {
$kiotaExec = Join-Path -Path $rootPath -ChildPath "publish" -AdditionalChildPath $executableName
break
}
}
$targetOpenapiPath = Join-Path -Path $PSScriptRoot -ChildPath "openapi.yaml"
if (Test-Path $targetOpenapiPath) {
Remove-Item $targetOpenapiPath
}
if ($descriptionUrl.StartsWith("./") -or $descriptionUrl.StartsWith(".\\") -or
$descriptionUrl.Substring(1).StartsWith(":\") -or $descriptionUrl.Substring(1).StartsWith(":/") -or
$descriptionUrl.StartsWith("\") -or $descriptionUrl.StartsWith("/")) {
# relative path, absolute path windows, absolute path unix
Copy-Item -Path $descriptionUrl -Destination $targetOpenapiPath -Force
}
elseif ($descriptionUrl.StartsWith("http")) {
Invoke-WebRequest -Uri $descriptionUrl -OutFile $targetOpenapiPath
}
else {
$downloadProcess = Start-Process "$kiotaExec" -ArgumentList "download ${descriptionUrl} --clean-output --output $targetOpenapiPath" -Wait -NoNewWindow -PassThru
if ($downloadProcess.ExitCode -ne 0) {
Write-Error "Failed to download the openapi description"
exit 1
}
}
$tmpFolder1 = New-TemporaryDirectory
$tmpFolder2 = New-TemporaryDirectory
$additionalArgumentCmd = Join-Path -Path $PSScriptRoot -ChildPath "get-additional-arguments.ps1"
$additionalArguments = Invoke-Expression "$additionalArgumentCmd -descriptionUrl $descriptionUrl -language $language -includeOutputParameter $false"
$firstGenerationProcess = Start-Process "$kiotaExec" -ArgumentList "generate --exclude-backward-compatible --clean-output --language ${language} --openapi ${targetOpenapiPath}${additionalArguments} --dvr all --output $tmpFolder1" -Wait -NoNewWindow -PassThru
$secondGenerationProcess = Start-Process "$kiotaExec" -ArgumentList "generate --exclude-backward-compatible --clean-output --language ${language} --openapi ${targetOpenapiPath}${additionalArguments} --dvr all --output $tmpFolder2" -Wait -NoNewWindow -PassThru
if ($firstGenerationProcess.ExitCode -ne 0 -or $secondGenerationProcess.ExitCode -ne 0) {
Write-Error "Failed to generate the code for ${language}"
exit 1
}
# Remove variable output files
Remove-Item (Join-Path -Path $tmpFolder1 -ChildPath "kiota-lock.json")
if (Test-Path (Join-Path -Path $tmpFolder1 -ChildPath ".kiota.log")) {
Remove-Item -Force (Join-Path -Path $tmpFolder1 -ChildPath ".kiota.log")
}
Remove-Item (Join-Path -Path $tmpFolder2 -ChildPath "kiota-lock.json")
if (Test-Path (Join-Path -Path $tmpFolder2 -ChildPath ".kiota.log")) {
Remove-Item -Force (Join-Path -Path $tmpFolder2 -ChildPath ".kiota.log")
}
# Compare hashes
$HashString1 = (Get-ChildItem $tmpFolder1 -Recurse | where { ! $_.PSIsContainer } | Get-FileHash -Algorithm MD5).Hash | Out-String
Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString1))
$HashString2 = (Get-ChildItem $tmpFolder2 -Recurse | where { ! $_.PSIsContainer } | Get-FileHash -Algorithm MD5).Hash | Out-String
Get-FileHash -InputStream ([IO.MemoryStream]::new([char[]]$HashString2))
Write-Output "Folder 1: $tmpFolder1"
Write-Output "Folder 2: $tmpFolder2"
if ($HashString1 -eq $HashString2) {
Write-Output "The content of the folders is identical"
if (!$preserveOutput) {
Remove-Item $tmpFolder1 -Force -Recurse
Remove-Item $tmpFolder2 -Force -Recurse
}
Exit 0
}
else {
Write-Host "The content of the folders is NOT identical"
$resultsFolder = Join-Path -Path $rootPath -ChildPath "idempotency-results"
if (Test-Path $resultsFolder) {
Remove-Item $resultsFolder -Force -Verbose -Recurse
}
New-Item -ItemType Directory -Path $resultsFolder -Force
if ($dev -eq $false) {
$archivePath1 = Join-Path $resultsFolder -ChildPath "idempotency-folder1.zip"
$archivePath2 = Join-Path $resultsFolder -ChildPath "idempotency-folder2.zip"
Write-Host "Creating archives at location $archivePath1 and $archivePath2"
Compress-Archive -Path $tmpFolder1 -DestinationPath $archivePath1 -Force
Compress-Archive -Path $tmpFolder2 -DestinationPath $archivePath2 -Force
}
Write-Error "Comparison failed as the generated code is NOT identical"
Exit 1
}