Compare commits

...

29 Commits

Author SHA1 Message Date
dependabot[bot]
ddaa2f1c4e Bump softprops/action-gh-release from 2 to 3
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 17:07:56 +00:00
David Refoua
00a140dac9 Bump peter-evans/create-pull-request from 7 to 8 2026-04-12 05:18:44 +03:30
dependabot[bot]
75cd20b7ff Bump peter-evans/create-pull-request from 7 to 8
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7 to 8.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v7...v8)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-12 00:43:41 +00:00
David Refoua
dc7e1c144f Fix GitHub Actions step summary generation issues 2026-04-12 04:13:02 +03:30
copilot-swe-agent[bot]
55251f7cc3 Show actual branch name and separate PR row in repository information
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/7ac9b75c-de48-4c0b-98db-108cc3423c0e

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-12 00:29:30 +00:00
copilot-swe-agent[bot]
0983e9b763 Add duration tracking to test results and change hashes.txt separator to tab
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/48204621-5da0-4649-9715-ac9df45f1153

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-12 00:24:53 +00:00
copilot-swe-agent[bot]
cb59bb54b0 Fix variable name casing inconsistency in vendor.yml (Summary -> summary)
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/7c117654-3cc9-428c-846a-01931a2f9b5b

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-12 00:20:53 +00:00
David Refoua
c882ade42d fix multi-line EOF syntax according to GitHub
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-12 03:47:52 +03:30
David Refoua
dcbb0e9203 fix: Handle multi-line JSON
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-12 03:46:47 +03:30
David Refoua
f3fa589ac3 use double-quote for "`n"
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-12 03:45:54 +03:30
David Refoua
32cf8767f5 fix: Derive directories from the array entries
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-12 03:44:49 +03:30
David Refoua
03deb9d859 fix: handle links to vendor repo archive URL
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-12 03:43:54 +03:30
David Refoua
01d01c6a57 parse entire JSON string at once
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-12 03:42:33 +03:30
copilot-swe-agent[bot]
25ea725338 Fix Format-FileSize undefined error by sourcing utils.ps1 in artifacts upload step
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/bf167f7e-397b-4635-a7d2-2c2680207e67

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 22:33:42 +00:00
copilot-swe-agent[bot]
cbc7f53cd3 Add workflow_dispatch to enable manual build workflow runs
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/49b3cbe7-8c16-4e18-a4c4-e0587448245e

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 22:27:24 +00:00
copilot-swe-agent[bot]
31e73cce59 Fix vendor package release links and artifact download URLs
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/ff648493-d8fd-4117-9a78-2933758d2280

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 22:16:56 +00:00
copilot-swe-agent[bot]
2de93d1d55 Move Format-FileSize and Get-ArtifactDownloadUrl functions to utils.ps1
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/9334534b-9a07-4053-a214-f394e6e92aaa

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 21:41:27 +00:00
copilot-swe-agent[bot]
aa801c2c17 Make artifact names clickable, use human-readable file sizes, and add rar to compression formats
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/ce43a069-b966-4141-b4e1-3d201bc3ddbf

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 21:35:15 +00:00
copilot-swe-agent[bot]
1418da1c18 Dynamically discover all build artifacts instead of hardcoding filenames
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/8667c9a1-2ae6-4286-bcf4-f58735eb094e

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 21:30:51 +00:00
copilot-swe-agent[bot]
05b24c2173 Wrap buildTime in code formatting backticks while keeping small tag
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/915ff38b-d73d-4ed8-bc2d-1fd1efa26f9b

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 21:03:52 +00:00
copilot-swe-agent[bot]
f69c1db205 Remove separator before artifacts, add sources.json link, and link vendor versions to releases
Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/6ed72053-91c6-4e75-8317-ac54af872629

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 20:52:47 +00:00
David Refoua
165ca3b05b Merge pull request #3076 from cmderdev/master
Update with upstream
2026-04-12 00:12:11 +03:30
David Refoua
be3d66d8a3 Merge pull request #3075 from cmderdev/copilot/fix-double-zip-problem
fix: resolve double-zip problem with github artifact upload
2026-04-12 00:10:28 +03:30
David Refoua
35c1cd6f42 Revert GitHub Actions checkout action version to v6 (latest) 2026-04-12 00:04:19 +03:30
copilot-swe-agent[bot]
07a2c6e5cd fix: correct checkout to v4 and add archive: false to fix double-zip
- actions/checkout@v6 does not exist; correct to @v4
- Add archive: false to all actions/upload-artifact@v7 steps so .zip
  and .7z files are uploaded directly without being wrapped in an
  extra zip container (fixes the double-zip problem described in
  #2725 and #2805)

Agent-Logs-Url: https://github.com/cmderdev/cmder/sessions/1d806690-a6f7-49d1-bef5-cefe50fc371e

Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2026-04-11 20:17:05 +00:00
David Refoua
7cfa69fe74 Merge pull request #3069 from cmderdev/dependabot/github_actions/actions/upload-artifact-7
Bump actions/upload-artifact from 6 to 7
2026-04-11 23:37:07 +03:30
David Refoua
74b089662c Merge pull request #3070 from cmderdev/dependabot/github_actions/microsoft/setup-msbuild-3
Bump microsoft/setup-msbuild from 2 to 3
2026-04-11 23:35:34 +03:30
dependabot[bot]
ed5ebfe5ba Bump microsoft/setup-msbuild from 2 to 3
Bumps [microsoft/setup-msbuild](https://github.com/microsoft/setup-msbuild) from 2 to 3.
- [Release notes](https://github.com/microsoft/setup-msbuild/releases)
- [Commits](https://github.com/microsoft/setup-msbuild/compare/v2...v3)

---
updated-dependencies:
- dependency-name: microsoft/setup-msbuild
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-23 16:19:05 +00:00
dependabot[bot]
86d1cbcfa0 Bump actions/upload-artifact from 6 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 17:43:22 +00:00
6 changed files with 224 additions and 78 deletions

View File

@@ -12,6 +12,7 @@ on:
- "v*" - "v*"
pull_request: pull_request:
branches: [ "master", "development" ] branches: [ "master", "development" ]
workflow_dispatch:
#---------------------------------# #---------------------------------#
# environment configuration # # environment configuration #
@@ -47,31 +48,48 @@ jobs:
$cmderVersion = Get-VersionStr $cmderVersion = Get-VersionStr
$buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") $buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
# Determine branch link (handle PR merge refs) # Determine branch and PR information
$branchName = "${{ github.ref_name }}" $refName = "${{ github.ref_name }}"
$headRef = "${{ github.head_ref }}"
$eventName = "${{ github.event_name }}"
$prNumber = $null
$actualBranchName = $refName
$branchLink = "" $branchLink = ""
if ($branchName -match '^(\d+)/(merge|head)$') { $prLink = ""
# This is a PR merge/head ref, link to the PR
# Check if this is a PR merge ref (e.g., "3061/merge")
if ($refName -match '^(\d+)/(merge|head)$') {
$prNumber = $Matches[1] $prNumber = $Matches[1]
$branchLink = "https://github.com/${{ github.repository }}/pull/$prNumber" # Use head_ref for the actual branch name if available
} elseif ("${{ github.event_name }}" -eq "pull_request") { if ($headRef) {
# This is a pull request event, link to the PR $actualBranchName = $headRef
$branchLink = "https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}" }
$branchLink = "https://github.com/${{ github.repository }}/tree/$actualBranchName"
$prLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
} elseif ($eventName -eq "pull_request") {
# This is a pull request event
$prNumber = "${{ github.event.pull_request.number }}"
if ($headRef) {
$actualBranchName = $headRef
}
$branchLink = "https://github.com/${{ github.repository }}/tree/$actualBranchName"
$prLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
} else { } else {
# Regular branch, link to the branch tree # Regular branch, link to the branch tree
$branchLink = "https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}" $branchLink = "https://github.com/${{ github.repository }}/tree/$refName"
} }
$summary = @" $summary = @"
## 📦 Build Cmder - Workflow Summary ## 📦 Build Cmder - Workflow Summary
<small>Build started: $buildTime</small> <small>Build started: ``$buildTime``</small>
### Repository Information ### Repository Information
| Property | Value | | Property | Value |
| --- | --- | | --- | --- |
| Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) | | Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) |
| Branch | [``$branchName``]($branchLink) | | Branch | [``$actualBranchName``]($branchLink) |
$(if ($prNumber) { "| Pull Request | [#$prNumber]($prLink) |" })
| Commit | [``${{ github.sha }}``](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) | | Commit | [``${{ github.sha }}``](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) |
| Actor | [@${{ github.actor }}](https://github.com/${{ github.actor }}) | | Actor | [@${{ github.actor }}](https://github.com/${{ github.actor }}) |
| Workflow | ``${{ github.workflow }}`` | | Workflow | ``${{ github.workflow }}`` |
@@ -79,18 +97,34 @@ jobs:
--- ---
### 📁 Vendor Packages ### 🗃️ Vendor Packages ([sources.json](vendor/sources.json))
| Package | Version | | Package | Version |
| --- | --- | | --- | --- |
"@ "@
# Read vendor sources.json and add to summary # Read vendor sources.json and add to summary
$vendorSources = Get-Content "vendor/sources.json" | ConvertFrom-Json $vendorSources = Get-Content -Raw "vendor/sources.json" | ConvertFrom-Json
if ($vendorSources.Count -eq 0) { if ($vendorSources.Count -eq 0) {
$summary += "`n| _No vendor packages found_ | |" $summary += "`n| _No vendor packages found_ | |"
} else { } else {
foreach ($vendor in $vendorSources) { foreach ($vendor in $vendorSources) {
$summary += "`n| ``$($vendor.name)`` | $($vendor.version) |" # Create release link based on vendor package
$versionLink = "$($vendor.version)"
if ($vendor.url) {
# Extract owner/repo/tag from the URL and create release link
# Handle both /releases/download/ and /archive/ URLs
if ($vendor.url -match 'github\.com/([^/]+)/([^/]+)/(releases/download|archive)/([^/]+)') {
$owner = $Matches[1]
$repo = $Matches[2]
$pathType = $Matches[3]
$tag = $Matches[4]
if ($pathType -eq 'archive') {
$tag = $tag -replace '\.(?:tar\.gz|tgz|zip)$', ''
}
$versionLink = "[$($vendor.version)](https://github.com/$owner/$repo/releases/tag/$tag)"
}
}
$summary += "`n| ``$($vendor.name)`` | $versionLink |"
} }
} }
@@ -99,7 +133,7 @@ jobs:
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Add MSBuild to PATH - name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2 uses: microsoft/setup-msbuild@v3
- name: Build Cmder Launcher - name: Build Cmder Launcher
shell: pwsh shell: pwsh
@@ -114,8 +148,6 @@ jobs:
--- ---
### Build Status
✅ Cmder built successfully. ✅ Cmder built successfully.
"@ "@
@@ -128,29 +160,33 @@ jobs:
run: .\pack.ps1 -verbose run: .\pack.ps1 -verbose
- name: Upload artifact (cmder.zip) - name: Upload artifact (cmder.zip)
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
path: build/cmder.zip path: build/cmder.zip
name: cmder.zip name: cmder.zip
archive: false
if-no-files-found: error if-no-files-found: error
- name: Upload artifact (cmder.7z) - name: Upload artifact (cmder.7z)
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
path: build/cmder.7z path: build/cmder.7z
name: cmder.7z name: cmder.7z
archive: false
- name: Upload artifact (cmder_mini.zip) - name: Upload artifact (cmder_mini.zip)
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
path: build/cmder_mini.zip path: build/cmder_mini.zip
name: cmder_mini.zip name: cmder_mini.zip
archive: false
- name: Upload artifact (hashes.txt) - name: Upload artifact (hashes.txt)
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
path: build/hashes.txt path: build/hashes.txt
name: hashes.txt name: hashes.txt
archive: false
- name: Summary - Artifacts uploaded - name: Summary - Artifacts uploaded
if: success() if: success()
@@ -158,56 +194,29 @@ jobs:
env: env:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
run: | run: |
# Source utility functions
. scripts/utils.ps1
$summary = @" $summary = @"
---
### 🗃️ Artifacts ### 🗃️ Artifacts
| Artifact | Size | Download | Hash (SHA256) | | Artifact | Size | Hash (SHA256) |
| --- | --- | --- | --- | | --- | --- | --- |
"@ "@
# Function to get artifact download URL with retry logic # Get all files from the build directory (excluding directories and hidden files)
function Get-ArtifactDownloadUrl { if (Test-Path "build") {
param( $buildFiles = Get-ChildItem -Path "build" -File | Where-Object { -not $_.Name.StartsWith('.') } | Sort-Object Name
[string]$ArtifactName,
[int]$MaxRetries = 3, foreach ($file in $buildFiles) {
[int]$DelaySeconds = 2 $artifact = $file.Name
) $path = $file.FullName
$sizeFormatted = Format-FileSize -Bytes $file.Length
for ($i = 0; $i -lt $MaxRetries; $i++) {
try {
# Use GitHub CLI to get artifact information
$artifactsJson = gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" --jq ".artifacts[] | select(.name == `"$ArtifactName`")"
if ($artifactsJson) {
$artifact = $artifactsJson | ConvertFrom-Json
if ($artifact.archive_download_url) {
return $artifact.archive_download_url
}
}
} catch {
Write-Host "Attempt $($i + 1) failed to get artifact URL for $ArtifactName : $_"
}
if ($i -lt ($MaxRetries - 1)) {
Start-Sleep -Seconds $DelaySeconds
}
}
return $null
}
$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 $hash = (Get-FileHash $path -Algorithm SHA256).Hash
# Try to get the actual artifact download URL # Try to get the actual artifact download URL
$downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact $downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact -Repository "${{ github.repository }}" -RunId "${{ github.run_id }}"
$warning = "" $warning = ""
if (-not $downloadUrl) { if (-not $downloadUrl) {
@@ -219,13 +228,13 @@ jobs:
# Determine emoji based on file type # Determine emoji based on file type
if ($artifact -match '\.txt$') { if ($artifact -match '\.txt$') {
$emoji = "📄" $emoji = "📄"
} elseif ($artifact -match '\.(zip|7z)$') { } elseif ($artifact -match '\.(zip|rar|7z)$') {
$emoji = "🗄️" $emoji = "🗄️"
} else { } else {
$emoji = "📦" $emoji = "📦"
} }
$summary += "`n| $emoji ``$artifact`` | $([math]::Round($size, 2)) MB | [📥 Download$warning]($downloadUrl) | ``$hash`` |" $summary += "`n| $emoji [``$artifact``$warning]($downloadUrl) | $sizeFormatted | ``$hash`` |"
} }
} }
$summary += "`n" $summary += "`n"
@@ -233,7 +242,7 @@ jobs:
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Create Release - name: Create Release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v3
with: with:
files: | files: |
build/cmder.zip build/cmder.zip

View File

@@ -79,7 +79,7 @@ jobs:
# queries: security-extended,security-and-quality # queries: security-extended,security-and-quality
- name: Add MSBuild to PATH - name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2 uses: microsoft/setup-msbuild@v3
- name: Build Cmder Launcher - name: Build Cmder Launcher
shell: pwsh shell: pwsh

View File

@@ -79,8 +79,11 @@ jobs:
# Get vendor versions from sources.json # Get vendor versions from sources.json
$vendorInfo = @() $vendorInfo = @()
$sources = Get-Content "vendor\sources.json" -Raw | ConvertFrom-Json $sources = Get-Content "vendor\sources.json" -Raw | ConvertFrom-Json
$vendorDirs = $sources.PSObject.Properties | ForEach-Object { $_.Name } foreach ($source in $sources) {
foreach ($dir in $vendorDirs) { $dir = $source.name
if (-not $dir) {
continue
}
$versionFile = "vendor/$dir/.cmderver" $versionFile = "vendor/$dir/.cmderver"
if (Test-Path $versionFile) { if (Test-Path $versionFile) {
$version = Get-Content $versionFile -Raw $version = Get-Content $versionFile -Raw
@@ -100,7 +103,7 @@ jobs:
if ($vendorInfo.Count -eq 0) { if ($vendorInfo.Count -eq 0) {
$summary += "_No vendor version information available._" $summary += "_No vendor version information available._"
} else { } else {
$summary += $vendorInfo -join '`n' $summary += $vendorInfo -join "`n"
} }
) )
@@ -121,34 +124,64 @@ jobs:
- name: Testing Clink Shell - name: Testing Clink Shell
id: test-clink id: test-clink
shell: pwsh
run: | run: |
$startTime = Get-Date
cmd /c vendor\init.bat /v /d /t cmd /c vendor\init.bat /v /d /t
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - Clink Shell test - name: Summary - Clink Shell test
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
"| Clink Shell | ✅ Passed | Cmd shell initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 $duration = "${{ steps.test-clink.outputs.duration }}"
if ($duration) {
$duration = "$duration s"
} else {
$duration = "N/A"
}
"| Clink Shell | ✅ Passed | $duration |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing PowerShell - name: Testing PowerShell
id: test-powershell id: test-powershell
shell: pwsh
run: | run: |
$startTime = Get-Date
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'" PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - PowerShell test - name: Summary - PowerShell test
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
"| PowerShell | ✅ Passed | Profile script execution |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 $duration = "${{ steps.test-powershell.outputs.duration }}"
if ($duration) {
$duration = "$duration s"
} else {
$duration = "N/A"
}
"| PowerShell | ✅ Passed | $duration |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing Bash - name: Testing Bash
id: test-bash id: test-bash
shell: pwsh
run: | run: |
$startTime = Get-Date
bash vendor/cmder.sh bash vendor/cmder.sh
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - Bash test - name: Summary - Bash test
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
"| Bash | ✅ Passed | Bash environment initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 $duration = "${{ steps.test-bash.outputs.duration }}"
if ($duration) {
$duration = "$duration s"
} else {
$duration = "N/A"
}
"| Bash | ✅ Passed | $duration |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Summary - All tests completed - name: Summary - All tests completed
if: success() if: success()

View File

@@ -45,10 +45,10 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose . .\scripts\update.ps1 -verbose
Set-GHVariable -Name COUNT_UPDATED -Value $count Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
$listUpdated = "" $listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n" $updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
foreach ($s in $newVersion) { foreach ($s in $newVersion) {
@@ -62,7 +62,7 @@ jobs:
if ($count -eq 0) { return } if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ') Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- name: Summary - Update check results - name: Summary - Update check results
shell: pwsh shell: pwsh
@@ -88,7 +88,7 @@ jobs:
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- uses: peter-evans/create-pull-request@v7 - uses: peter-evans/create-pull-request@v8
if: env.COUNT_UPDATED > 0 if: env.COUNT_UPDATED > 0
with: with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies' title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
@@ -105,7 +105,7 @@ jobs:
if: env.COUNT_UPDATED > 0 if: env.COUNT_UPDATED > 0
shell: pwsh shell: pwsh
run: | run: |
$Summary = @" $summary = @"
### 🎉 Pull Request Created ### 🎉 Pull Request Created
A pull request has been created to update the vendor dependencies. A pull request has been created to update the vendor dependencies.

View File

@@ -70,7 +70,7 @@ if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
foreach ($t in $targets.GetEnumerator()) { foreach ($t in $targets.GetEnumerator()) {
Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value
$hash = (Digest-Hash "$saveTo\$($t.Name)") $hash = (Digest-Hash "$saveTo\$($t.Name)")
Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash) Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + "`t" + $hash)
} }
Pop-Location Pop-Location

View File

@@ -249,3 +249,107 @@ function Download-File {
$wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; $wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;
$wc.DownloadFile($Url, $File) $wc.DownloadFile($Url, $File)
} }
function Format-FileSize {
<#
.SYNOPSIS
Formats a file size in bytes to a human-readable string using binary units.
.DESCRIPTION
Converts file sizes to appropriate binary units (B, KiB, MiB, GiB) for better readability.
.PARAMETER Bytes
The file size in bytes to format.
.EXAMPLE
Format-FileSize -Bytes 1024
Returns "1.00 KiB"
.EXAMPLE
Format-FileSize -Bytes 15728640
Returns "15.00 MiB"
#>
param(
[Parameter(Mandatory = $true)]
[double]$Bytes
)
if ($Bytes -ge 1GB) {
return "{0:N2} GiB" -f ($Bytes / 1GB)
} elseif ($Bytes -ge 1MB) {
return "{0:N2} MiB" -f ($Bytes / 1MB)
} elseif ($Bytes -ge 1KB) {
return "{0:N2} KiB" -f ($Bytes / 1KB)
} else {
return "{0:N0} B" -f $Bytes
}
}
function Get-ArtifactDownloadUrl {
<#
.SYNOPSIS
Retrieves the download URL for a GitHub Actions artifact with retry logic.
.DESCRIPTION
Uses the GitHub CLI to fetch artifact information from the GitHub API with automatic retries.
Falls back to returning $null if all attempts fail.
.PARAMETER ArtifactName
The name of the artifact to retrieve the download URL for.
.PARAMETER Repository
The GitHub repository in the format "owner/repo".
.PARAMETER RunId
The GitHub Actions workflow run ID.
.PARAMETER MaxRetries
Maximum number of retry attempts. Default is 3.
.PARAMETER DelaySeconds
Delay in seconds between retry attempts. Default is 2.
.EXAMPLE
Get-ArtifactDownloadUrl -ArtifactName "cmder.zip" -Repository "cmderdev/cmder" -RunId "123456789"
.EXAMPLE
Get-ArtifactDownloadUrl -ArtifactName "build-output" -Repository "owner/repo" -RunId "987654321" -MaxRetries 5 -DelaySeconds 3
#>
param(
[Parameter(Mandatory = $true)]
[string]$ArtifactName,
[Parameter(Mandatory = $true)]
[string]$Repository,
[Parameter(Mandatory = $true)]
[string]$RunId,
[int]$MaxRetries = 3,
[int]$DelaySeconds = 2
)
for ($i = 0; $i -lt $MaxRetries; $i++) {
try {
# Use GitHub CLI to get artifact information
$artifactsJson = gh api "repos/$Repository/actions/runs/$RunId/artifacts" --jq ".artifacts[] | select(.name == `"$ArtifactName`")"
if ($artifactsJson) {
$artifact = $artifactsJson | ConvertFrom-Json
if ($artifact.id) {
# Construct browser-accessible GitHub Actions artifact download URL
# Format: https://github.com/owner/repo/actions/runs/{run_id}/artifacts/{artifact_id}
return "https://github.com/$Repository/actions/runs/$RunId/artifacts/$($artifact.id)"
}
}
} catch {
Write-Host "Attempt $($i + 1) failed to get artifact URL for $ArtifactName : $_"
}
if ($i -lt ($MaxRetries - 1)) {
Start-Sleep -Seconds $DelaySeconds
}
}
return $null
}