diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 9ef6c2a..b055861 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -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
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"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 98c50c1..57feccf 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,6 +12,7 @@ on:
- "v*"
pull_request:
branches: [ "master", "development" ]
+ workflow_dispatch:
#---------------------------------#
# environment configuration #
@@ -42,17 +43,94 @@ 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 and PR information
+ $refName = "${{ github.ref_name }}"
+ $headRef = "${{ github.head_ref }}"
+ $eventName = "${{ github.event_name }}"
+ $prNumber = $null
+ $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
+
+ Build started: ``$buildTime``
+
+ ### 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
uses: microsoft/setup-msbuild@v3
@@ -66,36 +144,21 @@ 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
+ $summary = @"
+
+ ---
+
+ โ
Cmder built successfully.
+
+ "@
+
+ $summary | 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@v7
with:
@@ -128,15 +191,55 @@ jobs:
- name: Summary - Artifacts uploaded
if: success()
shell: pwsh
+ env:
+ GH_TOKEN: ${{ github.token }}
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
+ # Source utility functions
+ . scripts/utils.ps1
+
+ $summary = @"
+
+ ### ๐๏ธ Artifacts
+
+ | 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
uses: softprops/action-gh-release@v2
@@ -154,14 +257,20 @@ 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
+ $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
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index fb1d49e..a35e070 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -50,20 +50,21 @@ jobs:
- name: Summary - CodeQL analysis started
shell: pwsh
run: |
- $summary = @(
- '## ๐ CodeQL Security Analysis - Workflow Summary'
- ''
- '### Analysis Configuration'
- ''
- '| Property | Value |'
- '| --- | --- |'
- '| Repository | `${{ github.repository }}` |'
- '| Branch | `${{ github.ref_name }}` |'
- '| Language | `${{ matrix.language }}` |'
- '| Commit | `${{ github.sha }}` |'
- ''
- )
- $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
+ $summary = @"
+ ## ๐ CodeQL Security Analysis - Workflow Summary
+
+ ### Analysis Configuration
+
+ | Property | Value |
+ | --- | --- |
+ | Repository | ``${{ github.repository }}`` |
+ | Branch | ``${{ github.ref_name }}`` |
+ | Language | ``${{ matrix.language }}`` |
+ | Commit | ``${{ github.sha }}`` |
+
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
@@ -89,13 +90,14 @@ jobs:
if: success()
shell: pwsh
run: |
- $summary = @(
- '### โ
Build Completed'
- ''
- 'Cmder launcher built successfully for CodeQL analysis.'
- ''
- )
- $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
+ $summary = @"
+ ### โ
Build Completed
+
+ Cmder launcher built successfully for CodeQL analysis.
+
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
@@ -106,13 +108,14 @@ jobs:
if: success()
shell: pwsh
run: |
- $summary = @(
- '### ๐ CodeQL Analysis Results'
- ''
- 'โ
CodeQL security analysis completed successfully.'
- ''
- '**Language analyzed:** `${{ matrix.language }}`'
- ''
- '> Check the Security tab for detailed findings and recommendations.'
- )
- $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
+ $summary = @"
+ ### ๐ CodeQL Analysis Results
+
+ โ
CodeQL security analysis completed successfully.
+
+ **Language analyzed:** ``${{ matrix.language }}``
+
+ > Check the Security tab for detailed findings and recommendations.
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 5110ab1..2e14fe4 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -39,20 +39,33 @@ jobs:
steps:
- uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
- 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
+
+ $summary = @"
+ ## โ
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 }}`` |
+
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Initialize vendors
shell: pwsh
@@ -63,53 +76,127 @@ 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 "vendor\sources.json" -Raw | ConvertFrom-Json
+ 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
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
+ $summary = @"
+ ### ๐ Test Results
+
+ | Test | Status | Duration |
+ | --- | --- | --- |
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- name: Testing Clink Shell
+ id: test-clink
+ shell: pwsh
run: |
+ $startTime = Get-Date
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
if: success()
shell: pwsh
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
+ id: test-powershell
+ shell: pwsh
run: |
+ $startTime = Get-Date
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
if: success()
shell: pwsh
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
+ id: test-bash
+ shell: pwsh
run: |
+ $startTime = Get-Date
bash vendor/cmder.sh
+ $duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
+ echo "duration=$duration" >> $env:GITHUB_OUTPUT
- name: Summary - Bash test
if: success()
shell: pwsh
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
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
+ $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)
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
diff --git a/.github/workflows/vendor.yml b/.github/workflows/vendor.yml
index ab254ae..947a046 100644
--- a/.github/workflows/vendor.yml
+++ b/.github/workflows/vendor.yml
@@ -31,62 +31,64 @@ jobs:
- name: Summary - Workflow started
shell: pwsh
run: |
- $summary = @(
- '## ๐ฆ Update Vendor - Workflow Summary'
- ''
- 'Checking for vendor dependency updates...'
- ''
- )
- $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
+ $summary = @"
+ ## ๐ฆ Update Vendor - Workflow Summary
+
+ Checking for vendor dependency updates...
+
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
- id: make-changes
name: Checking for updates
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
- $currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
- . .\scripts\update.ps1 -verbose
- Set-GHVariable -Name COUNT_UPDATED -Value $count
- $newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
- $listUpdated = ""
- $updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
- foreach ($s in $newVersion) {
- $oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
- if ($s.version -ne $oldVersion) {
- $repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
- $listUpdated += "$($s.name) v$($s.version), "
- $updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
- }
+ $currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
+ . .\scripts\update.ps1 -verbose
+ Set-GHVariable -Name COUNT_UPDATED -Value $count
+ $newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
+ $listUpdated = ""
+ $updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
+ foreach ($s in $newVersion) {
+ $oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
+ if ($s.version -ne $oldVersion) {
+ $repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
+ $listUpdated += "$($s.name) v$($s.version), "
+ $updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
}
- if ($count -eq 0) { return }
- Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
- echo "UPDATE_MESSAGE<< 0
with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
@@ -103,15 +105,16 @@ jobs:
if: env.COUNT_UPDATED > 0
shell: pwsh
run: |
- $summary = @(
- '### ๐ Pull Request Created'
- ''
- 'A pull request has been created to update the vendor dependencies.'
- ''
- '**Branch:** `update-vendor`'
- ''
- $env:LIST_UPDATED -and "**Updated dependencies:** $env:LIST_UPDATED" -or "**Updated dependencies:** "
- ''
- '> Please review and merge the pull request to apply the updates.'
- )
- $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
+ $summary = @"
+ ### ๐ Pull Request Created
+
+ A pull request has been created to update the vendor dependencies.
+
+ **Branch:** ``update-vendor``
+
+ **Updated dependencies:** $env:LIST_UPDATED
+
+ > Please review and merge the pull request to apply the updates.
+ "@
+
+ $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
diff --git a/scripts/pack.ps1 b/scripts/pack.ps1
index 8dccc5e..da6fc6e 100644
--- a/scripts/pack.ps1
+++ b/scripts/pack.ps1
@@ -70,7 +70,7 @@ if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
foreach ($t in $targets.GetEnumerator()) {
Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value
$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
diff --git a/scripts/utils.ps1 b/scripts/utils.ps1
index 5895540..f1a1752 100644
--- a/scripts/utils.ps1
+++ b/scripts/utils.ps1
@@ -249,3 +249,107 @@ function Download-File {
$wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;
$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
+}