Private/Repository/Get-CgrSnapshotHistory.ps1

function Get-CgrSnapshotHistory {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [psobject] $Repository,

        [ValidateNotNullOrEmpty()]
        [string] $HostName = 'github.com',

        [ValidateRange(1, 100)]
        [int] $DisplayLimit = 10
    )

    $repositoryName = ConvertTo-CgrRepositoryName -Repository $Repository.FullName
    $encodedRepositoryName = $repositoryName.Split('/') | ForEach-Object { [uri]::EscapeDataString($_) }
    $repositoryPath = $encodedRepositoryName -join '/'

    $tags = @(Get-CgrGitHubApi -Path "/repos/$repositoryPath/tags?per_page=100" -HostName $HostName -Paginate)
    $releases = @(Get-CgrGitHubApi -Path "/repos/$repositoryPath/releases?per_page=100" -HostName $HostName -Paginate)

    $tagNames = @(
        $tags |
            ForEach-Object { [string] (Get-CgrObjectProperty -InputObject $_ -Name 'name') } |
            Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
    )

    $releaseRecords = @(
        $releases | ForEach-Object {
            [pscustomobject] @{
                TagName = [string] (Get-CgrObjectProperty -InputObject $_ -Name 'tag_name')
                Name = [string] (Get-CgrObjectProperty -InputObject $_ -Name 'name')
                Draft = [bool] (Get-CgrObjectProperty -InputObject $_ -Name 'draft')
                Prerelease = [bool] (Get-CgrObjectProperty -InputObject $_ -Name 'prerelease')
            }
        }
    )

    $versionLikePattern = '^(?:v)?\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$'
    $versionLikeTags = @($tagNames | Where-Object { $_ -match $versionLikePattern })

    [pscustomobject] @{
        PSTypeName = 'CopyGitHubRepo.SnapshotHistoricalRecords'
        SchemaVersion = 1
        TagCount = $tagNames.Count
        TagCountMayBeTruncated = $false
        TagNames = @($tagNames | Select-Object -First $DisplayLimit)
        VersionLikeTagNames = @($versionLikeTags | Select-Object -First $DisplayLimit)
        ReleaseCount = $releaseRecords.Count
        ReleaseCountMayBeTruncated = $false
        Releases = @($releaseRecords | Select-Object -First $DisplayLimit)
        TagsAreCopied = $false
        ReleasesAreCopied = $false
    }
}