Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
d61a4f7
Initial plan
Copilot Dec 8, 2025
be60888
Improve vendor CI/CD workflow with better messaging and auto-merge
Copilot Dec 8, 2025
4d21982
Fix trailing spaces in vendor workflow YAML
Copilot Dec 8, 2025
f2e8ae5
Improve version parsing to handle complex version strings
Copilot Dec 8, 2025
e64c0b1
Fix git reset logic in auto-merge error handling
Copilot Dec 8, 2025
bf90303
Remove Change Type column and add collapsible changelog for major upd…
Copilot Dec 8, 2025
e6fea0b
Use single emoji and show dependency name/version for single updates
Copilot Dec 8, 2025
fa2a34a
Merge branch 'master' into copilot/improve-vendor-ci-cd-messaging
DRSDavidSoft Dec 15, 2025
570b1d6
Fix single dependency variable initialization to prevent CI failures
Copilot Dec 15, 2025
0f6584f
Improve variable initialization logic with better error handling
Copilot Dec 15, 2025
cd2c4ec
Update version change emojis: πŸ”₯ major, πŸš€ minor, ⬆️ patch
Copilot Dec 15, 2025
4911924
Make new version bold in dependency update table
Copilot Dec 15, 2025
2cc1125
Fix CodeQL workflow PowerShell string termination error
Copilot Dec 15, 2025
9cfff38
Fix CodeQL PowerShell syntax by using Write-Output instead of echo
Copilot Dec 15, 2025
e598536
Use PowerShell here-string for CodeQL summary to fix parser error
Copilot Dec 15, 2025
82f7fdd
Merge and use PowerShell here-string for CodeQL summary
Dec 15, 2025
1afbd4a
Use PowerShell here-string to fix CodeQL parser error (reverted previ…
Copilot Dec 15, 2025
a475de2
Remove temporary comment from CodeQL workflow
Copilot Dec 15, 2025
400cdfe
Update .github/workflows/vendor.yml
DRSDavidSoft Dec 15, 2025
10a0675
Remove unused $headBeforeReset variable
Copilot Dec 15, 2025
7b86263
Wrap dependency count in backticks for consistency
Copilot Dec 15, 2025
d495b06
fixes
daxgames Feb 22, 2026
f2bde61
Fix workflows
daxgames Feb 22, 2026
8c0e2c5
Fix workflow YAML
daxgames Feb 22, 2026
a6f0015
cleanup
daxgames Feb 22, 2026
1e2d8eb
fixes
daxgames Feb 28, 2026
ae3ed77
Merge remote-tracking branch 'upstream/master' into copilot/improve-v…
daxgames Feb 28, 2026
2ebb4f2
Merge pull request #3077 from cmderdev/master
DRSDavidSoft Apr 11, 2026
d11c564
resolve conflicts
DRSDavidSoft Apr 12, 2026
6924bcb
Log vendor semantic version parsing failure
DRSDavidSoft Apr 12, 2026
e4ab8fb
Check commitResult
DRSDavidSoft Apr 12, 2026
7fdae8e
Add concurrency group to prevent race conditions in vendor workflow
Copilot Apr 12, 2026
59ef29c
Use numeric comparison instead of string for COUNT_UPDATED in PR title
Copilot Apr 12, 2026
426d9e6
Ensure downgrades don't show up as updates
DRSDavidSoft Apr 12, 2026
d3df508
Make sure downgrades don't show up as updates
DRSDavidSoft Apr 12, 2026
09b0075
Merge branch 'master' into copilot/improve-vendor-ci-cd-messaging
DRSDavidSoft Apr 12, 2026
58ab797
Extract version parsing to shared function and improve error handling
Copilot Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
$actualBranchName = $refName
$branchLink = ""
$prLink = ""

# Check if this is a PR merge ref (e.g., "3061/merge")
if ($refName -match '^(\d+)/(merge|head)$') {
$prNumber = $Matches[1]
Expand Down Expand Up @@ -196,7 +196,7 @@ jobs:
run: |
# Source utility functions
. scripts/utils.ps1

$summary = @"

### πŸ—ƒοΈ Artifacts
Expand All @@ -208,7 +208,7 @@ jobs:
# Get all files from the build directory (excluding directories and hidden files)
if (Test-Path "build") {
$buildFiles = Get-ChildItem -Path "build" -File | Where-Object { -not $_.Name.StartsWith('.') } | Sort-Object Name

foreach ($file in $buildFiles) {
$artifact = $file.Name
$path = $file.FullName
Expand Down
225 changes: 199 additions & 26 deletions .github/workflows/vendor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ on:
# At 13:37 UTC every day.
- cron: '37 13 * * *'

concurrency:
group: vendor-update
cancel-in-progress: false

defaults:
run:
shell: pwsh
Expand Down Expand Up @@ -45,64 +49,223 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose
Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
$listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
$currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose

# Export count of updated packages (update.ps1 is expected to set $count)
if (-not ($count)) { $count = 0 }
Set-GHVariable -Name COUNT_UPDATED -Value $count

$newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
# Source utility functions
. scripts/utils.ps1

$listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | :---: | :---: |`n"
$majorUpdates = @()
$singleDepName = ""
$singleDepOldVersion = ""
$singleDepNewVersion = ""
foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"

# Store single dependency info for messages (only if this is the only update)
if ($count -eq 1) {
$singleDepName = $s.name
$singleDepOldVersion = $oldVersion
$singleDepNewVersion = $s.version
}

# Determine change type and emoji using shared function
$result = Get-VersionChangeType -OldVersion $oldVersion -NewVersion $s.version
$changeType = $result.ChangeType
$emoji = $result.Emoji
$isMajor = $result.IsMajor

# Track major updates for changelog section
if ($isMajor) {
$compareUrl = "$repoUrl/compare/v$oldVersion...v$($s.version)"
$majorUpdates += @{
name = $s.name
oldVersion = $oldVersion
newVersion = $s.version
compareUrl = $compareUrl
repoUrl = $repoUrl
}
}

$listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| $emoji **[$($s.name)]($repoUrl)** | \`$oldVersion\` | **\`$($s.version)\`** |`n"
Comment thread
DRSDavidSoft marked this conversation as resolved.
}
}

if ($count -eq 0) { return }

Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
# Set single dependency variables (they will only be used if COUNT_UPDATED is 1)
# Use safe fallback values in case variables weren't set (shouldn't happen but prevents errors)
if ([string]::IsNullOrEmpty($singleDepName) -and $count -eq 1) {
# This shouldn't happen, but if it does, log a warning
Write-Warning "Single dependency name not set despite count being 1"
$singleDepName = "unknown-package"
$singleDepOldVersion = "unknown"
$singleDepNewVersion = "unknown"
} elseif ([string]::IsNullOrEmpty($singleDepName)) {
# For multiple dependencies, set placeholder values (won't be used)
$singleDepName = ""
$singleDepOldVersion = ""
$singleDepNewVersion = ""
}
}
if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')

echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Set-GHVariable -Name SINGLE_DEP_NAME -Value $singleDepName
Set-GHVariable -Name SINGLE_DEP_OLD_VERSION -Value $singleDepOldVersion
Set-GHVariable -Name SINGLE_DEP_NEW_VERSION -Value $singleDepNewVersion

# Write multiline UPDATE_MESSAGE to GITHUB_ENV
## echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Add-Content -Path $env:GITHUB_ENV -Value "UPDATE_MESSAGE<<EOF"
Add-Content -Path $env:GITHUB_ENV -Value $updateMessage
Add-Content -Path $env:GITHUB_ENV -Value "EOF"

# Generate major updates changelog section and export
if ($majorUpdates.Count -gt 0) {
$changelogSection = "`n<details>`n<summary>πŸ”₯ Major version updates - View changelog</summary>`n`n"
foreach ($update in $majorUpdates) {
$changelogSection += "### [$($update.name)]($($update.repoUrl))`n"
$changelogSection += "**$($update.oldVersion)** β†’ **$($update.newVersion)**`n`n"
$changelogSection += "- [View full changelog]($($update.compareUrl))`n"
$changelogSection += "- [Release notes]($($update.repoUrl)/tag/v$($update.newVersion))`n`n"
}
$changelogSection += "</details>`n"

Add-Content -Path $env:GITHUB_ENV -Value "CHANGELOG_SECTION<<EOF"
Add-Content -Path $env:GITHUB_ENV -Value $changelogSection
Add-Content -Path $env:GITHUB_ENV -Value "EOF"
Add-Content -Path $env:GITHUB_ENV -Value "HAS_BREAKING_CHANGES=True"
} else {
Add-Content -Path $env:GITHUB_ENV -Value "CHANGELOG_SECTION="
Add-Content -Path $env:GITHUB_ENV -Value "HAS_BREAKING_CHANGES=False"
}

- name: Summary - Update check results
shell: pwsh
run: |
$count = [int]$env:COUNT_UPDATED

if ($count -eq 0) {
$summary = @"
### βœ… No Updates Available

All vendor dependencies are up to date.
All vendor dependencies are up to date! πŸŽ‰
"@
} else {
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
$summary = @"
### πŸ”„ Updates Found

**$count** vendor $word updated:
"@
$summary += 'πŸ“¦ **' + $env:SINGLE_DEP_NAME + '** updated from `' + $env:SINGLE_DEP_OLD_VERSION + '` to `' + $env:SINGLE_DEP_NEW_VERSION + '`' + "`n" + "`n"
$summary += 'πŸ“¦ **' + $count + '** vendor ' + $word + ' updated:' + "`n" + "`n"
}

$env:UPDATE_MESSAGE
$summary += $env:UPDATE_MESSAGE + "`n"

"@
# Check if we can auto-merge (only minor/patch changes)
$hasBreaking = $env:HAS_BREAKING_CHANGES -eq 'True'
if ($hasBreaking) {
$summary += '> ⚠️ **Note:** This update contains major version changes that may include breaking changes.'
} else {
$summary += '> ℹ️ **Note:** This update only contains minor or patch changes.'
}

$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

- name: Auto-merge minor updates
if: env.COUNT_UPDATED > 0 && env.HAS_BREAKING_CHANGES != 'True'
Comment thread
DRSDavidSoft marked this conversation as resolved.
shell: pwsh
run: |
try {
echo "### πŸš€ Auto-merging Updates" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Attempting to automatically merge non-breaking changes to master..." >> $env:GITHUB_STEP_SUMMARY

git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"

# Commit the changes
git add vendor/sources.json
$commitResult = git commit -m "⬆️ Update dependencies ($env:LIST_UPDATED)"
$commitSuccess = $LASTEXITCODE -eq 0

if ($commitSuccess) {
# Push directly to master
git push origin HEAD:master
$pushSuccess = $LASTEXITCODE -eq 0

if ($pushSuccess) {
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "βœ… **Success!** Updates have been automatically merged to master." >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY

# Set a flag to skip PR creation
echo "AUTO_MERGED=true" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
} else {
throw "Failed to push to master (exit code: $LASTEXITCODE)"
}
} else {
throw "Failed to commit changes (exit code: $LASTEXITCODE)"
}
} catch {
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "⚠️ **Warning:** Unable to automatically merge updates." >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "**Error:** $($_.Exception.Message)" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Falling back to creating a pull request..." >> $env:GITHUB_STEP_SUMMARY

Write-Warning "Failed to auto-merge: $($_.Exception.Message)"

# Only reset if commit was successful but push failed
if ($commitSuccess -and -not $pushSuccess) {
try {
git reset --hard HEAD~1
if ($LASTEXITCODE -ne 0) {
Write-Warning "Failed to reset commit (exit code: $LASTEXITCODE), continuing with PR creation"
}
} catch {
Write-Warning "Failed to reset commit: $($_.Exception.Message), continuing with PR creation"
}
}
Comment on lines +221 to +241
Copy link

Copilot AI Dec 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error handling catches all exceptions but doesn't check if the git operations actually succeeded before attempting recovery. For example, if git add or git commit failed, the recovery logic may not work correctly. Additionally, the check if ($commitResult) on line 224 may not be reliable since $commitResult will contain the commit message output, not a boolean success indicator.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot apply changes based on this feedback

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improved in commit 58ab797. The error handling now:

  • Checks exit codes with $LASTEXITCODE after git operations
  • Tracks success state for commit and push separately ($commitSuccess, $pushSuccess)
  • Only resets the commit if it succeeded but the push failed
  • Includes proper error messages with exit codes
  • Wraps reset operation in try-catch to handle reset failures gracefully


# Set flag to create PR instead
echo "AUTO_MERGED=false" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
}

- uses: peter-evans/create-pull-request@v8
if: env.COUNT_UPDATED > 0
if: fromJSON(env.COUNT_UPDATED) > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
title: ${{ env.COUNT_UPDATED == 1 && format('⬆️ Update {0}', env.LIST_UPDATED) || format('⬆️ Update {0} vendored dependencies', env.COUNT_UPDATED) }}
body: |
### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies:
Comment thread
DRSDavidSoft marked this conversation as resolved.
### ${{ env.COUNT_UPDATED == 1 && format('πŸ“¦ Updated {0} from `{1}` to `{2}`', env.SINGLE_DEP_NAME, env.SINGLE_DEP_OLD_VERSION, env.SINGLE_DEP_NEW_VERSION) || format('πŸ“¦ Automatically updated `{0}` dependencies', env.COUNT_UPDATED) }}

${{ env.UPDATE_MESSAGE }}

${{ env.CHANGELOG_SECTION }}

---
Please verify and then **Merge** the pull request to update.

${{ env.HAS_BREAKING_CHANGES == 'True' && '⚠️ **This update contains major version changes that may include breaking changes.**' || 'ℹ️ This update only contains minor or patch changes.' }}

Please verify and then **Merge** the pull request to apply the updates.
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
branch: update-vendor
base: master

- name: Summary - Pull request created
if: env.COUNT_UPDATED > 0
if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
Comment thread
DRSDavidSoft marked this conversation as resolved.
shell: pwsh
run: |
$summary = @"
Expand All @@ -112,9 +275,19 @@ jobs:

**Branch:** ``update-vendor``

**Updated dependencies:** $env:LIST_UPDATED
$(if (-not [string]::IsNullOrEmpty($env:LIST_UPDATED)) { "**Updated dependencies:** $env:LIST_UPDATED" } else { "**Updated dependencies:** " })

"@

if ($env:HAS_BREAKING_CHANGES -eq 'True') {
$summary += "> ⚠️ **Manual review required:** This update contains major version changes."
} else {
$summary += "> ℹ️ **Note:** Auto-merge failed, manual review required."
}

$summary += @"
> Please review and merge the pull request to apply the updates.

"@

$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
34 changes: 30 additions & 4 deletions scripts/update.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ function Fetch-DownloadUrl {
}

$count = 0
$hasBreakingChanges = $false
$updateDetails = @()

# Read the current sources content
$sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json
Expand Down Expand Up @@ -301,6 +303,26 @@ foreach ($s in $sources) {
# }

$count++

# Analyze version change type using shared function
$result = Get-VersionChangeType -OldVersion $s.version -NewVersion $version
$changeType = $result.ChangeType

# Determine if this is a breaking change
if ($changeType -eq "downgrade" -or $changeType -eq "major") {
$hasBreakingChanges = $true
} elseif ($changeType -eq "unknown") {
# If version parsing failed, treat as potentially breaking
$hasBreakingChanges = $true
Write-Verbose "Could not parse version as semantic version for dependency '$($s.name)' (old: '$($s.version)', new: '$version'), treating as potentially breaking"
}

$updateDetails += @{
name = $s.name
oldVersion = $s.version
newVersion = $version
changeType = $changeType
}
}

$s.url = $downloadUrl
Expand All @@ -314,12 +336,16 @@ if ($count -eq 0) {
return
}

if ($Env:APPVEYOR -eq 'True') {
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
}

# Export update details for GitHub Actions
if ($Env:GITHUB_ACTIONS -eq 'true') {
$updateDetailsJson = $updateDetails | ConvertTo-Json -Compress
Write-Output "UPDATE_DETAILS=$updateDetailsJson" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Comment thread
DRSDavidSoft marked this conversation as resolved.
Write-Output "HAS_BREAKING_CHANGES=$hasBreakingChanges" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
}

if ($Env:APPVEYOR -eq 'True') {
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
}

Write-Host -ForegroundColor green "Successfully updated $count dependencies."
Loading
Loading