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 +}