check-version.ps1 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. ########################################
  2. Set-StrictMode -Version 3.0 #
  3. $ErrorActionPreference = "Stop" #
  4. ########################################
  5. [string]$FirmwareVersion = $args[0]
  6. [string]$ReleaseVersion = $args[1]
  7. [string]$RepoSelf = $args[2]
  8. [string]$RepoUnleashed = $args[3]
  9. [bool]$ForGithubActions = $true
  10. ################################################################################################################################
  11. function CleanInput
  12. {
  13. param(
  14. [string]
  15. $DurtyString
  16. )
  17. return $DurtyString -replace ('[^a-zA-Z\d_\-\,\.\t\n\r\:\;]', '')
  18. }
  19. ################################################################################################################################
  20. $Output = @{
  21. RELEASE_VERSION = $ReleaseVersion
  22. CURRENT_TAG = $FirmwareVersion
  23. REMOTE_TAG_INFO = $FirmwareVersion
  24. RELEASE_TYPE = 0
  25. }
  26. $Release = @(`
  27. (CleanInput `
  28. (gh release list -L 1 --repo $RepoUnleashed)`
  29. ) -split "`t")
  30. $FirmwareVersionNumber = 0
  31. $StoredFirmwareVersionNumber = 0
  32. $LatestFirmware = $Release[2]
  33. if ($Release[2] -match '\-(\d+)$')
  34. {
  35. $FirmwareVersionNumber = [int]($Matches[1])
  36. }
  37. else
  38. {
  39. Write-Error ('::error title=Invalid firmware number::Error during execution this tags {0}' -f $FirmwareVersionNumber)
  40. exit 1
  41. }
  42. if ($FirmwareVersion -match '\-(\d+)$')
  43. {
  44. $StoredFirmwareVersionNumber = [int]($Matches[1])
  45. }
  46. else
  47. {
  48. Write-Error ('::error title=Invalid STORED firmware number::Error during execution this version {0}' -f $FirmwareVersion)
  49. exit 1
  50. }
  51. $Delta = ( [DateTime]::Now - [DateTime]::Parse($Release[3]))
  52. Write-Host "FirmwareVersionNumber: $FirmwareVersionNumber, Delta: $Delta"
  53. #exit 0
  54. $NewVersionFw = $false
  55. Write-Host ('Latest firmware {0}' -f $FirmwareVersionNumber)
  56. $Output.REMOTE_TAG_INFO = Write-Host ('[{0}]({1}/releases/tag/{2})' `
  57. -f $LatestFirmware, $RepoUnleashed, $LatestFirmware)
  58. if (($FirmwareVersionNumber -gt $StoredFirmwareVersionNumber) -and ( $Delta -gt [TimeSpan]::FromMinutes(10)))
  59. {
  60. $Output.REMOTE_TAG_INFO = $LatestFirmware
  61. $NewVersionFw = $true
  62. }
  63. elseif ($FirmwareVersionNumber -lt $StoredFirmwareVersionNumber)
  64. {
  65. Write-Error ('::error title=Invalid check of stored::Version in repo: {0}, but we think it is {1}' `
  66. -f $FirmwareVersionNumber, $StoredFirmwareVersionNumber)
  67. exit 1
  68. }
  69. $PublishDates = (gh api -H "Accept: application/vnd.github+json" `
  70. -H "X-GitHub-Api-Version: 2022-11-28" "/repos/$( $RepoSelf )/releases?per_page=1" `
  71. | ConvertFrom-Json | Select-Object published_at, created_at)
  72. $LastPublished = ($null -eq $PublishDates.published_at ? $PublishDates.created_at : $PublishDates.published_at)
  73. $Delta = ([DateTime]::Now - $LastPublished)
  74. $Release = (gh api -H "Accept: application/vnd.github+json" `
  75. -H "X-GitHub-Api-Version: 2022-11-28" "/repos/$( $RepoSelf )/tags?per_page=1" `
  76. | ConvertFrom-Json).name
  77. Write-Host ('Release {0}' -f $Release) -ForegroundColor Gray -BackgroundColor Blue
  78. $LatestTag = $Release.Substring(1)
  79. $CurrentVersion = [version]::Parse($ReleaseVersion)
  80. $ParsedRepoVersion = [version]::Parse($LatestTag)
  81. Write-Host ('Current tag:Repos tag {0}, {1}' -f $CurrentVersion, $ParsedRepoVersion) `
  82. -ForegroundColor Gray -BackgroundColor Blue
  83. Write-Debug ('::debug Current tag:Repos tag {0}, {1}' -f $CurrentVersion, $ParsedRepoVersion)
  84. if (($CurrentVersion -lt $ParsedRepoVersion) -and ( $Delta -gt [TimeSpan]::FromMinutes(10)))
  85. {
  86. $Tag = ('{0}.{1}.{2}' -f $ParsedRepoVersion.Major, $ParsedRepoVersion.Minor, $ParsedRepoVersion.Build)
  87. $Output.RELEASE_VERSION = $Tag
  88. $Output.RELEASE_TYPE = 2
  89. Write-Host ('::warning title=New release!::Release {0}' -f $Tag)
  90. }
  91. elseif ( $NewVersionFw )
  92. {
  93. $Tag = ('{0}.{1}.{2}' -f $CurrentVersion.Major, $CurrentVersion.Minor, ($CurrentVersion.Build + 1))
  94. $Output.RELEASE_VERSION = $Tag
  95. $Output.RELEASE_TYPE = 1
  96. Write-Host ('::warning title=Firmware was changed!::New version is {0}, need to create release {1}' -f $LatestFirmware, $Tag)
  97. }
  98. elseif ( ($Delta -gt [TimeSpan]::FromMinutes(10)) -and ($CurrentVersion -gt $ParsedRepoVersion))
  99. {
  100. Write-Host ('::warning title=Invalid version!::Version in settings: {0}, but repo version is {1}. Going to change variable' `
  101. -f $CurrentVersion, $ParsedRepoVersion)
  102. $Output.RELEASE_VERSION = $ParsedRepoVersion
  103. $Output.RELEASE_TYPE = 3
  104. }
  105. else
  106. {
  107. # none to release
  108. Write-Host 'No new versions, sorry'
  109. }
  110. $Output.CURRENT_TAG = $LatestTag
  111. if($ForGithubActions) {
  112. $Plain = New-Object -TypeName "System.Text.StringBuilder";
  113. $Output.GetEnumerator() | ForEach-Object {
  114. [void]$Plain.Append($_.Key)
  115. [void]$Plain.Append('=')
  116. [void]$Plain.AppendLine($_.Value)
  117. }
  118. Write-Output $Plain.ToString()
  119. } else {
  120. $Output
  121. }