Public/Get-GitChangeLog.Tools.ps1

Function Get-GitChangeLog {
    [cmdletbinding()]
    Param (
        [Parameter(ValueFromPipeline)]
        $InputObject
        ,
        [ValidateSet("Public", "Internal")]
        [string]
        $Audience
        ,
        [string]
        $WorkDir
        ,
        [int]
        $RequiredCommitMessageLength = 5
        ,
        [string]
        $ProjectName
        ,
        [string]
        $TagPrefix
        ,
        [string]
        $RemoteName = 'origin'
        ,
        [ValidateSet("psobject", "json", "md", "html")]
        [string]
        $OutputAs = 'md'
        ,
        [ValidateSet("Major", "Minor", "Build")]
        [String]
        $Latest = ''
        # Specify to retrieve the latest Major, Minor, Build
        ,
        [int]
        $Major
        ,
        [int]
        $Minor
        ,
        [switch]
        $toChangelog
        ,
        [int]
        $FetchDepth = 500
        ,
        [switch]
        $GitVersionContiniousDeploymentMode
    )
    If (!$Logs) {
        $logs = Get-GitHistory -TagPrefix $tagPrefix -FetchDepth $FetchDepth -GitVersionContiniousDeploymentMode:$GitVersionContiniousDeploymentMode
    }
    $Releases = Get-GitTagList -TagPrefix $TagPrefix -GitVersionContiniousDeploymentMode:$GitVersionContiniousDeploymentMode

    If ($Audience -eq 'Public' ) {
        $logs = $logs | Where-Object { $_.IntentAudience -ne 'Internal' }
    }

    $Releasedata = @()
    $filterReleaseParams =@{}
    
    If ($Latest) {
        $filterReleaseParams.Add('Latest',$Latest)
    }
    If ($Major) {
        $filterReleaseParams.Add('Major',$Major)
    }
    If ($Minor) {
        $filterReleaseParams.Add('Minor',$Minor)
    }
    If ($filterReleaseParams) {
        $Releases = Get-FilteredRelease @filterReleaseParams -Releases $Releases
    }
    # Print unreleased changes first if any
    If ($logs | Where-Object { $_.Release -eq 'Unreleased' } ) {
        $Releasedata += [ordered]@{
            Release       = 'Unreleased'
            ReleaseDate   = ''
            Component     = ''
            Version       = ''
            ReleaseCommit = git log --format="%H" -n 1
            Commits       = $logs | Where-Object { $_.Release -eq 'Unreleased' } | SOrt-Object -Property Order | Select-Object -Property * -ExcludeProperty Project, Release, Order
        }
    }

    Write-Information $Releases.Count Releases
    $Releasedata += ForEach ($Release in $Releases) {
        [ordered]@{
            Release       = $Release.Tag
            ReleaseDate   = $Release.Date
            Component     = $Release.Component
            Version       = [string]$Release.SemVerId
            ReleaseCommit = $Release.Commit
            Commits       = $logs | Where-Object { $_.Release -eq $Release.Tag } | SOrt-Object -Property Order | Select-Object -Property * -ExcludeProperty Project, Release, Order
        }
    }

    $ChangelogObject = @{
        Project  = $ProjectName
        Releases = $Releasedata
    }

    If ($OutputAs -eq 'psobject') {
        Return $ChangelogObject
    }


    If ($OutputAs -eq 'json') {
        Return ($ChangelogObject | ConvertTo-Json -depth 4)
    }
    If ($OutputAs -eq 'md') {
        $Changelog = ConvertTo-Changelog($ChangelogObject) -FormatAs md
        Return $Changelog
    } elseif ($OutputAs -eq 'html') {
        $Changelog = ConvertTo-Changelog($ChangelogObject) -FormatAs html
        Return $Changelog
    }
}