diff --git a/bin/checkver.ps1 b/bin/checkver.ps1 index ea4a92cac6..8afb8c5df7 100644 --- a/bin/checkver.ps1 +++ b/bin/checkver.ps1 @@ -213,7 +213,13 @@ while ($in_progress -gt 0) { } if ($jsonpath) { - $ver = json_path $page $jsonpath + # Return only a single value if regex is absent + $noregex = [String]::IsNullOrEmpty($regex) + # If reverse is ON and regex is ON, + # Then reverse would have no effect because regex handles reverse + # on its own + # So in this case we have to disable reverse + $ver = json_path $page $jsonpath $null ($reverse -and $noregex) $noregex if (!$ver) { $ver = json_path_legacy $page $jsonpath } diff --git a/lib/json.ps1 b/lib/json.ps1 index f3b6c97f1a..0405ff5bfa 100644 --- a/lib/json.ps1 +++ b/lib/json.ps1 @@ -92,31 +92,33 @@ function ConvertToPrettyJson { } } -function json_path([String] $json, [String] $jsonpath, [Hashtable] $substitutions) { +function json_path([String] $json, [String] $jsonpath, [Hashtable] $substitutions, [Boolean] $reverse, [Boolean] $single) { Add-Type -Path "$psscriptroot\..\supporting\validator\bin\Newtonsoft.Json.dll" if ($null -ne $substitutions) { $jsonpath = substitute $jsonpath $substitutions ($jsonpath -like "*=~*") } try { - $obj = [Newtonsoft.Json.Linq.JObject]::Parse($json) + $obj = [Newtonsoft.Json.Linq.JValue]::Parse($json) } catch [Newtonsoft.Json.JsonReaderException] { - try { - $obj = [Newtonsoft.Json.Linq.JArray]::Parse($json) - } catch [Newtonsoft.Json.JsonReaderException] { - return $null - } + return $null } - try { - try { - $result = $obj.SelectToken($jsonpath, $true) - } catch [Newtonsoft.Json.JsonException] { - return $null + $result = $obj.SelectTokens($jsonpath, $true) + if ($reverse) { + # Return versions in reverse order + $result = [System.Linq.Enumerable]::Reverse($result) } - return $result.ToString() - } catch [System.Management.Automation.MethodInvocationException] { - write-host -f DarkRed $_ - return $null + if ($single) { + # Extract First value + $result = [System.Linq.Enumerable]::First($result) + # Convert first value to string + $result = $result.ToString() + } else { + $result = "$([String]::Join('\n', $result))" + } + return $result + } catch [Exception] { + Write-Host $_ -ForegroundColor DarkRed } return $null