# DeployCenter - asynchronous Gitea release check # Compatible with Windows PowerShell 5.1 function ConvertTo-DeployCenterComparableVersion { [CmdletBinding()] param([Parameter(Mandatory=$true)][string]$VersionText) if ($VersionText -notmatch '(?i)(?:^|[-_])v?(?\d+(?:\.\d+){1,3})(?=$|[-+])') { return $null } $parts = @($Matches.Numeric.Split('.')) while ($parts.Count -lt 4) { $parts += '0' } try { return [version]::Parse(($parts -join '.')) } catch { return $null } } function Start-DeployCenterVersionCheck { [CmdletBinding()] param( [Parameter(Mandatory=$true)][string]$CurrentVersion, [Parameter(Mandatory=$true)][string]$ReleaseApiUrl ) try { [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor [System.Net.SecurityProtocolType]::Tls12 $request = [System.Net.HttpWebRequest]::Create($ReleaseApiUrl) $request.Method = 'GET' $request.Accept = 'application/json' $request.UserAgent = 'DeployCenter-VersionCheck/1.0' $request.Timeout = 4000 $request.ReadWriteTimeout = 4000 $request.KeepAlive = $false $asyncResult = $request.BeginGetResponse($null, $null) return [pscustomobject]@{ CurrentVersion = $CurrentVersion Request = $request AsyncResult = $asyncResult Completed = $false Update = $null } } catch { # This optional check must never interrupt startup or deployment. return $null } } function Complete-DeployCenterVersionCheck { [CmdletBinding()] param([Parameter(Mandatory=$true)]$Check) if ($Check.Completed -or -not $Check.AsyncResult.IsCompleted) { return $null } $Check.Completed = $true $response = $null $reader = $null try { $response = [System.Net.HttpWebResponse]$Check.Request.EndGetResponse($Check.AsyncResult) if ([int]$response.StatusCode -ne 200) { return $null } $reader = New-Object System.IO.StreamReader($response.GetResponseStream()) $release = ConvertFrom-Json -InputObject $reader.ReadToEnd() -ErrorAction Stop if ($release.draft -or [string]::IsNullOrWhiteSpace([string]$release.tag_name)) { return $null } $current = ConvertTo-DeployCenterComparableVersion -VersionText ([string]$Check.CurrentVersion) $latest = ConvertTo-DeployCenterComparableVersion -VersionText ([string]$release.tag_name) if ($null -eq $current -or $null -eq $latest -or $latest -le $current) { return $null } $Check.Update = [pscustomobject]@{ CurrentVersion = [string]$Check.CurrentVersion LatestVersion = [string]$release.tag_name } return $Check.Update } catch { # A network/API failure simply leaves the local version visible. return $null } finally { if ($null -ne $reader) { $reader.Dispose() } if ($null -ne $response) { $response.Dispose() } } } Export-ModuleMember -Function Start-DeployCenterVersionCheck, Complete-DeployCenterVersionCheck