mirror of
https://github.com/cmderdev/cmder.git
synced 2025-12-16 02:31:38 +08:00
Compare commits
12 Commits
copilot/im
...
copilot/fi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2780a43323 | ||
|
|
641ce7b1e8 | ||
|
|
a52b0b9e10 | ||
|
|
825df3aace | ||
|
|
a937901e82 | ||
|
|
27c7a0cdc6 | ||
|
|
838c1cfaa3 | ||
|
|
bff3862ad4 | ||
|
|
2057ee58b0 | ||
|
|
0bc7fd3aaa | ||
|
|
1e04711a21 | ||
|
|
3810b8d258 |
11
.github/dependabot.yml
vendored
11
.github/dependabot.yml
vendored
@@ -1,10 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
# Enable version updates for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
- package-ecosystem: "github-actions" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
labels:
|
||||
- "👆 Dependencies"
|
||||
- "🔄️ GitHub Actions"
|
||||
|
||||
172
.github/workflows/build.yml
vendored
172
.github/workflows/build.yml
vendored
@@ -42,17 +42,60 @@ jobs:
|
||||
- name: Summary - Repository checkout
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "## 📦 Build Cmder - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "### Repository Information" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Actor | @${{ github.actor }} |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Workflow | \`${{ github.workflow }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
# Get Cmder version
|
||||
. scripts/utils.ps1
|
||||
$cmderVersion = Get-VersionStr
|
||||
$buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
|
||||
|
||||
# Determine branch link (handle PR merge refs)
|
||||
$branchName = "${{ github.ref_name }}"
|
||||
$branchLink = ""
|
||||
if ($branchName -match '^(\d+)/(merge|head)$') {
|
||||
# This is a PR merge/head ref, link to the PR
|
||||
$prNumber = $Matches[1]
|
||||
$branchLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
|
||||
} elseif ("${{ github.event_name }}" -eq "pull_request") {
|
||||
# This is a pull request event, link to the PR
|
||||
$branchLink = "https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
|
||||
} else {
|
||||
# Regular branch, link to the branch tree
|
||||
$branchLink = "https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}"
|
||||
}
|
||||
|
||||
$summary = @"
|
||||
## 📦 Build Cmder - Workflow Summary
|
||||
|
||||
<small>Build started: $buildTime</small>
|
||||
|
||||
### Repository Information
|
||||
| Property | Value |
|
||||
| --- | --- |
|
||||
| Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) |
|
||||
| Branch | [``$branchName``]($branchLink) |
|
||||
| Commit | [``${{ github.sha }}``](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) |
|
||||
| Actor | [@${{ github.actor }}](https://github.com/${{ github.actor }}) |
|
||||
| Workflow | ``${{ github.workflow }}`` |
|
||||
| Cmder Version | **$cmderVersion** |
|
||||
|
||||
---
|
||||
|
||||
### 📁 Vendor Packages
|
||||
| Package | Version |
|
||||
| --- | --- |
|
||||
"@
|
||||
|
||||
# Read vendor sources.json and add to summary
|
||||
$vendorSources = Get-Content "vendor/sources.json" | ConvertFrom-Json
|
||||
if ($vendorSources.Count -eq 0) {
|
||||
$summary += "`n| _No vendor packages found_ | |"
|
||||
} else {
|
||||
foreach ($vendor in $vendorSources) {
|
||||
$summary += "`n| ``$($vendor.name)`` | $($vendor.version) |"
|
||||
}
|
||||
}
|
||||
$summary += "`n"
|
||||
|
||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Add MSBuild to PATH
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
@@ -66,57 +109,42 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### ✅ Build Status" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Cmder launcher successfully compiled." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
@"
|
||||
|
||||
---
|
||||
|
||||
### Build Status
|
||||
|
||||
✅ Cmder built successfully.
|
||||
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Pack the built files
|
||||
shell: pwsh
|
||||
working-directory: scripts
|
||||
run: .\pack.ps1 -verbose
|
||||
|
||||
- name: Summary - Package artifacts
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### 📦 Artifacts Created" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Artifact | Size | Hash (SHA256) |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| --- | --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
||||
$artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip")
|
||||
foreach ($artifact in $artifacts) {
|
||||
$path = "build/$artifact"
|
||||
if (Test-Path $path) {
|
||||
$size = (Get-Item $path).Length / 1MB
|
||||
# Truncate hash to first 16 chars for summary readability (full hash in hashes.txt)
|
||||
$hash = (Get-FileHash $path -Algorithm SHA256).Hash.Substring(0, 16)
|
||||
echo "| \`$artifact\` | $([math]::Round($size, 2)) MB | \`$hash...\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
}
|
||||
}
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
- name: Upload artifact (cmder.zip)
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: build/cmder.zip
|
||||
name: cmder.zip
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload artifact (cmder.7z)
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: build/cmder.7z
|
||||
name: cmder.7z
|
||||
|
||||
- name: Upload artifact (cmder_mini.zip)
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: build/cmder_mini.zip
|
||||
name: cmder_mini.zip
|
||||
|
||||
- name: Upload artifact (hashes.txt)
|
||||
uses: actions/upload-artifact@v6
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
path: build/hashes.txt
|
||||
name: hashes.txt
|
||||
@@ -125,14 +153,39 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### ☁️ Upload Status" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "All artifacts successfully uploaded to GitHub Actions:" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- ✅ \`cmder.zip\`" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- ✅ \`cmder.7z\`" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- ✅ \`cmder_mini.zip\`" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- ✅ \`hashes.txt\`" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
$summary = @"
|
||||
|
||||
---
|
||||
|
||||
### 🗃️ Artifacts
|
||||
|
||||
| Artifact | Size | Download | Hash (SHA256) |
|
||||
| --- | --- | --- | --- |
|
||||
"@
|
||||
|
||||
$artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip", "hashes.txt")
|
||||
foreach ($artifact in $artifacts) {
|
||||
$path = "build/$artifact"
|
||||
if (Test-Path $path) {
|
||||
$size = (Get-Item $path).Length / 1MB
|
||||
$hash = (Get-FileHash $path -Algorithm SHA256).Hash
|
||||
$downloadUrl = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||
|
||||
# Determine emoji based on file type
|
||||
if ($artifact -match '\.txt$') {
|
||||
$emoji = "📄"
|
||||
} elseif ($artifact -match '\.(zip|7z)$') {
|
||||
$emoji = "🗄️"
|
||||
} else {
|
||||
$emoji = "📦"
|
||||
}
|
||||
|
||||
$summary += "`n| $emoji ``$artifact`` | $([math]::Round($size, 2)) MB | [📥 Download]($downloadUrl) | ``$hash`` |"
|
||||
}
|
||||
}
|
||||
$summary += "`n"
|
||||
|
||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
@@ -150,13 +203,18 @@ jobs:
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### 🚀 Release Information" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Draft release created for tag: **\`${{ github.ref_name }}\`**" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Release includes:" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- Full version (\`cmder.zip\`, \`cmder.7z\`)" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- Mini version (\`cmder_mini.zip\`)" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "- File hashes (\`hashes.txt\`)" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "> ⚠️ Release is in **draft** mode. Please review and publish manually." >> $env:GITHUB_STEP_SUMMARY
|
||||
@"
|
||||
|
||||
---
|
||||
|
||||
### Release Information
|
||||
|
||||
🚀 Draft release created for tag: **``${{ github.ref_name }}``**
|
||||
|
||||
Release includes:
|
||||
- Full version (``cmder.zip``, ``cmder.7z``)
|
||||
- Mini version (``cmder_mini.zip``)
|
||||
- File hashes (``hashes.txt``)
|
||||
|
||||
> ⚠️ Release is in **draft** mode. Please review and publish manually.
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
40
.github/workflows/codeql.yml
vendored
40
.github/workflows/codeql.yml
vendored
@@ -50,17 +50,19 @@ jobs:
|
||||
- name: Summary - CodeQL analysis started
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "## 🔒 CodeQL Security Analysis - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "### Analysis Configuration" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Language | \`${{ matrix.language }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
@"
|
||||
## 🔒 CodeQL Security Analysis - Workflow Summary
|
||||
|
||||
### Analysis Configuration
|
||||
|
||||
| Property | Value |
|
||||
| --- | --- |
|
||||
| Repository | ``${{ github.repository }}`` |
|
||||
| Branch | ``${{ github.ref_name }}`` |
|
||||
| Language | ``${{ matrix.language }}`` |
|
||||
| Commit | ``${{ github.sha }}`` |
|
||||
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
@@ -86,10 +88,12 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### ✅ Build Completed" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Cmder launcher built successfully for CodeQL analysis." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
@"
|
||||
### ✅ Build Completed
|
||||
|
||||
Cmder launcher built successfully for CodeQL analysis.
|
||||
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v4
|
||||
@@ -102,10 +106,10 @@ jobs:
|
||||
run: |
|
||||
@"
|
||||
### 🔍 CodeQL Analysis Results
|
||||
|
||||
|
||||
✅ CodeQL security analysis completed successfully.
|
||||
|
||||
|
||||
**Language analyzed:** ``${{ matrix.language }}``
|
||||
|
||||
|
||||
> Check the Security tab for detailed findings and recommendations.
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
96
.github/workflows/tests.yml
vendored
96
.github/workflows/tests.yml
vendored
@@ -43,16 +43,25 @@ jobs:
|
||||
- name: Summary - Test execution started
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "## 🧪 Run Tests - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "### Test Environment" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Runner OS | \`${{ runner.os }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
# Get Cmder version
|
||||
. scripts/utils.ps1
|
||||
$cmderVersion = Get-VersionStr
|
||||
|
||||
@"
|
||||
## ✅ Run Tests - Workflow Summary
|
||||
|
||||
### Test Environment
|
||||
| Property | Value |
|
||||
| --- | --- |
|
||||
| Repository | ``${{ github.repository }}`` |
|
||||
| Branch | ``${{ github.ref_name }}`` |
|
||||
| Commit | ``${{ github.sha }}`` |
|
||||
| Runner OS | ``${{ runner.os }}`` |
|
||||
| Cmder Version | **$cmderVersion** |
|
||||
| PowerShell Version | **$($PSVersionTable.PSVersion)** |
|
||||
| Event | ``${{ github.event_name }}`` |
|
||||
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Initialize vendors
|
||||
shell: pwsh
|
||||
@@ -63,21 +72,49 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### ⚙️ Vendor Initialization" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "✅ Vendor dependencies initialized successfully." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
# Get vendor versions from sources.json
|
||||
$vendorInfo = @()
|
||||
$sources = Get-Content "sources.json" -Raw | ConvertFrom-Json
|
||||
$vendorDirs = $sources.PSObject.Properties | ForEach-Object { $_.Name }
|
||||
foreach ($dir in $vendorDirs) {
|
||||
$versionFile = "vendor/$dir/.cmderver"
|
||||
if (Test-Path $versionFile) {
|
||||
$version = Get-Content $versionFile -Raw
|
||||
$vendorInfo += "- **$dir**: $($version.Trim())"
|
||||
}
|
||||
}
|
||||
|
||||
$summary = @"
|
||||
### ⚙️ Vendor Initialization
|
||||
|
||||
✅ Vendor dependencies initialized successfully.
|
||||
|
||||
**Vendor Versions:**
|
||||
$(
|
||||
if ($vendorInfo.Count -eq 0) {
|
||||
"_No vendor version information available._"
|
||||
} else {
|
||||
$vendorInfo -join "`n"
|
||||
}
|
||||
)
|
||||
|
||||
"@
|
||||
|
||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Summary - Test results table header
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### 📋 Test Results" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| Test | Status |" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
||||
@"
|
||||
### 📋 Test Results
|
||||
|
||||
| Test | Status | Duration |
|
||||
| --- | --- | --- |
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Testing Clink Shell
|
||||
id: test-clink
|
||||
run: |
|
||||
cmd /c vendor\init.bat /v /d /t
|
||||
|
||||
@@ -85,8 +122,9 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "| Clink Shell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY
|
||||
"| Clink Shell | ✅ Passed | Cmd shell initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
- name: Testing PowerShell
|
||||
id: test-powershell
|
||||
run: |
|
||||
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
|
||||
|
||||
@@ -94,8 +132,9 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "| PowerShell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY
|
||||
"| PowerShell | ✅ Passed | Profile script execution |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
- name: Testing Bash
|
||||
id: test-bash
|
||||
run: |
|
||||
bash vendor/cmder.sh
|
||||
|
||||
@@ -103,13 +142,20 @@ jobs:
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "| Bash | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY
|
||||
"| Bash | ✅ Passed | Bash environment initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Summary - All tests completed
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "### ✅ All Tests Completed" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "All shell environments tested successfully!" >> $env:GITHUB_STEP_SUMMARY
|
||||
@"
|
||||
|
||||
### ✅ All Tests Completed
|
||||
|
||||
All shell environments tested successfully!
|
||||
|
||||
**Test Coverage:**
|
||||
- ✅ Clink shell environment (Windows cmd.exe with Clink)
|
||||
- ✅ PowerShell environment (with Cmder profile)
|
||||
- ✅ Bash environment (Git Bash integration)
|
||||
"@ | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
190
.github/workflows/vendor.yml
vendored
190
.github/workflows/vendor.yml
vendored
@@ -31,9 +31,9 @@ jobs:
|
||||
- name: Summary - Workflow started
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "## 📦 Vendor Update - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "## 📦 Update Vendor - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "🔍 Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
- id: make-changes
|
||||
@@ -46,113 +46,19 @@ jobs:
|
||||
Set-GHVariable -Name COUNT_UPDATED -Value $count
|
||||
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
||||
$listUpdated = ""
|
||||
$updateMessage = "| Name | Old Version | New Version |`n| :--- | :---: | :---: |`n"
|
||||
$majorUpdates = @()
|
||||
$singleDepName = ""
|
||||
$singleDepOldVersion = ""
|
||||
$singleDepNewVersion = ""
|
||||
$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"
|
||||
|
||||
# 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
|
||||
$changeType = "unknown"
|
||||
$emoji = "🔄"
|
||||
$isMajor = $false
|
||||
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 = "🔥"
|
||||
$isMajor = $true
|
||||
} elseif ($newVer.Minor -gt $oldVer.Minor) {
|
||||
$changeType = "minor"
|
||||
$emoji = "🚀"
|
||||
} else {
|
||||
$changeType = "patch"
|
||||
$emoji = "⬆️"
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
$changeType = "unknown"
|
||||
$emoji = "🔄"
|
||||
}
|
||||
|
||||
# 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"
|
||||
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
|
||||
}
|
||||
}
|
||||
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 = ""
|
||||
}
|
||||
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
|
||||
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
|
||||
# Generate major updates changelog section
|
||||
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"
|
||||
echo "CHANGELOG_SECTION<<<EOF`n$changelogSection`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
} else {
|
||||
echo "CHANGELOG_SECTION=" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
}
|
||||
|
||||
- name: Summary - Update check results
|
||||
shell: pwsh
|
||||
run: |
|
||||
@@ -160,96 +66,32 @@ jobs:
|
||||
if ($count -eq 0) {
|
||||
echo "### ✅ No Updates Available" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "All vendor dependencies are up to date! 🎉" >> $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' }
|
||||
echo "### 🔄 Updates Found" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
if ($count -eq 1) {
|
||||
echo "📦 **$env:SINGLE_DEP_NAME** updated from \`$env:SINGLE_DEP_OLD_VERSION\` to \`$env:SINGLE_DEP_NEW_VERSION\`" >> $env:GITHUB_STEP_SUMMARY
|
||||
} else {
|
||||
echo "📦 **$count** vendor $word updated:" >> $env:GITHUB_STEP_SUMMARY
|
||||
}
|
||||
echo "**$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 the commit if one was made
|
||||
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@v8
|
||||
if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
|
||||
- uses: peter-evans/create-pull-request@v7
|
||||
if: env.COUNT_UPDATED > 0
|
||||
with:
|
||||
title: ${{ env.COUNT_UPDATED == '1' && format('⬆️ Update {0}', env.LIST_UPDATED) || format('⬆️ Update {0} vendored dependencies', env.COUNT_UPDATED) }}
|
||||
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
|
||||
body: |
|
||||
### ${{ 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) }}
|
||||
|
||||
### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies:
|
||||
${{ env.UPDATE_MESSAGE }}
|
||||
|
||||
${{ env.CHANGELOG_SECTION }}
|
||||
|
||||
---
|
||||
|
||||
${{ 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.
|
||||
Please verify and then **Merge** the pull request to update.
|
||||
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')
|
||||
if: env.COUNT_UPDATED > 0
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "### 🎉 Pull Request Created" >> $env:GITHUB_STEP_SUMMARY
|
||||
@@ -260,10 +102,4 @@ jobs:
|
||||
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
|
||||
echo "> Please review and merge the pull request to apply the updates." >> $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
@@ -259,8 +259,6 @@ function Fetch-DownloadUrl {
|
||||
}
|
||||
|
||||
$count = 0
|
||||
$hasBreakingChanges = $false
|
||||
$updateDetails = @()
|
||||
|
||||
# Read the current sources content
|
||||
$sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json
|
||||
@@ -303,52 +301,6 @@ foreach ($s in $sources) {
|
||||
# }
|
||||
|
||||
$count++
|
||||
|
||||
# Analyze version change type
|
||||
$changeType = "unknown"
|
||||
try {
|
||||
# Try parsing as semantic version
|
||||
# Handle versions with more than 4 parts by taking only the first 3-4 parts
|
||||
$oldVerStr = $s.version.Split('-')[0]
|
||||
$newVerStr = $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"
|
||||
$hasBreakingChanges = $true
|
||||
} elseif ($newVer.Minor -gt $oldVer.Minor) {
|
||||
$changeType = "minor"
|
||||
} else {
|
||||
$changeType = "patch"
|
||||
}
|
||||
} else {
|
||||
# Not enough numeric parts for semantic versioning
|
||||
throw "Not enough numeric version parts"
|
||||
}
|
||||
} catch {
|
||||
# If semantic versioning fails, treat as unknown (potentially breaking)
|
||||
$changeType = "unknown"
|
||||
$hasBreakingChanges = $true
|
||||
Write-Verbose "Could not parse version as semantic version, treating as potentially breaking"
|
||||
}
|
||||
|
||||
$updateDetails += @{
|
||||
name = $s.name
|
||||
oldVersion = $s.version
|
||||
newVersion = $version
|
||||
changeType = $changeType
|
||||
}
|
||||
}
|
||||
|
||||
$s.url = $downloadUrl
|
||||
@@ -362,16 +314,12 @@ if ($count -eq 0) {
|
||||
return
|
||||
}
|
||||
|
||||
# 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
|
||||
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
|
||||
}
|
||||
|
||||
if ($Env:GITHUB_ACTIONS -eq 'true') {
|
||||
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
|
||||
}
|
||||
|
||||
Write-Host -ForegroundColor green "Successfully updated $count dependencies."
|
||||
|
||||
Reference in New Issue
Block a user