From 6c1c5da828ad2eafbe8282005442a713550a2485 Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 11:48:10 +0530 Subject: [PATCH 01/13] Updated service connection name --- fluentui-github-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 7df693472..080bc3292 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -62,7 +62,7 @@ extends: - task: GitHubRelease@1 displayName: 'Create GitHub Release' inputs: - gitHubConnection: 'GitHub-FluentUI-Android' + gitHubConnection: 'github.com_Dhruv-Mishra' repositoryName: 'microsoft/fluentui-android' action: 'create' target: '$(Build.SourceVersion)' From 1a3684b0b3dad2cb97d63d424f9365155b4c140d Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 11:58:39 +0530 Subject: [PATCH 02/13] Added pipeline variable for service connection --- fluentui-github-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 080bc3292..71f006021 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -62,7 +62,7 @@ extends: - task: GitHubRelease@1 displayName: 'Create GitHub Release' inputs: - gitHubConnection: 'github.com_Dhruv-Mishra' + gitHubConnection: 'v$(githubServiceConnectionName)' repositoryName: 'microsoft/fluentui-android' action: 'create' target: '$(Build.SourceVersion)' From 1e1d2e1624e83f403b6aada79339c64e3c9c3cdd Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 13:28:48 +0530 Subject: [PATCH 03/13] Minor fix --- fluentui-github-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 71f006021..d5a331ce5 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -62,7 +62,7 @@ extends: - task: GitHubRelease@1 displayName: 'Create GitHub Release' inputs: - gitHubConnection: 'v$(githubServiceConnectionName)' + gitHubConnection: '$(githubServiceConnectionName)' repositoryName: 'microsoft/fluentui-android' action: 'create' target: '$(Build.SourceVersion)' From 5d142651e6c28d4ff503c1703656b7439df20a2b Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 13:37:36 +0530 Subject: [PATCH 04/13] Fixed release name --- fluentui-github-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index d5a331ce5..d69a93104 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -68,7 +68,7 @@ extends: target: '$(Build.SourceVersion)' tagSource: 'userSpecifiedTag' tag: 'v$(releaseVersion)' - title: 'FluentUI Android v$(releaseVersion)' + title: 'Release version $(releaseVersion)' releaseNotesSource: 'inline' releaseNotesInline: '$(ReleaseNotesContent)' assets: '$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk' From a3626d79a648c07a39e214a8f7e5fea8557f39e0 Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 13:43:49 +0530 Subject: [PATCH 05/13] Debugging release notes --- fluentui-github-release.yml | 136 ++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 59 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index d69a93104..07db52e3d 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -3,14 +3,14 @@ name: $(Date:yyyyMMdd).$(Rev:r) resources: pipelines: - - pipeline: 'fluentui-android-maven-publish' - project: 'ISS' - source: 'fluentui-maven-central-publish [1es-pt]' + - pipeline: "fluentui-android-maven-publish" + project: "ISS" + source: "fluentui-maven-central-publish [1es-pt]" repositories: - - repository: OfficePipelineTemplates - type: git - name: 1ESPipelineTemplates/OfficePipelineTemplates - ref: refs/tags/release + - repository: OfficePipelineTemplates + type: git + name: 1ESPipelineTemplates/OfficePipelineTemplates + ref: refs/tags/release extends: template: v1/Office.Official.PipelineTemplate.yml@OfficePipelineTemplates @@ -20,57 +20,75 @@ extends: image: windows-2022 os: windows customBuildTags: - - ES365AIMigrationTooling-Release + - ES365AIMigrationTooling-Release stages: - - stage: Stage_1 - displayName: GitHub Release - jobs: - - job: Job_1 - displayName: Agent job - condition: succeeded() - timeoutInMinutes: 0 - templateContext: - type: releaseJob - isProduction: true - inputs: - - input: pipelineArtifact - buildType: 'specific' - project: '$(projectName)' - definition: '$(pipelineDefinition)' - buildVersionToDownload: 'specific' - pipelineId: '$(buildId)' - artifactName: 'dogfood' - targetPath: '$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood' - - input: pipelineArtifact - buildType: 'specific' - project: '$(projectName)' - definition: '$(pipelineDefinition)' - buildVersionToDownload: 'specific' - pipelineId: '$(buildId)' - artifactName: 'notes' - targetPath: '$(Pipeline.Workspace)/fluentui-android-maven-publish/notes' - steps: - # Read release notes content - - task: PowerShell@2 - displayName: 'Read Release Notes' - inputs: - targetType: 'inline' - script: | - $releaseNotesContent = Get-Content -Path "$(Pipeline.Workspace)/fluentui-android-maven-publish/notes/dogfood-release-notes.txt" -Raw - Write-Host "##vso[task.setvariable variable=ReleaseNotesContent]$releaseNotesContent" + - stage: Stage_1 + displayName: GitHub Release + jobs: + - job: Job_1 + displayName: Agent job + condition: succeeded() + timeoutInMinutes: 0 + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + buildType: "specific" + project: "$(projectName)" + definition: "$(pipelineDefinition)" + buildVersionToDownload: "specific" + pipelineId: "$(buildId)" + artifactName: "dogfood" + targetPath: "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood" + - input: pipelineArtifact + buildType: "specific" + project: "$(projectName)" + definition: "$(pipelineDefinition)" + buildVersionToDownload: "specific" + pipelineId: "$(buildId)" + artifactName: "notes" + targetPath: "$(Pipeline.Workspace)/fluentui-android-maven-publish/notes" + steps: + # Prepare release notes for GitHub release + - task: PowerShell@2 + displayName: "Prepare Release Notes" + inputs: + targetType: "inline" + script: | + $sourceNotesPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/notes/dogfood-release-notes.txt" + $tempNotesPath = "$(Agent.TempDirectory)/github-release-notes.txt" - - task: GitHubRelease@1 - displayName: 'Create GitHub Release' - inputs: - gitHubConnection: '$(githubServiceConnectionName)' - repositoryName: 'microsoft/fluentui-android' - action: 'create' - target: '$(Build.SourceVersion)' - tagSource: 'userSpecifiedTag' - tag: 'v$(releaseVersion)' - title: 'Release version $(releaseVersion)' - releaseNotesSource: 'inline' - releaseNotesInline: '$(ReleaseNotesContent)' - assets: '$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk' - addChangeLog: false - isPreRelease: false + # Copy the release notes to a temporary location for the GitHub release task + Copy-Item -Path $sourceNotesPath -Destination $tempNotesPath -Force + + # Verify the file exists and show preview + if (Test-Path $tempNotesPath) { + $content = Get-Content -Path $tempNotesPath -Raw + Write-Host "Release notes file prepared successfully at: $tempNotesPath" + Write-Host "Content length: $($content.Length) characters" + Write-Host "Content preview (first 300 chars):" + Write-Host $content.Substring(0, [Math]::Min(300, $content.Length)) + + # Set the file path as a variable for the GitHub release task + Write-Host "##vso[task.setvariable variable=ReleaseNotesFilePath]$tempNotesPath" + } else { + Write-Error "Release notes file not found at: $sourceNotesPath" + exit 1 + } + + - task: GitHubRelease@1 + displayName: "Create GitHub Release" + inputs: + gitHubConnection: "$(githubServiceConnectionName)" + repositoryName: "microsoft/fluentui-android" + action: "create" + target: "$(Build.SourceVersion)" + tagSource: "userSpecifiedTag" + tag: "v$(releaseVersion)" + title: "Release version $(releaseVersion)" + releaseNotesSource: "filePath" + releaseNotesFilePath: "$(ReleaseNotesFilePath)" + assets: "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" + addChangeLog: false + isPreRelease: false From ad1a03bcb57c8453fd22b949c4e55c2b3e0d1b85 Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 14:00:08 +0530 Subject: [PATCH 06/13] Formatting release notes --- fluentui-github-release.yml | 103 ++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 9 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 07db52e3d..f2290ea5a 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -57,18 +57,103 @@ extends: targetType: "inline" script: | $sourceNotesPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/notes/dogfood-release-notes.txt" - $tempNotesPath = "$(Agent.TempDirectory)/github-release-notes.txt" + $tempNotesPath = "$(Agent.TempDirectory)/github-release-notes.md" - # Copy the release notes to a temporary location for the GitHub release task - Copy-Item -Path $sourceNotesPath -Destination $tempNotesPath -Force + # Function to format release notes with markdown + function Format-ReleaseNotesMarkdown { + param([string]$content, [string]$version) - # Verify the file exists and show preview - if (Test-Path $tempNotesPath) { - $content = Get-Content -Path $tempNotesPath -Raw + $lines = $content -split "`r?`n" + $formattedLines = @() + + # Add release version header + $formattedLines += "### Release Version ${version}:" + $formattedLines += "" + + $inSection = $false + $currentSection = "" + $listItemNumber = 1 + + foreach ($line in $lines) { + $trimmedLine = $line.Trim() + + # Skip empty lines at the beginning + if (-not $trimmedLine -and $formattedLines.Count -le 2) { + continue + } + + # Detect section headers (What's new, Fix/enhancement, etc.) + if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { + $formattedLines += "### $trimmedLine" + $currentSection = $trimmedLine + $inSection = $true + $listItemNumber = 1 + continue + } + + # Detect Fluent version headers + if ($trimmedLine -match "^Fluent v[12]:?$") { + $formattedLines += "**$trimmedLine** " + continue + } + + # Handle numbered list items (lines starting with numbers) + if ($trimmedLine -match "^\d+\.\s*(.+)$") { + $itemText = $matches[1] + $formattedLines += " $listItemNumber. $itemText" + $listItemNumber++ + continue + } + + # Handle bullet points or dashes + if ($trimmedLine -match "^[-•]\s*(.+)$") { + $itemText = $matches[1] + $formattedLines += "- $itemText" + continue + } + + # Handle "None" responses + if ($trimmedLine -eq "None") { + $formattedLines += " None" + continue + } + + # Handle regular content lines + if ($trimmedLine) { + # If it looks like a standalone statement, treat it as a list item + if ($currentSection -eq "Fix/enhancement" -and $trimmedLine -notmatch "^(Fluent|Note|What's)" -and $trimmedLine -ne "None") { + $formattedLines += " $listItemNumber. $trimmedLine" + $listItemNumber++ + } else { + $formattedLines += $trimmedLine + } + } else { + # Preserve empty lines for spacing + $formattedLines += "" + } + } + + return $formattedLines -join "`n" + } + + # Read and format the release notes + if (Test-Path $sourceNotesPath) { + $originalContent = Get-Content -Path $sourceNotesPath -Raw + Write-Host "Original release notes content:" + Write-Host $originalContent + Write-Host "---" + + # Format the content with markdown + $formattedContent = Format-ReleaseNotesMarkdown -content $originalContent -version "$(releaseVersion)" + + # Write formatted content to temporary file + $formattedContent | Out-File -FilePath $tempNotesPath -Encoding UTF8 -NoNewline + + Write-Host "Formatted release notes:" + Write-Host $formattedContent + Write-Host "---" Write-Host "Release notes file prepared successfully at: $tempNotesPath" - Write-Host "Content length: $($content.Length) characters" - Write-Host "Content preview (first 300 chars):" - Write-Host $content.Substring(0, [Math]::Min(300, $content.Length)) + Write-Host "Formatted content length: $($formattedContent.Length) characters" # Set the file path as a variable for the GitHub release task Write-Host "##vso[task.setvariable variable=ReleaseNotesFilePath]$tempNotesPath" From a69b5f0819327d221f0d28b0dc6bcbd65f81451a Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 14:15:19 +0530 Subject: [PATCH 07/13] More formatting fixes --- fluentui-github-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index f2290ea5a..6d7579130 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -85,6 +85,7 @@ extends: # Detect section headers (What's new, Fix/enhancement, etc.) if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { $formattedLines += "### $trimmedLine" + $formattedLines += "" # Add blank line after section header $currentSection = $trimmedLine $inSection = $true $listItemNumber = 1 From f85e9b41ac25194593036b274b027d9ef266695f Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 14:37:15 +0530 Subject: [PATCH 08/13] Formatting updates --- fluentui-github-release.yml | 86 ++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 10 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 6d7579130..1901d656f 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -66,17 +66,41 @@ extends: $lines = $content -split "`r?`n" $formattedLines = @() - # Add release version header - $formattedLines += "### Release Version ${version}:" - $formattedLines += "" - $inSection = $false $currentSection = "" + $currentFluentVersion = "" $listItemNumber = 1 + $numberedItems = @() + $inCodeBlock = $false + + # Helper function to close any open code block + function Close-CodeBlock { + if ($numberedItems.Count -gt 0) { + $formattedLines += "``````" + foreach ($item in $numberedItems) { + $formattedLines += " $item" + } + $formattedLines += "``````" + $formattedLines += "" + $numberedItems = @() + $script:inCodeBlock = $false + } + } foreach ($line in $lines) { $trimmedLine = $line.Trim() + # Handle first line - format as release version header if it contains version info + if ($formattedLines.Count -eq 0 -and $trimmedLine) { + if ($trimmedLine -match "Release Version|Version") { + $formattedLines += "### $trimmedLine" + } else { + $formattedLines += "### Release Version ${version}:" + } + $formattedLines += "" + continue + } + # Skip empty lines at the beginning if (-not $trimmedLine -and $formattedLines.Count -le 2) { continue @@ -84,6 +108,7 @@ extends: # Detect section headers (What's new, Fix/enhancement, etc.) if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { + Close-CodeBlock $formattedLines += "### $trimmedLine" $formattedLines += "" # Add blank line after section header $currentSection = $trimmedLine @@ -94,20 +119,33 @@ extends: # Detect Fluent version headers if ($trimmedLine -match "^Fluent v[12]:?$") { + Close-CodeBlock + $formattedLines += "**$trimmedLine** " + $currentFluentVersion = $trimmedLine + continue + } + + # Detect subsection headers like "Fix/enhancement" under Fluent versions + if ($trimmedLine -match "^(Fix/enhancement|Enhancement|Bug fixes?)$" -and $currentFluentVersion) { + Close-CodeBlock $formattedLines += "**$trimmedLine** " + $formattedLines += "" + $listItemNumber = 1 continue } # Handle numbered list items (lines starting with numbers) if ($trimmedLine -match "^\d+\.\s*(.+)$") { $itemText = $matches[1] - $formattedLines += " $listItemNumber. $itemText" + $numberedItems += "$listItemNumber. $itemText" $listItemNumber++ + $inCodeBlock = $true continue } # Handle bullet points or dashes if ($trimmedLine -match "^[-•]\s*(.+)$") { + Close-CodeBlock $itemText = $matches[1] $formattedLines += "- $itemText" continue @@ -115,25 +153,35 @@ extends: # Handle "None" responses if ($trimmedLine -eq "None") { + Close-CodeBlock + $formattedLines += "``````" $formattedLines += " None" + $formattedLines += "``````" + $formattedLines += "" continue } # Handle regular content lines if ($trimmedLine) { - # If it looks like a standalone statement, treat it as a list item - if ($currentSection -eq "Fix/enhancement" -and $trimmedLine -notmatch "^(Fluent|Note|What's)" -and $trimmedLine -ne "None") { - $formattedLines += " $listItemNumber. $trimmedLine" + # If it looks like a standalone statement under Fix/enhancement, treat it as a list item + if ($currentSection -eq "Fix/enhancement" -and $currentFluentVersion -and $trimmedLine -notmatch "^(Fluent|Note|What's|Fix/enhancement)" -and $trimmedLine -ne "None") { + $numberedItems += "$listItemNumber. $trimmedLine" $listItemNumber++ + $inCodeBlock = $true } else { + Close-CodeBlock $formattedLines += $trimmedLine } } else { - # Preserve empty lines for spacing + # Close code block on empty lines and preserve spacing + Close-CodeBlock $formattedLines += "" } } + # Close any remaining code block at the end + Close-CodeBlock + return $formattedLines -join "`n" } @@ -163,6 +211,24 @@ extends: exit 1 } + # Rename APK file for better asset naming + - task: PowerShell@2 + displayName: "Rename APK Asset" + inputs: + targetType: "inline" + script: | + $sourceApk = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" + $targetApk = "$(Agent.TempDirectory)/Fluent UI Demo v$(releaseVersion).apk" + + if (Test-Path $sourceApk) { + Copy-Item -Path $sourceApk -Destination $targetApk -Force + Write-Host "APK renamed successfully: $targetApk" + Write-Host "##vso[task.setvariable variable=RenamedApkPath]$targetApk" + } else { + Write-Error "Source APK not found at: $sourceApk" + exit 1 + } + - task: GitHubRelease@1 displayName: "Create GitHub Release" inputs: @@ -175,6 +241,6 @@ extends: title: "Release version $(releaseVersion)" releaseNotesSource: "filePath" releaseNotesFilePath: "$(ReleaseNotesFilePath)" - assets: "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" + assets: "$(RenamedApkPath)" addChangeLog: false isPreRelease: false From 75837a10c7187384efb0ddd548fdd4aa0376d788 Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 14:48:32 +0530 Subject: [PATCH 09/13] Fix --- fluentui-github-release.yml | 81 +++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 1901d656f..6aeab6858 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -66,38 +66,40 @@ extends: $lines = $content -split "`r?`n" $formattedLines = @() - $inSection = $false $currentSection = "" $currentFluentVersion = "" $listItemNumber = 1 $numberedItems = @() - $inCodeBlock = $false - - # Helper function to close any open code block - function Close-CodeBlock { - if ($numberedItems.Count -gt 0) { - $formattedLines += "``````" - foreach ($item in $numberedItems) { - $formattedLines += " $item" + + # Helper function to output code block with collected items + function Add-CodeBlock { + param($items, $outputLines) + if ($items.Count -gt 0) { + $outputLines.Add("``````") + foreach ($item in $items) { + $outputLines.Add(" $item") } - $formattedLines += "``````" - $formattedLines += "" - $numberedItems = @() - $script:inCodeBlock = $false + $outputLines.Add("``````") + $outputLines.Add("") + return @() # Return empty array to clear items } + return $items } + # Convert to ArrayList for better performance + $formattedLines = [System.Collections.ArrayList]@() + foreach ($line in $lines) { $trimmedLine = $line.Trim() # Handle first line - format as release version header if it contains version info if ($formattedLines.Count -eq 0 -and $trimmedLine) { if ($trimmedLine -match "Release Version|Version") { - $formattedLines += "### $trimmedLine" + $formattedLines.Add("### $trimmedLine") | Out-Null } else { - $formattedLines += "### Release Version ${version}:" + $formattedLines.Add("### Release Version ${version}:") | Out-Null } - $formattedLines += "" + $formattedLines.Add("") | Out-Null continue } @@ -108,28 +110,27 @@ extends: # Detect section headers (What's new, Fix/enhancement, etc.) if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { - Close-CodeBlock - $formattedLines += "### $trimmedLine" - $formattedLines += "" # Add blank line after section header + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines + $formattedLines.Add("### $trimmedLine") | Out-Null + $formattedLines.Add("") | Out-Null # Add blank line after section header $currentSection = $trimmedLine - $inSection = $true $listItemNumber = 1 continue } # Detect Fluent version headers if ($trimmedLine -match "^Fluent v[12]:?$") { - Close-CodeBlock - $formattedLines += "**$trimmedLine** " + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines + $formattedLines.Add("**$trimmedLine** ") | Out-Null $currentFluentVersion = $trimmedLine continue } # Detect subsection headers like "Fix/enhancement" under Fluent versions if ($trimmedLine -match "^(Fix/enhancement|Enhancement|Bug fixes?)$" -and $currentFluentVersion) { - Close-CodeBlock - $formattedLines += "**$trimmedLine** " - $formattedLines += "" + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines + $formattedLines.Add("**$trimmedLine** ") | Out-Null + $formattedLines.Add("") | Out-Null $listItemNumber = 1 continue } @@ -139,25 +140,24 @@ extends: $itemText = $matches[1] $numberedItems += "$listItemNumber. $itemText" $listItemNumber++ - $inCodeBlock = $true + Write-Host "DEBUG: Added numbered item: $listItemNumber. $itemText" continue } # Handle bullet points or dashes if ($trimmedLine -match "^[-•]\s*(.+)$") { - Close-CodeBlock + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines $itemText = $matches[1] - $formattedLines += "- $itemText" + $formattedLines.Add("- $itemText") | Out-Null continue } # Handle "None" responses if ($trimmedLine -eq "None") { - Close-CodeBlock - $formattedLines += "``````" - $formattedLines += " None" - $formattedLines += "``````" - $formattedLines += "" + $formattedLines.Add("``````") | Out-Null + $formattedLines.Add(" None") | Out-Null + $formattedLines.Add("``````") | Out-Null + $formattedLines.Add("") | Out-Null continue } @@ -167,20 +167,23 @@ extends: if ($currentSection -eq "Fix/enhancement" -and $currentFluentVersion -and $trimmedLine -notmatch "^(Fluent|Note|What's|Fix/enhancement)" -and $trimmedLine -ne "None") { $numberedItems += "$listItemNumber. $trimmedLine" $listItemNumber++ - $inCodeBlock = $true + Write-Host "DEBUG: Added content as numbered item: $listItemNumber. $trimmedLine" } else { - Close-CodeBlock - $formattedLines += $trimmedLine + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines + $formattedLines.Add($trimmedLine) | Out-Null } } else { # Close code block on empty lines and preserve spacing - Close-CodeBlock - $formattedLines += "" + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines + $formattedLines.Add("") | Out-Null } } # Close any remaining code block at the end - Close-CodeBlock + $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines + + Write-Host "DEBUG: Final formatted lines count: $($formattedLines.Count)" + Write-Host "DEBUG: Final numbered items count: $($numberedItems.Count)" return $formattedLines -join "`n" } From bd24dbc3fc65c6861a05bfe3317eeb05bb12961f Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 15:20:45 +0530 Subject: [PATCH 10/13] Restoring commit --- fluentui-github-release.yml | 106 ++++++------------------------------ 1 file changed, 18 insertions(+), 88 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 6aeab6858..f2290ea5a 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -66,43 +66,17 @@ extends: $lines = $content -split "`r?`n" $formattedLines = @() + # Add release version header + $formattedLines += "### Release Version ${version}:" + $formattedLines += "" + + $inSection = $false $currentSection = "" - $currentFluentVersion = "" $listItemNumber = 1 - $numberedItems = @() - - # Helper function to output code block with collected items - function Add-CodeBlock { - param($items, $outputLines) - if ($items.Count -gt 0) { - $outputLines.Add("``````") - foreach ($item in $items) { - $outputLines.Add(" $item") - } - $outputLines.Add("``````") - $outputLines.Add("") - return @() # Return empty array to clear items - } - return $items - } - - # Convert to ArrayList for better performance - $formattedLines = [System.Collections.ArrayList]@() foreach ($line in $lines) { $trimmedLine = $line.Trim() - # Handle first line - format as release version header if it contains version info - if ($formattedLines.Count -eq 0 -and $trimmedLine) { - if ($trimmedLine -match "Release Version|Version") { - $formattedLines.Add("### $trimmedLine") | Out-Null - } else { - $formattedLines.Add("### Release Version ${version}:") | Out-Null - } - $formattedLines.Add("") | Out-Null - continue - } - # Skip empty lines at the beginning if (-not $trimmedLine -and $formattedLines.Count -le 2) { continue @@ -110,81 +84,55 @@ extends: # Detect section headers (What's new, Fix/enhancement, etc.) if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines - $formattedLines.Add("### $trimmedLine") | Out-Null - $formattedLines.Add("") | Out-Null # Add blank line after section header + $formattedLines += "### $trimmedLine" $currentSection = $trimmedLine + $inSection = $true $listItemNumber = 1 continue } # Detect Fluent version headers if ($trimmedLine -match "^Fluent v[12]:?$") { - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines - $formattedLines.Add("**$trimmedLine** ") | Out-Null - $currentFluentVersion = $trimmedLine - continue - } - - # Detect subsection headers like "Fix/enhancement" under Fluent versions - if ($trimmedLine -match "^(Fix/enhancement|Enhancement|Bug fixes?)$" -and $currentFluentVersion) { - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines - $formattedLines.Add("**$trimmedLine** ") | Out-Null - $formattedLines.Add("") | Out-Null - $listItemNumber = 1 + $formattedLines += "**$trimmedLine** " continue } # Handle numbered list items (lines starting with numbers) if ($trimmedLine -match "^\d+\.\s*(.+)$") { $itemText = $matches[1] - $numberedItems += "$listItemNumber. $itemText" + $formattedLines += " $listItemNumber. $itemText" $listItemNumber++ - Write-Host "DEBUG: Added numbered item: $listItemNumber. $itemText" continue } # Handle bullet points or dashes if ($trimmedLine -match "^[-•]\s*(.+)$") { - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines $itemText = $matches[1] - $formattedLines.Add("- $itemText") | Out-Null + $formattedLines += "- $itemText" continue } # Handle "None" responses if ($trimmedLine -eq "None") { - $formattedLines.Add("``````") | Out-Null - $formattedLines.Add(" None") | Out-Null - $formattedLines.Add("``````") | Out-Null - $formattedLines.Add("") | Out-Null + $formattedLines += " None" continue } # Handle regular content lines if ($trimmedLine) { - # If it looks like a standalone statement under Fix/enhancement, treat it as a list item - if ($currentSection -eq "Fix/enhancement" -and $currentFluentVersion -and $trimmedLine -notmatch "^(Fluent|Note|What's|Fix/enhancement)" -and $trimmedLine -ne "None") { - $numberedItems += "$listItemNumber. $trimmedLine" + # If it looks like a standalone statement, treat it as a list item + if ($currentSection -eq "Fix/enhancement" -and $trimmedLine -notmatch "^(Fluent|Note|What's)" -and $trimmedLine -ne "None") { + $formattedLines += " $listItemNumber. $trimmedLine" $listItemNumber++ - Write-Host "DEBUG: Added content as numbered item: $listItemNumber. $trimmedLine" } else { - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines - $formattedLines.Add($trimmedLine) | Out-Null + $formattedLines += $trimmedLine } } else { - # Close code block on empty lines and preserve spacing - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines - $formattedLines.Add("") | Out-Null + # Preserve empty lines for spacing + $formattedLines += "" } } - # Close any remaining code block at the end - $numberedItems = Add-CodeBlock -items $numberedItems -outputLines $formattedLines - - Write-Host "DEBUG: Final formatted lines count: $($formattedLines.Count)" - Write-Host "DEBUG: Final numbered items count: $($numberedItems.Count)" - return $formattedLines -join "`n" } @@ -214,24 +162,6 @@ extends: exit 1 } - # Rename APK file for better asset naming - - task: PowerShell@2 - displayName: "Rename APK Asset" - inputs: - targetType: "inline" - script: | - $sourceApk = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" - $targetApk = "$(Agent.TempDirectory)/Fluent UI Demo v$(releaseVersion).apk" - - if (Test-Path $sourceApk) { - Copy-Item -Path $sourceApk -Destination $targetApk -Force - Write-Host "APK renamed successfully: $targetApk" - Write-Host "##vso[task.setvariable variable=RenamedApkPath]$targetApk" - } else { - Write-Error "Source APK not found at: $sourceApk" - exit 1 - } - - task: GitHubRelease@1 displayName: "Create GitHub Release" inputs: @@ -244,6 +174,6 @@ extends: title: "Release version $(releaseVersion)" releaseNotesSource: "filePath" releaseNotesFilePath: "$(ReleaseNotesFilePath)" - assets: "$(RenamedApkPath)" + assets: "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" addChangeLog: false isPreRelease: false From ef35bb486873f4e267d42862891a9744a241a1ad Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 15:28:17 +0530 Subject: [PATCH 11/13] Fix --- fluentui-github-release.yml | 110 ++++++++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 10 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index f2290ea5a..7454514d2 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -66,24 +66,37 @@ extends: $lines = $content -split "`r?`n" $formattedLines = @() - # Add release version header - $formattedLines += "### Release Version ${version}:" - $formattedLines += "" - $inSection = $false $currentSection = "" $listItemNumber = 1 + $inNumberedList = $false + $numberedListItems = @() foreach ($line in $lines) { $trimmedLine = $line.Trim() # Skip empty lines at the beginning - if (-not $trimmedLine -and $formattedLines.Count -le 2) { + if (-not $trimmedLine -and $formattedLines.Count -eq 0) { + continue + } + + # Detect and format existing release version header + if ($trimmedLine -match "^Release version (.+)$") { + $versionNumber = $matches[1] + $formattedLines += "### Release Version ${versionNumber}:" continue } # Detect section headers (What's new, Fix/enhancement, etc.) if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { + # Close any open numbered list before starting new section + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $inNumberedList = $false + $numberedListItems = @() + } + $formattedLines += "### $trimmedLine" $currentSection = $trimmedLine $inSection = $true @@ -93,20 +106,45 @@ extends: # Detect Fluent version headers if ($trimmedLine -match "^Fluent v[12]:?$") { - $formattedLines += "**$trimmedLine** " + # Close any open numbered list before Fluent version header + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $inNumberedList = $false + $numberedListItems = @() + } + + $formattedLines += "**$trimmedLine**" continue } # Handle numbered list items (lines starting with numbers) - if ($trimmedLine -match "^\d+\.\s*(.+)$") { + if ($trimmedLine -match "^\s*\d+\.\s*(.+)$") { $itemText = $matches[1] - $formattedLines += " $listItemNumber. $itemText" + + # Start numbered list code block if not already started + if (-not $inNumberedList) { + $formattedLines += "" + $formattedLines += "``````" + $inNumberedList = $true + } + + # Add the numbered item with proper indentation + $formattedLines += "`t$listItemNumber. $itemText" $listItemNumber++ continue } # Handle bullet points or dashes if ($trimmedLine -match "^[-•]\s*(.+)$") { + # Close any open numbered list before bullet points + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $inNumberedList = $false + $numberedListItems = @() + } + $itemText = $matches[1] $formattedLines += "- $itemText" continue @@ -114,25 +152,59 @@ extends: # Handle "None" responses if ($trimmedLine -eq "None") { + # Close any open numbered list before "None" + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $inNumberedList = $false + $numberedListItems = @() + } + $formattedLines += " None" continue } # Handle regular content lines if ($trimmedLine) { + # Close any open numbered list before regular content + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $inNumberedList = $false + $numberedListItems = @() + } + # If it looks like a standalone statement, treat it as a list item if ($currentSection -eq "Fix/enhancement" -and $trimmedLine -notmatch "^(Fluent|Note|What's)" -and $trimmedLine -ne "None") { - $formattedLines += " $listItemNumber. $trimmedLine" + # Start numbered list code block for standalone statements + if (-not $inNumberedList) { + $formattedLines += "" + $formattedLines += "``````" + $inNumberedList = $true + } + $formattedLines += "`t$listItemNumber. $trimmedLine" $listItemNumber++ } else { $formattedLines += $trimmedLine } } else { + # Handle empty lines - close numbered list if open + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $inNumberedList = $false + $numberedListItems = @() + } # Preserve empty lines for spacing $formattedLines += "" } } + # Close any remaining open numbered list at the end + if ($inNumberedList) { + $formattedLines += "``````" + } + return $formattedLines -join "`n" } @@ -162,6 +234,24 @@ extends: exit 1 } + # Rename APK file to desired format + - task: PowerShell@2 + displayName: "Rename APK Asset" + inputs: + targetType: "inline" + script: | + $sourceApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" + $targetApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/Fluent UI Demo v$(releaseVersion).apk" + + if (Test-Path $sourceApkPath) { + Copy-Item -Path $sourceApkPath -Destination $targetApkPath + Write-Host "APK renamed successfully to: Fluent UI Demo v$(releaseVersion).apk" + Write-Host "##vso[task.setvariable variable=RenamedApkPath]$targetApkPath" + } else { + Write-Error "Source APK file not found at: $sourceApkPath" + exit 1 + } + - task: GitHubRelease@1 displayName: "Create GitHub Release" inputs: @@ -174,6 +264,6 @@ extends: title: "Release version $(releaseVersion)" releaseNotesSource: "filePath" releaseNotesFilePath: "$(ReleaseNotesFilePath)" - assets: "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" + assets: "$(RenamedApkPath)" addChangeLog: false isPreRelease: false From e9e1e9b4a766003bc8899a5fc94b01b51ebe0ef2 Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 15:37:07 +0530 Subject: [PATCH 12/13] Fully working pipeline --- fluentui-github-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index 7454514d2..f7010c35d 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -241,7 +241,7 @@ extends: targetType: "inline" script: | $sourceApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" - $targetApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/Fluent UI Demo v$(releaseVersion).apk" + $targetApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI_Demo_v$(releaseVersion).apk" if (Test-Path $sourceApkPath) { Copy-Item -Path $sourceApkPath -Destination $targetApkPath From c58400e2ac55715012963b27fc5f928646edf674 Mon Sep 17 00:00:00 2001 From: Dhruv-Mishra Date: Fri, 11 Jul 2025 16:19:06 +0530 Subject: [PATCH 13/13] Removed logging --- fluentui-github-release.yml | 211 +++++++++++------------------------- 1 file changed, 64 insertions(+), 147 deletions(-) diff --git a/fluentui-github-release.yml b/fluentui-github-release.yml index f7010c35d..e5dcef03a 100644 --- a/fluentui-github-release.yml +++ b/fluentui-github-release.yml @@ -50,7 +50,6 @@ extends: artifactName: "notes" targetPath: "$(Pipeline.Workspace)/fluentui-android-maven-publish/notes" steps: - # Prepare release notes for GitHub release - task: PowerShell@2 displayName: "Prepare Release Notes" inputs: @@ -58,183 +57,104 @@ extends: script: | $sourceNotesPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/notes/dogfood-release-notes.txt" $tempNotesPath = "$(Agent.TempDirectory)/github-release-notes.md" - - # Function to format release notes with markdown function Format-ReleaseNotesMarkdown { - param([string]$content, [string]$version) - + param([string]$content) $lines = $content -split "`r?`n" $formattedLines = @() - - $inSection = $false $currentSection = "" $listItemNumber = 1 $inNumberedList = $false - $numberedListItems = @() - + # Helper function to close numbered list code block + function Close-NumberedList { + if ($inNumberedList) { + $formattedLines += "``````" + $formattedLines += "" + $script:inNumberedList = $false + } + } + # Helper function to start numbered list code block + function Start-NumberedList { + if (-not $inNumberedList) { + $formattedLines += "" + $formattedLines += "``````" + $script:inNumberedList = $true + } + } foreach ($line in $lines) { $trimmedLine = $line.Trim() - - # Skip empty lines at the beginning if (-not $trimmedLine -and $formattedLines.Count -eq 0) { continue } - - # Detect and format existing release version header - if ($trimmedLine -match "^Release version (.+)$") { - $versionNumber = $matches[1] - $formattedLines += "### Release Version ${versionNumber}:" - continue - } - - # Detect section headers (What's new, Fix/enhancement, etc.) - if ($trimmedLine -match "^(What's new|Fix/enhancement|Note|Notes?)$") { - # Close any open numbered list before starting new section - if ($inNumberedList) { - $formattedLines += "``````" - $formattedLines += "" - $inNumberedList = $false - $numberedListItems = @() + switch -Regex ($trimmedLine) { + "^Release version (.+)$" { + $versionNumber = $matches[1] + $formattedLines += "### Release Version ${versionNumber}:" + continue } - - $formattedLines += "### $trimmedLine" - $currentSection = $trimmedLine - $inSection = $true - $listItemNumber = 1 - continue - } - - # Detect Fluent version headers - if ($trimmedLine -match "^Fluent v[12]:?$") { - # Close any open numbered list before Fluent version header - if ($inNumberedList) { - $formattedLines += "``````" - $formattedLines += "" - $inNumberedList = $false - $numberedListItems = @() + "^(What's new|Fix/enhancement|Note|Notes?)$" { + Close-NumberedList + $formattedLines += "### $trimmedLine" + $currentSection = $trimmedLine + $listItemNumber = 1 + continue } - - $formattedLines += "**$trimmedLine**" - continue - } - - # Handle numbered list items (lines starting with numbers) - if ($trimmedLine -match "^\s*\d+\.\s*(.+)$") { - $itemText = $matches[1] - - # Start numbered list code block if not already started - if (-not $inNumberedList) { - $formattedLines += "" - $formattedLines += "``````" - $inNumberedList = $true + "^Fluent v[12]:?$" { + Close-NumberedList + $formattedLines += "**$trimmedLine**" + continue } - - # Add the numbered item with proper indentation - $formattedLines += "`t$listItemNumber. $itemText" - $listItemNumber++ - continue - } - - # Handle bullet points or dashes - if ($trimmedLine -match "^[-•]\s*(.+)$") { - # Close any open numbered list before bullet points - if ($inNumberedList) { - $formattedLines += "``````" - $formattedLines += "" - $inNumberedList = $false - $numberedListItems = @() + "^\s*\d+\.\s*(.+)$" { + $itemText = $matches[1] + Start-NumberedList + $formattedLines += "`t$listItemNumber. $itemText" + $listItemNumber++ + continue } - - $itemText = $matches[1] - $formattedLines += "- $itemText" - continue - } - - # Handle "None" responses - if ($trimmedLine -eq "None") { - # Close any open numbered list before "None" - if ($inNumberedList) { - $formattedLines += "``````" - $formattedLines += "" - $inNumberedList = $false - $numberedListItems = @() + "^[-•]\s*(.+)$" { + Close-NumberedList + $itemText = $matches[1] + $formattedLines += "- $itemText" + continue } - - $formattedLines += " None" - continue - } - - # Handle regular content lines - if ($trimmedLine) { - # Close any open numbered list before regular content - if ($inNumberedList) { - $formattedLines += "``````" - $formattedLines += "" - $inNumberedList = $false - $numberedListItems = @() + "^None$" { + Close-NumberedList + $formattedLines += " None" + continue } - - # If it looks like a standalone statement, treat it as a list item - if ($currentSection -eq "Fix/enhancement" -and $trimmedLine -notmatch "^(Fluent|Note|What's)" -and $trimmedLine -ne "None") { - # Start numbered list code block for standalone statements - if (-not $inNumberedList) { - $formattedLines += "" - $formattedLines += "``````" - $inNumberedList = $true + ".+" { + # Check if this should be treated as a numbered list item in Fix/enhancement section + $isStandaloneFixItem = ($currentSection -eq "Fix/enhancement" -and + $trimmedLine -notmatch "^(Fluent|Note|What's)" -and + $trimmedLine -ne "None") + if ($isStandaloneFixItem) { + Start-NumberedList + $formattedLines += "`t$listItemNumber. $trimmedLine" + $listItemNumber++ + } else { + Close-NumberedList + $formattedLines += $trimmedLine } - $formattedLines += "`t$listItemNumber. $trimmedLine" - $listItemNumber++ - } else { - $formattedLines += $trimmedLine + continue } - } else { - # Handle empty lines - close numbered list if open - if ($inNumberedList) { - $formattedLines += "``````" + default { + Close-NumberedList $formattedLines += "" - $inNumberedList = $false - $numberedListItems = @() } - # Preserve empty lines for spacing - $formattedLines += "" } } - - # Close any remaining open numbered list at the end - if ($inNumberedList) { - $formattedLines += "``````" - } - + Close-NumberedList return $formattedLines -join "`n" } - # Read and format the release notes if (Test-Path $sourceNotesPath) { $originalContent = Get-Content -Path $sourceNotesPath -Raw - Write-Host "Original release notes content:" - Write-Host $originalContent - Write-Host "---" - - # Format the content with markdown - $formattedContent = Format-ReleaseNotesMarkdown -content $originalContent -version "$(releaseVersion)" - - # Write formatted content to temporary file + $formattedContent = Format-ReleaseNotesMarkdown -content $originalContent $formattedContent | Out-File -FilePath $tempNotesPath -Encoding UTF8 -NoNewline - - Write-Host "Formatted release notes:" - Write-Host $formattedContent - Write-Host "---" - Write-Host "Release notes file prepared successfully at: $tempNotesPath" - Write-Host "Formatted content length: $($formattedContent.Length) characters" - - # Set the file path as a variable for the GitHub release task Write-Host "##vso[task.setvariable variable=ReleaseNotesFilePath]$tempNotesPath" } else { Write-Error "Release notes file not found at: $sourceNotesPath" exit 1 } - - # Rename APK file to desired format - task: PowerShell@2 displayName: "Rename APK Asset" inputs: @@ -242,16 +162,13 @@ extends: script: | $sourceApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI.Demo-dogfood-release.apk" $targetApkPath = "$(Pipeline.Workspace)/fluentui-android-maven-publish/dogfood/FluentUI_Demo_v$(releaseVersion).apk" - if (Test-Path $sourceApkPath) { Copy-Item -Path $sourceApkPath -Destination $targetApkPath - Write-Host "APK renamed successfully to: Fluent UI Demo v$(releaseVersion).apk" Write-Host "##vso[task.setvariable variable=RenamedApkPath]$targetApkPath" } else { Write-Error "Source APK file not found at: $sourceApkPath" exit 1 } - - task: GitHubRelease@1 displayName: "Create GitHub Release" inputs: