Compare commits

...

50 Commits

Author SHA1 Message Date
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
Dax T Games
adbd6322f6 Merge branch 'master' into copilot/fix-github-step-summary 2026-02-28 08:06:34 -05:00
Dax T. Games
0c6b2d9900 Add back comments 2026-02-22 13:45:47 -05:00
Dax T. Games
66ab9ad6f7 remove nodejs files 2026-02-22 18:11:34 -05:00
Dax T. Games
6137073ba3 fix path to sources.json 2026-02-22 17:58:59 -05:00
Dax T. Games
6858619614 x 2026-02-22 17:56:27 -05:00
Dax T Games
002282636a Merge branch 'master' into copilot/fix-github-step-summary 2026-02-22 12:36:55 -05:00
Dax T. Games
48cc28a634 Fix yaml errors 2026-02-22 17:27:45 -05:00
Dax T. Games
e71c7679f6 Fixes and Cleanup 2026-02-22 16:22:17 -05:00
copilot-swe-agent[bot]
dc93fa5d1b Add real artifact download URLs with retry logic and fallback to run page
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-25 05:40:39 +00:00
copilot-swe-agent[bot]
684185ca8a Fix vendor workflow Unicode escape error by converting echo to PowerShell here-strings
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-25 05:37:09 +00:00
David Refoua
2780a43323 Update .github/workflows/tests.yml
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-15 06:33:39 +03:30
David Refoua
641ce7b1e8 Update .github/workflows/build.yml
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-15 06:23:04 +03:30
David Refoua
a52b0b9e10 Update .github/workflows/tests.yml
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-15 06:20:35 +03:30
copilot-swe-agent[bot]
825df3aace Fix branch link for PR merge refs to point to PR instead of invalid tree URL
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-15 02:48:18 +00:00
David Refoua
a937901e82 Change emoji for Vendor Packages section 2025-12-15 06:06:08 +03:30
copilot-swe-agent[bot]
27c7a0cdc6 Improve build summary: simplify message, reorder columns, add file type emojis
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-15 01:59:35 +00:00
copilot-swe-agent[bot]
838c1cfaa3 Add backticks to clickable links for code formatting in Repository Information
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-15 01:56:14 +00:00
copilot-swe-agent[bot]
bff3862ad4 Use 🗃️ emoji for Vendor Packages and Artifacts sections
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-15 01:41:42 +00:00
copilot-swe-agent[bot]
2057ee58b0 Fix incomplete summary by initializing $summary variable before appending
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-15 01:13:19 +00:00
copilot-swe-agent[bot]
0bc7fd3aaa Improve build workflow summary: add links, vendor packages, full hashes, and merge artifact sections
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-14 22:30:03 +00:00
copilot-swe-agent[bot]
1e04711a21 Change test emoji from 🧪 to in workflow summary
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-12-14 22:08:39 +00:00
copilot-swe-agent[bot]
3810b8d258 Initial plan 2025-12-14 21:42:23 +00:00
7 changed files with 482 additions and 167 deletions

View File

@@ -1,7 +1,12 @@
# 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 version: 2
updates: updates:
# Enable version updates for GitHub Actions # Enable version updates for GitHub Actions
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
schedule: schedule:
interval: "weekly" interval: "weekly"

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 #
@@ -42,20 +43,97 @@ jobs:
- name: Summary - Repository checkout - name: Summary - Repository checkout
shell: pwsh shell: pwsh
run: | run: |
echo "## 📦 Build Cmder - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY # Get Cmder version
echo "" >> $env:GITHUB_STEP_SUMMARY . scripts/utils.ps1
echo "### Repository Information" >> $env:GITHUB_STEP_SUMMARY $cmderVersion = Get-VersionStr
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY $buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY # Determine branch and PR information
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY $refName = "${{ github.ref_name }}"
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY $headRef = "${{ github.head_ref }}"
echo "| Actor | @${{ github.actor }} |" >> $env:GITHUB_STEP_SUMMARY $eventName = "${{ github.event_name }}"
echo "| Workflow | \`${{ github.workflow }}\` |" >> $env:GITHUB_STEP_SUMMARY $prNumber = $null
echo "" >> $env:GITHUB_STEP_SUMMARY $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]
# Use head_ref for the actual branch name if available
if ($headRef) {
$actualBranchName = $headRef
}
$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 {
# Regular branch, link to the branch tree
$branchLink = "https://github.com/${{ github.repository }}/tree/$refName"
}
$summary = @"
## 📦 Build Cmder - Workflow Summary
<small>Build started: ``$buildTime``</small>
### Repository Information
| Property | Value |
| --- | --- |
| Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) |
| Branch | [``$actualBranchName``]($branchLink) |
$(if ($prNumber) { "| Pull Request | [#$prNumber]($prLink) |" })
| 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 ([sources.json](vendor/sources.json))
| Package | Version |
| --- | --- |
"@
# Read vendor sources.json and add to summary
$vendorSources = Get-Content -Raw "vendor/sources.json" | ConvertFrom-Json
if ($vendorSources.Count -eq 0) {
$summary += "`n| _No vendor packages found_ | |"
} else {
foreach ($vendor in $vendorSources) {
# 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 |"
}
}
$summary += "`n"
$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
@@ -66,73 +144,102 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "### ✅ Build Status" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "Cmder launcher successfully compiled." >> $env:GITHUB_STEP_SUMMARY ---
echo "" >> $env:GITHUB_STEP_SUMMARY
✅ Cmder built successfully.
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Pack the built files - name: Pack the built files
shell: pwsh shell: pwsh
working-directory: scripts working-directory: scripts
run: .\pack.ps1 -verbose 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) - 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()
shell: pwsh shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
run: | run: |
echo "### ☁️ Upload Status" >> $env:GITHUB_STEP_SUMMARY # Source utility functions
echo "" >> $env:GITHUB_STEP_SUMMARY . scripts/utils.ps1
echo "All artifacts successfully uploaded to GitHub Actions:" >> $env:GITHUB_STEP_SUMMARY
echo '- ✅ `cmder.zip`' >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo '- ✅ `cmder.7z`' >> $env:GITHUB_STEP_SUMMARY
echo '- ✅ `cmder_mini.zip`' >> $env:GITHUB_STEP_SUMMARY ### 🗃️ Artifacts
echo '- ✅ `hashes.txt`' >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY | Artifact | Size | Hash (SHA256) |
| --- | --- | --- |
"@
# 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
$sizeFormatted = Format-FileSize -Bytes $file.Length
$hash = (Get-FileHash $path -Algorithm SHA256).Hash
# Try to get the actual artifact download URL
$downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact -Repository "${{ github.repository }}" -RunId "${{ github.run_id }}"
$warning = ""
if (-not $downloadUrl) {
# Fallback to workflow run page if artifact URL fetch fails
$downloadUrl = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
$warning = " ⚠️"
}
# Determine emoji based on file type
if ($artifact -match '\.txt$') {
$emoji = "📄"
} elseif ($artifact -match '\.(zip|rar|7z)$') {
$emoji = "🗄️"
} else {
$emoji = "📦"
}
$summary += "`n| $emoji [``$artifact``$warning]($downloadUrl) | $sizeFormatted | ``$hash`` |"
}
}
$summary += "`n"
$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@v2
@@ -150,14 +257,20 @@ jobs:
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
shell: pwsh shell: pwsh
run: | run: |
echo "### 🚀 Release Information" >> $env:GITHUB_STEP_SUMMARY $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.
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -50,20 +50,21 @@ jobs:
- name: Summary - CodeQL analysis started - name: Summary - CodeQL analysis started
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'## 🔒 CodeQL Security Analysis - Workflow Summary' ## 🔒 CodeQL Security Analysis - Workflow Summary
''
'### Analysis Configuration' ### Analysis Configuration
''
'| Property | Value |' | Property | Value |
'| --- | --- |' | --- | --- |
'| Repository | `${{ github.repository }}` |' | Repository | ``${{ github.repository }}`` |
'| Branch | `${{ github.ref_name }}` |' | Branch | ``${{ github.ref_name }}`` |
'| Language | `${{ matrix.language }}` |' | Language | ``${{ matrix.language }}`` |
'| Commit | `${{ github.sha }}` |' | Commit | ``${{ github.sha }}`` |
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
@@ -78,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
@@ -89,13 +90,14 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'### ✅ Build Completed' ### ✅ Build Completed
''
'Cmder launcher built successfully for CodeQL analysis.' Cmder launcher built successfully for CodeQL analysis.
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4 uses: github/codeql-action/analyze@v4
@@ -106,13 +108,14 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'### 🔍 CodeQL Analysis Results' ### 🔍 CodeQL Analysis Results
''
'✅ CodeQL security analysis completed successfully.' ✅ CodeQL security analysis completed successfully.
''
'**Language analyzed:** `${{ matrix.language }}`' **Language analyzed:** ``${{ matrix.language }}``
''
'> Check the Security tab for detailed findings and recommendations.' > Check the Security tab for detailed findings and recommendations.
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -39,20 +39,33 @@ jobs:
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Summary - Test execution started - name: Summary - Test execution started
shell: pwsh shell: pwsh
run: | run: |
echo "## 🧪 Run Tests - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY # Get Cmder version
echo "" >> $env:GITHUB_STEP_SUMMARY . scripts/utils.ps1
echo "### Test Environment" >> $env:GITHUB_STEP_SUMMARY $cmderVersion = Get-VersionStr
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY ## ✅ Run Tests - Workflow Summary
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY ### Test Environment
echo "| Runner OS | \`${{ runner.os }}\` |" >> $env:GITHUB_STEP_SUMMARY | Property | Value |
echo "" >> $env:GITHUB_STEP_SUMMARY | --- | --- |
| 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 }}`` |
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Initialize vendors - name: Initialize vendors
shell: pwsh shell: pwsh
@@ -63,53 +76,127 @@ jobs:
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "### ⚙️ Vendor Initialization" >> $env:GITHUB_STEP_SUMMARY # Get vendor versions from sources.json
echo "" >> $env:GITHUB_STEP_SUMMARY $vendorInfo = @()
echo "✅ Vendor dependencies initialized successfully." >> $env:GITHUB_STEP_SUMMARY $sources = Get-Content "vendor\sources.json" -Raw | ConvertFrom-Json
echo "" >> $env:GITHUB_STEP_SUMMARY foreach ($source in $sources) {
$dir = $source.name
if (-not $dir) {
continue
}
$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) {
$summary += "_No vendor version information available._"
} else {
$summary += $vendorInfo -join "`n"
}
)
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Summary - Test results table header - name: Summary - Test results table header
if: success() if: success()
shell: pwsh shell: pwsh
run: | run: |
echo "### 📋 Test Results" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "" >> $env:GITHUB_STEP_SUMMARY ### 📋 Test Results
echo "| Test | Status |" >> $env:GITHUB_STEP_SUMMARY
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY | Test | Status | Duration |
| --- | --- | --- |
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing Clink Shell - name: Testing Clink Shell
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: |
echo "| Clink Shell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY $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
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: |
echo "| PowerShell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY $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
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: |
echo "| Bash | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY $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()
shell: pwsh shell: pwsh
run: | run: |
echo "" >> $env:GITHUB_STEP_SUMMARY $summary = @"
echo "### ✅ All Tests Completed" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY ### ✅ All Tests Completed
echo "All shell environments tested successfully!" >> $env:GITHUB_STEP_SUMMARY
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)
"@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

View File

@@ -31,61 +31,63 @@ jobs:
- name: Summary - Workflow started - name: Summary - Workflow started
shell: pwsh shell: pwsh
run: | run: |
$summary = @( $summary = @"
'## 📦 Update Vendor - Workflow Summary' ## 📦 Update Vendor - Workflow Summary
''
'Checking for vendor dependency updates...' Checking for vendor dependency updates...
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- id: make-changes - id: make-changes
name: Checking for updates name: Checking for updates
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) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version $oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) { if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases" $repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), " $listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **[$($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(', ') if ($count -eq 0) { return }
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
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
run: | run: |
$count = [int]$env:COUNT_UPDATED $count = [int]$env:COUNT_UPDATED
if ($count -eq 0) { if ($count -eq 0) {
$summary = @( $summary = @"
'### ✅ No Updates Available' ### ✅ No Updates Available
''
'All vendor dependencies are up to date.' All vendor dependencies are up to date.
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
} else { } else {
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' } $word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
$summary = @( $summary = @"
'### 🔄 Updates Found' ### 🔄 Updates Found
''
"**$count** vendor $word updated:" **$count** vendor $word updated:
''
$env:UPDATE_MESSAGE $env:UPDATE_MESSAGE
''
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
} }
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- uses: peter-evans/create-pull-request@v8 - uses: peter-evans/create-pull-request@v8
if: env.COUNT_UPDATED > 0 if: env.COUNT_UPDATED > 0
with: with:
@@ -103,15 +105,16 @@ 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.
''
'**Branch:** `update-vendor`' **Branch:** ``update-vendor``
''
$env:LIST_UPDATED -and "**Updated dependencies:** $env:LIST_UPDATED" -or "**Updated dependencies:** " **Updated dependencies:** $env:LIST_UPDATED
''
'> Please review and merge the pull request to apply the updates.' > Please review and merge the pull request to apply the updates.
) "@
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8

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
}