Skip to content

Commit 91d4dc7

Browse files
Sync eng/common directory with azure-sdk-tools for PR 1153 (Azure#17578)
* Improve Update-ChangeLog Logic * Updates to ChangeLog-Operations.ps1, copy-docs-to-blobstorage.ps1, Invoke-GitHubAPI.ps1 and Package-Properties.ps1 * More changeLog Logic Improvements * Update date parsing Co-authored-by: Chidozie Ononiwu <chononiw@microsoft.com>
1 parent 559a8c1 commit 91d4dc7

File tree

4 files changed

+234
-21
lines changed

4 files changed

+234
-21
lines changed

eng/common/scripts/ChangeLog-Operations.ps1

Lines changed: 101 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Common Changelog Operations
2+
. "${PSScriptRoot}\logging.ps1"
3+
. "${PSScriptRoot}\SemVer.ps1"
24

3-
$RELEASE_TITLE_REGEX = "(?<releaseNoteTitle>^\#+.*(?<version>\b\d+\.\d+\.\d+([^0-9\s][^\s:]+)?)(\s(?<releaseStatus>\(Unreleased\)|\(\d{4}-\d{2}-\d{2}\)))?)"
5+
$RELEASE_TITLE_REGEX = "(?<releaseNoteTitle>^\#+.*(?<version>\b\d+\.\d+\.\d+([^0-9\s][^\s:]+)?)(\s+(?<releaseStatus>\(Unreleased\)|\(\d{4}-\d{2}-\d{2}\)))?)"
6+
$CHANGELOG_UNRELEASED_STATUS = "(Unreleased)"
7+
$CHANGELOG_DATE_FORMAT = "yyyy-MM-dd"
48

59
# Returns a Collection of changeLogEntry object containing changelog info for all version present in the gived CHANGELOG
610
function Get-ChangeLogEntries {
@@ -11,7 +15,7 @@ function Get-ChangeLogEntries {
1115

1216
$changeLogEntries = @{}
1317
if (!(Test-Path $ChangeLogLocation)) {
14-
Write-Error "ChangeLog[${ChangeLogLocation}] does not exist"
18+
LogError "ChangeLog[${ChangeLogLocation}] does not exist"
1519
return $null
1620
}
1721

@@ -23,9 +27,9 @@ function Get-ChangeLogEntries {
2327
if ($line -match $RELEASE_TITLE_REGEX) {
2428
$changeLogEntry = [pscustomobject]@{
2529
ReleaseVersion = $matches["version"]
26-
ReleaseStatus = $matches["releaseStatus"]
27-
ReleaseTitle = $line
28-
ReleaseContent = @() # Release content without the version title
30+
ReleaseStatus = $matches["releaseStatus"]
31+
ReleaseTitle = "## {0} {1}" -f $matches["version"], $matches["releaseStatus"]
32+
ReleaseContent = @()
2933
}
3034
$changeLogEntries[$changeLogEntry.ReleaseVersion] = $changeLogEntry
3135
}
@@ -72,6 +76,7 @@ function Get-ChangeLogEntryAsString {
7276
return ChangeLogEntryAsString $changeLogEntry
7377
}
7478

79+
7580
function ChangeLogEntryAsString($changeLogEntry) {
7681
if (!$changeLogEntry) {
7782
return "[Missing change log entry]"
@@ -93,7 +98,7 @@ function Confirm-ChangeLogEntry {
9398
$changeLogEntry = Get-ChangeLogEntry -ChangeLogLocation $ChangeLogLocation -VersionString $VersionString
9499

95100
if (!$changeLogEntry) {
96-
Write-Error "ChangeLog[${ChangeLogLocation}] does not have an entry for version ${VersionString}."
101+
LogError "ChangeLog[${ChangeLogLocation}] does not have an entry for version ${VersionString}."
97102
return $false
98103
}
99104

@@ -103,28 +108,108 @@ function Confirm-ChangeLogEntry {
103108
Write-Host "-----"
104109

105110
if ([System.String]::IsNullOrEmpty($changeLogEntry.ReleaseStatus)) {
106-
Write-Error "Entry does not have a correct release status. Please ensure the status is set to a date '(yyyy-MM-dd)' or '(Unreleased)' if not yet released."
111+
LogError "Entry does not have a correct release status. Please ensure the status is set to a date '($CHANGELOG_DATE_FORMAT)' or '$CHANGELOG_UNRELEASED_STATUS' if not yet released."
107112
return $false
108113
}
109114

110115
if ($ForRelease -eq $True) {
111-
if ($changeLogEntry.ReleaseStatus -eq "(Unreleased)") {
112-
Write-Error "Entry has no release date set. Please ensure to set a release date with format 'yyyy-MM-dd'."
116+
if ($changeLogEntry.ReleaseStatus -eq $CHANGELOG_UNRELEASED_STATUS) {
117+
LogError "Entry has no release date set. Please ensure to set a release date with format '$CHANGELOG_DATE_FORMAT'."
113118
return $false
114119
}
120+
else {
121+
$status = $changeLogEntry.ReleaseStatus.Trim().Trim("()")
122+
try {
123+
[DateTime]$status
124+
}
125+
catch {
126+
LogError "Invalid date [ $status ] passed as status for Version [$($changeLogEntry.ReleaseVersion)]."
127+
return $false
128+
}
129+
}
115130

116131
if ([System.String]::IsNullOrWhiteSpace($changeLogEntry.ReleaseContent)) {
117-
Write-Error "Entry has no content. Please ensure to provide some content of what changed in this version."
132+
LogError "Entry has no content. Please ensure to provide some content of what changed in this version."
118133
return $false
119134
}
120135
}
121136
return $true
122137
}
123138

124-
function Set-TestChangeLog($TestVersion, $changeLogFile, $ReleaseEntry) {
125-
Set-Content -Path $changeLogFile -Value @"
126-
# Release History
127-
## $TestVersion ($(Get-Date -f "yyyy-MM-dd"))
128-
- $ReleaseEntry
129-
"@
139+
function New-ChangeLogEntry {
140+
param (
141+
[Parameter(Mandatory = $true)]
142+
[ValidateNotNullOrEmpty()]
143+
[String]$Version,
144+
[String]$Status=$CHANGELOG_UNRELEASED_STATUS,
145+
[String[]]$Content
146+
)
147+
148+
# Validate RelaseStatus
149+
$Status = $Status.Trim().Trim("()")
150+
if ($Status -ne "Unreleased") {
151+
try {
152+
$Status = ([DateTime]$Status).ToString($CHANGELOG_DATE_FORMAT)
153+
}
154+
catch {
155+
LogWarning "Invalid date [ $Status ] passed as status for Version [$Version]. Please use a valid date in the format '$CHANGELOG_DATE_FORMAT' or use '$CHANGELOG_UNRELEASED_STATUS'"
156+
return $null
157+
}
158+
}
159+
$Status = "($Status)"
160+
161+
# Validate Version
162+
try {
163+
$Version = ([AzureEngSemanticVersion]::ParseVersionString($Version)).ToString()
164+
}
165+
catch {
166+
LogWarning "Invalid version [ $Version ]."
167+
return $null
168+
}
169+
170+
if (!$Content) { $Content = @() }
171+
172+
$newChangeLogEntry = [pscustomobject]@{
173+
ReleaseVersion = $Version
174+
ReleaseStatus = $Status
175+
ReleaseTitle = "## $Version $Status"
176+
ReleaseContent = $Content
177+
}
178+
179+
return $newChangeLogEntry
180+
}
181+
182+
function Set-ChangeLogContent {
183+
param (
184+
[Parameter(Mandatory = $true)]
185+
[String]$ChangeLogLocation,
186+
[Parameter(Mandatory = $true)]
187+
$ChangeLogEntries
188+
)
189+
190+
$changeLogContent = @()
191+
$changeLogContent += "# Release History"
192+
$changeLogContent += ""
193+
194+
try
195+
{
196+
$VersionsSorted = [AzureEngSemanticVersion]::SortVersionStrings($ChangeLogEntries.Keys)
197+
}
198+
catch {
199+
LogError "Problem sorting version in ChangeLogEntries"
200+
return
201+
}
202+
203+
foreach ($version in $VersionsSorted) {
204+
$changeLogEntry = $ChangeLogEntries[$version]
205+
$changeLogContent += $changeLogEntry.ReleaseTitle
206+
if ($changeLogEntry.ReleaseContent.Count -eq 0) {
207+
$changeLogContent += @("","")
208+
}
209+
else {
210+
$changeLogContent += $changeLogEntry.ReleaseContent
211+
}
212+
}
213+
214+
Set-Content -Path $ChangeLogLocation -Value $changeLogContent
130215
}

eng/common/scripts/Package-Properties.ps1

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# Helper functions for retireving useful information from azure-sdk-for-* repo
2+
. "${PSScriptRoot}\logging.ps1"
3+
24
class PackageProps
35
{
46
[string]$Name
@@ -81,7 +83,7 @@ function Get-PkgProperties
8183
$serviceDirectoryPath = Join-Path $RepoRoot "sdk" $ServiceDirectory
8284
if (!(Test-Path $serviceDirectoryPath))
8385
{
84-
Write-Error "Service Directory $ServiceDirectory does not exist"
86+
LogError "Service Directory $ServiceDirectory does not exist"
8587
exit 1
8688
}
8789

@@ -97,15 +99,15 @@ function Get-PkgProperties
9799
}
98100
else
99101
{
100-
Write-Error "The function '$GetPackageInfoFromRepoFn' was not found."
102+
LogError "The function '$GetPackageInfoFromRepoFn' was not found."
101103
}
102104

103105
if ($pkgProps -ne $null)
104106
{
105107
return $pkgProps
106108
}
107109
}
108-
Write-Error "Failed to retrive Properties for $PackageName"
110+
LogError "Failed to retrive Properties for $PackageName"
109111
}
110112

111113
# Takes ServiceName and Repo Root Directory
@@ -175,7 +177,7 @@ function Get-PkgListFromYml ($ciYmlPath)
175177
}
176178
if ($artifactsInCI -eq $null)
177179
{
178-
Write-Error "Failed to retrive package names in ci $ciYmlPath"
180+
LogError "Failed to retrive package names in ci $ciYmlPath"
179181
}
180182
return $artifactsInCI
181183
}

eng/common/scripts/SemVer.ps1

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ class AzureEngSemanticVersion {
2222
[string] $RawVersion
2323
[bool] $IsSemVerFormat
2424
[string] $DefaultPrereleaseLabel
25+
2526
# Regex inspired but simplified from https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
2627
static [string] $SEMVER_REGEX = "(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:(?<presep>-?)(?<prelabel>[a-zA-Z-]*)(?<prenumsep>\.?)(?<prenumber>0|[1-9]\d*))?"
28+
static [string] $ParseLanguage = $Language
2729

2830
static [AzureEngSemanticVersion] ParseVersionString([string] $versionString)
2931
{
@@ -57,7 +59,12 @@ class AzureEngSemanticVersion {
5759
$this.Minor = [int]$matches.Minor
5860
$this.Patch = [int]$matches.Patch
5961

60-
$this.SetupDefaultConventions()
62+
if ([AzureEngSemanticVersion]::ParseLanguage -eq "python") {
63+
$this.SetupPythonConventions()
64+
}
65+
else {
66+
$this.SetupDefaultConventions()
67+
}
6168

6269
if ($null -eq $matches['prelabel'])
6370
{
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# Note: This script will add or replace version title in change log
2+
3+
# Parameter description
4+
# Version : Version to add or replace in change log
5+
# 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"
6+
# ReplaceLatestEntry: Replaces the latest changelog entry, including its content.
7+
8+
param (
9+
[Parameter(Mandatory = $true)]
10+
[String]$Version,
11+
[Parameter(Mandatory = $true)]
12+
[String]$ServiceDirectory,
13+
[Parameter(Mandatory = $true)]
14+
[String]$PackageName,
15+
[boolean]$Unreleased=$True,
16+
[boolean]$ReplaceLatestEntry = $False,
17+
[String]$ReleaseDate
18+
)
19+
20+
if ($ReleaseDate -and ($Unreleased -eq $True)) {
21+
LogError "Do not pass 'ReleaseDate' arguement when 'Unreleased' is true"
22+
exit 1
23+
}
24+
25+
. "${PSScriptRoot}\common.ps1"
26+
27+
if ($ReleaseDate)
28+
{
29+
try {
30+
$ReleaseStatus = ([DateTime]$ReleaseDate).ToString($CHANGELOG_DATE_FORMAT)
31+
$ReleaseStatus = "($ReleaseStatus)"
32+
}
33+
catch {
34+
LogError "Invalid 'ReleaseDate'. Please use a valid date in the format '$CHANGELOG_DATE_FORMAT'"
35+
exit 1
36+
}
37+
}
38+
elseif ($Unreleased) {
39+
$ReleaseStatus = $CHANGELOG_UNRELEASED_STATUS
40+
}
41+
else {
42+
$ReleaseStatus = "$(Get-Date -Format $CHANGELOG_DATE_FORMAT)"
43+
$ReleaseStatus = "($ReleaseStatus)"
44+
}
45+
46+
if ($null -eq [AzureEngSemanticVersion]::ParseVersionString($Version))
47+
{
48+
LogError "Version [$Version] is invalid. Please use a valid SemVer"
49+
exit(0)
50+
}
51+
52+
$PkgProperties = Get-PkgProperties -PackageName $PackageName -ServiceDirectory $ServiceDirectory
53+
$ChangeLogEntries = Get-ChangeLogEntries -ChangeLogLocation $PkgProperties.ChangeLogPath
54+
55+
56+
if ($ChangeLogEntries.Contains($Version))
57+
{
58+
if ($ChangeLogEntries[$Version].ReleaseStatus -eq $ReleaseStatus)
59+
{
60+
LogWarning "Version is already present in change log with specificed ReleaseStatus [$ReleaseStatus]"
61+
exit(0)
62+
}
63+
64+
if ($Unreleased -and ($ChangeLogEntries[$Version].ReleaseStatus -ne $ReleaseStatus))
65+
{
66+
LogWarning "Version is already present in change log with a release date. Please review [$($PkgProperties.ChangeLogPath)]"
67+
exit(0)
68+
}
69+
70+
if (!$Unreleased -and ($ChangeLogEntries[$Version].ReleaseStatus -ne $CHANGELOG_UNRELEASED_STATUS))
71+
{
72+
if ((Get-Date ($ChangeLogEntries[$Version].ReleaseStatus).Trim("()")) -gt (Get-Date $ReleaseStatus.Trim("()")))
73+
{
74+
LogWarning "New ReleaseDate for version [$Version] is older than existing release date in changelog. Please review [$($PkgProperties.ChangeLogPath)]"
75+
exit(0)
76+
}
77+
}
78+
}
79+
80+
$PresentVersionsSorted = [AzureEngSemanticVersion]::SortVersionStrings($ChangeLogEntries.Keys)
81+
$LatestVersion = $PresentVersionsSorted[0]
82+
83+
$LatestsSorted = [AzureEngSemanticVersion]::SortVersionStrings(@($LatestVersion, $Version))
84+
if ($LatestsSorted[0] -ne $Version) {
85+
LogWarning "Passed Version [$Version] is older than the latestversion [$LatestVersion] in the changelog. Please use a more recent version."
86+
exit(0)
87+
}
88+
89+
if ($ReplaceLatestEntry)
90+
{
91+
$ChangeLogEntries.Remove($LatestVersion)
92+
$newChangeLogEntry = New-ChangeLogEntry -Version $Version -Status $ReleaseStatus
93+
if ($newChangeLogEntry) {
94+
$ChangeLogEntries[$Version] = $newChangeLogEntry
95+
}
96+
else {
97+
LogError "Failed to create new changelog entry"
98+
}
99+
}
100+
elseif ($ChangeLogEntries.Contains($Version))
101+
{
102+
$ChangeLogEntries[$Version].ReleaseVersion = $Version
103+
$ChangeLogEntries[$Version].ReleaseStatus = $ReleaseStatus
104+
$ChangeLogEntries[$Version].ReleaseTitle = "## $Version $ReleaseStatus"
105+
}
106+
else
107+
{
108+
$newChangeLogEntry = New-ChangeLogEntry -Version $Version -Status $ReleaseStatus
109+
if ($newChangeLogEntry) {
110+
$ChangeLogEntries[$Version] = $newChangeLogEntry
111+
}
112+
else {
113+
LogError "Failed to create new changelog entry"
114+
}
115+
}
116+
117+
Set-ChangeLogContent -ChangeLogLocation $PkgProperties.ChangeLogPath -ChangeLogEntries $ChangeLogEntries
118+
119+

0 commit comments

Comments
 (0)