name: Update Vendor on: workflow_dispatch: schedule: # At 13:37 UTC every day. - cron: '37 13 * * *' defaults: run: shell: pwsh permissions: contents: read jobs: vendor: runs-on: windows-latest continue-on-error: false timeout-minutes: 15 permissions: contents: write pull-requests: write steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Summary - Workflow started shell: pwsh run: | echo "## đŸ“Ļ Vendor Update - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "🔍 Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY - id: make-changes name: Checking for updates env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | $currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) . .\scripts\update.ps1 -verbose Set-GHVariable -Name COUNT_UPDATED -Value $count $newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $listUpdated = "" $updateMessage = "| Name | Old Version | New Version | Change Type |`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" # Determine change type and emoji $changeType = "unknown" $emoji = "🔄" try { # Handle versions with more than 4 parts $oldVerStr = $oldVersion.Split('-')[0] $newVerStr = $s.version.Split('-')[0] # Split by dots and take only numeric parts, first 4 max $oldParts = $oldVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4 $newParts = $newVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4 # Ensure we have at least 2 parts (major.minor) if ($oldParts.Count -ge 2 -and $newParts.Count -ge 2) { $oldVerParseable = $oldParts -join '.' $newVerParseable = $newParts -join '.' $oldVer = [System.Version]::Parse($oldVerParseable) $newVer = [System.Version]::Parse($newVerParseable) if ($newVer.Major -gt $oldVer.Major) { $changeType = "major" $emoji = "âš ī¸" } elseif ($newVer.Minor -gt $oldVer.Minor) { $changeType = "minor" $emoji = "✨" } else { $changeType = "patch" $emoji = "🐛" } } } catch { $changeType = "unknown" $emoji = "🔄" } $listUpdated += "$($s.name) v$($s.version), " $updateMessage += "| $emoji **[$($s.name)]($repoUrl)** | \`$oldVersion\` | \`$($s.version)\` | $changeType |`n" } } if ($count -eq 0) { return } Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ') echo "UPDATE_MESSAGE<<> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "All vendor dependencies are up to date! 🎉" >> $env:GITHUB_STEP_SUMMARY } else { $word = if ($count -eq 1) { 'dependency' } else { 'dependencies' } $emoji = if ($count -eq 1) { 'đŸ“Ļ' } else { 'đŸ“ĻđŸ“Ļ' } echo "### 🔄 Updates Found" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "$emoji **$count** vendor $word updated:" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "$env:UPDATE_MESSAGE" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY # Check if we can auto-merge (only minor/patch changes) $hasBreaking = $env:HAS_BREAKING_CHANGES -eq 'True' if ($hasBreaking) { echo "> âš ī¸ **Note:** This update contains major version changes that may include breaking changes." >> $env:GITHUB_STEP_SUMMARY } else { echo "> â„šī¸ **Note:** This update only contains minor or patch changes." >> $env:GITHUB_STEP_SUMMARY } } - name: Auto-merge minor updates if: env.COUNT_UPDATED > 0 && env.HAS_BREAKING_CHANGES != 'True' 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)" # Push directly to master git push origin HEAD:master 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 } 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)" # Reset only if a commit was made (check if HEAD moved) $headBeforeReset = git rev-parse HEAD if ($commitResult) { git reset --hard HEAD~1 } # 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@v7 if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false') with: title: ${{ env.COUNT_UPDATED == '1' && format('âŦ†ī¸ Update {0}', env.LIST_UPDATED) || format('âŦ†ī¸ Update {0} vendored dependencies', env.COUNT_UPDATED) }} body: | ### ${{ env.COUNT_UPDATED == '1' && 'đŸ“Ļ Automatically updated 1 dependency' || format('đŸ“Ļ Automatically updated {0} dependencies', env.COUNT_UPDATED) }} ${{ env.UPDATE_MESSAGE }} --- ${{ 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 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false') shell: pwsh run: | echo "### 🎉 Pull Request Created" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "A pull request has been created to update the vendor dependencies." >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "**Branch:** \`update-vendor\`" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY echo "" >> $env:GITHUB_STEP_SUMMARY if ($env:HAS_BREAKING_CHANGES -eq 'True') { echo "> âš ī¸ **Manual review required:** This update contains major version changes." >> $env:GITHUB_STEP_SUMMARY } else { echo "> â„šī¸ **Note:** Auto-merge failed, manual review required." >> $env:GITHUB_STEP_SUMMARY } echo "" >> $env:GITHUB_STEP_SUMMARY echo "Please review and merge the pull request to apply the updates." >> $env:GITHUB_STEP_SUMMARY