diff --git a/eng/common/scripts/ChangeLog-Operations.ps1 b/eng/common/scripts/ChangeLog-Operations.ps1 index 25423b0ea8ad5..2de780150145a 100644 --- a/eng/common/scripts/ChangeLog-Operations.ps1 +++ b/eng/common/scripts/ChangeLog-Operations.ps1 @@ -3,6 +3,7 @@ . "${PSScriptRoot}\SemVer.ps1" $RELEASE_TITLE_REGEX = "(?^\#+\s+(?$([AzureEngSemanticVersion]::SEMVER_REGEX))(\s+(?\(.+\))))" +$SECTIONS_HEADER_REGEX = "^###\s(?.*)" $CHANGELOG_UNRELEASED_STATUS = "(Unreleased)" $CHANGELOG_DATE_FORMAT = "yyyy-MM-dd" $RecommendedSectionHeaders = @("Features Added", "Breaking Changes", "Bugs Fixed", "Other Changes") @@ -56,7 +57,7 @@ function Get-ChangeLogEntriesFromContent { } else { if ($changeLogEntry) { - if ($line.Trim() -match "^###\s(?.*)") + if ($line.Trim() -match $SECTIONS_HEADER_REGEX) { $sectionName = $matches["sectionName"].Trim() $changeLogEntry.Sections[$sectionName] = @() @@ -289,3 +290,42 @@ function Set-ChangeLogContent { Set-Content -Path $ChangeLogLocation -Value $changeLogContent } + +function Remove-EmptySections { + param ( + [Parameter(Mandatory = $true)] + $ChangeLogEntry + ) + + $releaseContent = $ChangeLogEntry.ReleaseContent + $sectionsToRemove = @() + + if ($releaseContent.Count -gt 0) + { + $parsedSections = $ChangeLogEntry.Sections + $sanitizedReleaseContent = New-Object System.Collections.ArrayList(,$releaseContent) + + foreach ($key in @($parsedSections.Key)) + { + if ([System.String]::IsNullOrWhiteSpace($parsedSections[$key])) + { + for ($i = 0; $i -lt $sanitizedReleaseContent.Count; $i++) + { + $line = $sanitizedReleaseContent[$i] + if ($line -match $SECTIONS_HEADER_REGEX -and $matches["sectionName"].Trim() -eq $key) + { + $sanitizedReleaseContent.RemoveAt($i) + while($i -lt $sanitizedReleaseContent.Count -and [System.String]::IsNullOrWhiteSpace($sanitizedReleaseContent[$i])) + { + $sanitizedReleaseContent.RemoveAt($i) + } + $ChangeLogEntry.Sections.Remove($key) + break + } + } + } + } + $ChangeLogEntry.ReleaseContent = $sanitizedReleaseContent.ToArray() + } + return $changeLogEntry +} diff --git a/eng/common/scripts/Update-ChangeLog.ps1 b/eng/common/scripts/Update-ChangeLog.ps1 index 1524bd7318c1c..43e97918bea12 100644 --- a/eng/common/scripts/Update-ChangeLog.ps1 +++ b/eng/common/scripts/Update-ChangeLog.ps1 @@ -4,6 +4,7 @@ # Version : Version to add or replace in change log # Unreleased: Default is true. If it is set to false, then today's date will be set in verion title. If it is True then title will show "Unreleased" # ReplaceLatestEntryTitle: Replaces the latest changelog entry title. +# SanitizeEntry: Removes all empty section in the entry that is updated param ( [Parameter(Mandatory = $true)] @@ -13,7 +14,8 @@ param ( [Boolean]$Unreleased = $true, [Boolean]$ReplaceLatestEntryTitle = $false, [String]$ChangelogPath, - [String]$ReleaseDate + [String]$ReleaseDate, + [Boolean]$SanitizeEntry = $false ) Set-StrictMode -Version 3 @@ -106,47 +108,12 @@ if ($LatestsSorted[0] -ne $Version) { if ($ReplaceLatestEntryTitle) { - # Remove empty sections from content - $sanitizedContent = @() - $sectionContent = @() - $sectionContentCount = 0 - $latesVersionContent = $ChangeLogEntries[$LatestVersion].ReleaseContent - - foreach ($line in $latesVersionContent) - { - if ($line.StartsWith("### ") -or $sectionContentCount -gt 0) - { - if ($line.StartsWith("#") -and $sectionContentCount -gt 1) - { - $sanitizedContent += $sectionContent - $sectionContent = @() - $sectionContentCount = 0 - } - - if ($line.StartsWith("#") -and $sectionContentCount -eq 1) - { - $sectionContent = @() - $sectionContentCount = 0 - } - - $sectionContent += $line - if (-not [System.String]::IsNullOrWhiteSpace($line)) - { - $sectionContentCount++ - } - } - elseif ($sectionContent.Count -eq 0) - { - $sanitizedContent += $line - } - } - - if ($sectionContentCount -gt 1) + $entryToBeUpdated = $ChangeLogEntries[$LatestVersion] + if ($SanitizeEntry) { - $sanitizedContent += $sectionContent + $entryToBeUpdated = Remove-EmptySections -ChangeLogEntry $entryToBeUpdated } - - $newChangeLogEntry = New-ChangeLogEntry -Version $Version -Status $ReleaseStatus -Content $sanitizedContent + $newChangeLogEntry = New-ChangeLogEntry -Version $Version -Status $ReleaseStatus -Content $entryToBeUpdated LogDebug "Resetting latest entry title to [$($newChangeLogEntry.ReleaseTitle)]" $ChangeLogEntries.Remove($LatestVersion) if ($newChangeLogEntry) { @@ -162,6 +129,10 @@ elseif ($ChangeLogEntries.Contains($Version)) LogDebug "Updating ReleaseStatus for Version [$Version] to [$($ReleaseStatus)]" $ChangeLogEntries[$Version].ReleaseStatus = $ReleaseStatus $ChangeLogEntries[$Version].ReleaseTitle = "## $Version $ReleaseStatus" + if ($SanitizeEntry) + { + $ChangeLogEntries[$Version] = Remove-EmptySections -ChangeLogEntry $ChangeLogEntries[$Version] + } } else {