diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9ef6c2af7..b05586197 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 37b7b8ad0..c0e0a3865 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,17 +42,61 @@ 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 + + Build started: $buildTime + + ### 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,36 +110,23 @@ 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 = @" + + --- + + ### Build Status + + โœ… 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@v6 with: @@ -124,15 +155,82 @@ 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 + $summary = @" + + --- + + ### ๐Ÿ—ƒ๏ธ Artifacts + + | Artifact | Size | Download | Hash (SHA256) | + | --- | --- | --- | --- | + "@ + + # Function to get artifact download URL with retry logic + function Get-ArtifactDownloadUrl { + param( + [string]$ArtifactName, + [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/${{ 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 + + # Try to get the actual artifact download URL + $downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact + $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|7z)$') { + $emoji = "๐Ÿ—„๏ธ" + } else { + $emoji = "๐Ÿ“ฆ" + } + + $summary += "`n| $emoji ``$artifact`` | $([math]::Round($size, 2)) MB | [๐Ÿ“ฅ Download$warning]($downloadUrl) | ``$hash`` |" + } + } + $summary += "`n" + + $summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8 - name: Create Release uses: softprops/action-gh-release@v2 @@ -150,14 +248,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 1497bf9ac..c0202c1fc 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 5110ab18d..8a079a6ce 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,21 +76,51 @@ 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 + $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) { + $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 run: | cmd /c vendor\init.bat /v /d /t @@ -85,8 +128,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 +138,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 +148,22 @@ 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 + $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 ab254aedf..9db037805 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 .\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" } - 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