CheckFor-ProfileUpdate.psm1

Function CheckFor-ProfileUpdate {
    [CmdletBinding()]
    param( [string]$name = "" )

    BEGIN {

        Function Get-LastUpdated {
            [CmdletBinding()]
            param( [string]$name )

            Write-Verbose "Checking whether cached profile update file for $name exists."

            $cachedProfileUpdateFile = Get-CachedProfileUpdatePath -Name $name
            if (-not ([IO.File]::Exists($cachedProfileUpdateFile))) {
                Write-Verbose "Cached profile update file does not exist."
                return [DateTime]::MinValue
            }

            $line = Get-Content -Path $cachedProfileUpdateFile |`
                Select-Object -First 1

            $pattern = "\s*(?<ts>\d{4}(?:\-\d{2}){2}T\d{2}(?::\d{2}){2}\.\d{7}Z)\s*`$"
            if (-not ($line -match $pattern)) {
                Write-Verbose "Cached profile update file does not contain a date/time pattern."
                return [DateTime]::MinValue
            }

            $timestamp = [DateTime]::Parse($matches["ts"])
            $timestamp = $timestamp.ToUniversalTime()
            return $timestamp
        }
        Function Needs-Update {
            [CmdletBinding()]
            param( [string]$name )

            $DEFAULT_CHECK_FOR_UPDATES_FREQUENCY_IN_DAYS = 1
            $checkForUpdatesFrequencyInDays = $Env:CHECK_FOR_PWSH_PROFILE_UPDATES_FREQUENCY_IN_DAYS
            if (-not $checkForUpdatesFrequencyInDays) {
                $checkForUpdatesFrequencyInDays = $DEFAULT_CHECK_FOR_UPDATES_FREQUENCY_IN_DAYS
            }

            $lastUpdated = Get-LastUpdated -Name $name
            $now = (Get-Date).ToUniversalTime()

            Write-Verbose "$($name): Last updated: $lastUpdated; Now: $now."
            Write-Verbose "$($name): Last updated: $(($now - $lastUpdated).TotalDays) days ago."
            Write-Verbose "$($name): Checking for updates every $checkForUpdatesFrequencyInDays days."
            Write-Verbose "$($name): Do we need to check for updates: $(($now - $lastUpdated).TotalDays -gt $checkForUpdatesFrequencyInDays)."

            if (($now - $lastUpdated).TotalDays -gt $checkForUpdatesFrequencyInDays) {
                $version = Get-ProfileVersion -Name $name
                $remoteVer = Get-ProfileVersion -Name $name -Remote
                Write-Verbose "Checking timestamp for profile $name."
                Write-Verbose "Local version: $version; Remote version: $remoteVer"
                $needsUpdate = ($remoteVer -gt $version)
                if (-not $needsUpdate){
                    Write-Verbose "Updating last update check timestamp for profile $name."
                    Set-LastUpdatedProfile -Name $name
                }
                return $needsUpdate
            } else {
                Write-Verbose "Skipped checking for updates for profile $name."
            }

            return $false
        }
    }

    PROCESS {
        if (($name -ne "profiles") -and (Needs-Update -Name $name)) {
            $_n = "Profile '$name' "; $_a = "$name "
            if (-not $name) { $_n = "Main profile "; $_a = "" }
            Write-Host "$($_n)has new version. Type 'update-profile $($_a)-reload' to update." -ForegroundColor Yellow

            return $true
        }

        return $false
    }
}