mirror of
https://github.com/cmderdev/cmder.git
synced 2026-04-15 06:44:31 +08:00
Compare commits
118 Commits
copilot/op
...
copilot/im
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58ab7976d2 | ||
|
|
09b00758b1 | ||
|
|
00a140dac9 | ||
|
|
d3df508d8e | ||
|
|
426d9e6efe | ||
|
|
59ef29cbab | ||
|
|
7fdae8ef48 | ||
|
|
e4ab8fb2fd | ||
|
|
6924bcb8b5 | ||
|
|
d11c5641bd | ||
|
|
75cd20b7ff | ||
|
|
dc7e1c144f | ||
|
|
55251f7cc3 | ||
|
|
0983e9b763 | ||
|
|
cb59bb54b0 | ||
|
|
c882ade42d | ||
|
|
dcbb0e9203 | ||
|
|
f3fa589ac3 | ||
|
|
32cf8767f5 | ||
|
|
03deb9d859 | ||
|
|
01d01c6a57 | ||
|
|
25ea725338 | ||
|
|
cbc7f53cd3 | ||
|
|
31e73cce59 | ||
|
|
2de93d1d55 | ||
|
|
aa801c2c17 | ||
|
|
1418da1c18 | ||
|
|
05b24c2173 | ||
|
|
f69c1db205 | ||
|
|
2ebb4f2d5b | ||
|
|
165ca3b05b | ||
|
|
be3d66d8a3 | ||
|
|
35c1cd6f42 | ||
|
|
07a2c6e5cd | ||
|
|
7cfa69fe74 | ||
|
|
74b089662c | ||
|
|
ed5ebfe5ba | ||
|
|
86d1cbcfa0 | ||
|
|
ae3ed7718c | ||
|
|
1e2d8eb47d | ||
|
|
adbd6322f6 | ||
|
|
d495b06726 | ||
|
|
7f22d2eb73 | ||
|
|
573bf6ebfb | ||
|
|
05de4f606a | ||
|
|
c8495a0f58 | ||
|
|
6593acf8c8 | ||
|
|
a6f0015b16 | ||
|
|
8c0e2c542c | ||
|
|
f2bde614d4 | ||
|
|
0c6b2d9900 | ||
|
|
66ab9ad6f7 | ||
|
|
6137073ba3 | ||
|
|
6858619614 | ||
|
|
002282636a | ||
|
|
48cc28a634 | ||
|
|
e71c7679f6 | ||
|
|
c06d852248 | ||
|
|
ee967279d0 | ||
|
|
dc93fa5d1b | ||
|
|
684185ca8a | ||
|
|
7b86263b0a | ||
|
|
10a0675c96 | ||
|
|
400cdfed54 | ||
|
|
a475de2d4c | ||
|
|
1afbd4ae49 | ||
|
|
82f7fdd61a | ||
|
|
e598536485 | ||
|
|
9cfff38939 | ||
|
|
2cc1125f62 | ||
|
|
2780a43323 | ||
|
|
641ce7b1e8 | ||
|
|
a52b0b9e10 | ||
|
|
825df3aace | ||
|
|
a937901e82 | ||
|
|
27c7a0cdc6 | ||
|
|
838c1cfaa3 | ||
|
|
4911924259 | ||
|
|
bff3862ad4 | ||
|
|
cd2c4ec877 | ||
|
|
2057ee58b0 | ||
|
|
0f6584fa02 | ||
|
|
570b1d6043 | ||
|
|
fa2a34a4c0 | ||
|
|
9e6e1485b0 | ||
|
|
baef798b6c | ||
|
|
865d0c1858 | ||
|
|
60848f56c5 | ||
|
|
b86fca35bc | ||
|
|
0bc7fd3aaa | ||
|
|
1e04711a21 | ||
|
|
3810b8d258 | ||
|
|
e6fea0bbab | ||
|
|
bf90303c96 | ||
|
|
e64c0b110d | ||
|
|
f2e8ae5189 | ||
|
|
4d21982f26 | ||
|
|
be60888258 | ||
|
|
d61a4f7f36 | ||
|
|
d05d03117a | ||
|
|
1509616205 | ||
|
|
6a698046a0 | ||
|
|
148f685bb3 | ||
|
|
73685145ea | ||
|
|
799f63de1f | ||
|
|
6da8e5849e | ||
|
|
25ac8f113e | ||
|
|
40ddf9a451 | ||
|
|
0db2dbf6f8 | ||
|
|
d285f63068 | ||
|
|
62cccaf284 | ||
|
|
6ba699a3c4 | ||
|
|
13dd021d6a | ||
|
|
c3f239267d | ||
|
|
e79f54e16e | ||
|
|
24427c1a41 | ||
|
|
a918a6aae1 | ||
|
|
d3ae747a6d |
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@@ -5,7 +5,11 @@
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
# Enable version updates for GitHub Actions
|
||||
- package-ecosystem: "github-actions" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
labels:
|
||||
- "👆 Dependencies"
|
||||
- "🔄️ GitHub Actions"
|
||||
|
||||
29
.github/workflows/branches.yml
vendored
29
.github/workflows/branches.yml
vendored
@@ -19,10 +19,25 @@ jobs:
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Checks-out the repository under $GITHUB_WORKSPACE, so the job can access it
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0 # fetch all history for all branches and tags
|
||||
|
||||
- name: Summary - Merge operation started
|
||||
shell: bash
|
||||
run: |
|
||||
echo "## 🔀 Update Branches - Workflow Summary" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "### Merge Operation" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Property | Value |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| --- | --- |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Source Branch | \`master\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Target Branch | \`development\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Triggered by | @${{ github.actor }} |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Commit | \`${{ github.sha }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# Runs a single command using the runners shell
|
||||
- name: Merge master into development
|
||||
run: |
|
||||
@@ -31,3 +46,15 @@ jobs:
|
||||
git checkout development
|
||||
git merge --no-ff master
|
||||
git push origin development
|
||||
|
||||
- name: Summary - Merge completed
|
||||
if: success()
|
||||
shell: bash
|
||||
run: |
|
||||
echo "### ✅ Merge Successful" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "The \`master\` branch has been successfully merged into \`development\`." >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Merge type:** No fast-forward merge" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "> The development branch is now synchronized with the latest changes from master." >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
198
.github/workflows/build.yml
vendored
198
.github/workflows/build.yml
vendored
@@ -12,6 +12,7 @@ on:
|
||||
- "v*"
|
||||
pull_request:
|
||||
branches: [ "master", "development" ]
|
||||
workflow_dispatch:
|
||||
|
||||
#---------------------------------#
|
||||
# environment configuration #
|
||||
@@ -35,47 +36,210 @@ jobs:
|
||||
discussions: write
|
||||
steps:
|
||||
- name: Check out repository code (Action from GitHub)
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Summary - Repository checkout
|
||||
shell: pwsh
|
||||
run: |
|
||||
# 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
|
||||
|
||||
<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
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Build Cmder Launcher
|
||||
shell: pwsh
|
||||
working-directory: scripts
|
||||
run: .\build.ps1 -Compile -verbose
|
||||
|
||||
- name: Summary - Build completed
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
$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: Upload artifact (cmder.zip)
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: build/cmder.zip
|
||||
name: cmder.zip
|
||||
archive: false
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload artifact (cmder.7z)
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: build/cmder.7z
|
||||
name: cmder.7z
|
||||
archive: false
|
||||
|
||||
- name: Upload artifact (cmder_mini.zip)
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: build/cmder_mini.zip
|
||||
name: cmder_mini.zip
|
||||
archive: false
|
||||
|
||||
- name: Upload artifact (hashes.txt)
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: build/hashes.txt
|
||||
name: hashes.txt
|
||||
archive: false
|
||||
|
||||
- name: Summary - Artifacts uploaded
|
||||
if: success()
|
||||
shell: pwsh
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
# 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
|
||||
@@ -88,3 +252,25 @@ jobs:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
||||
- name: Summary - Release created
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
shell: pwsh
|
||||
run: |
|
||||
$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
|
||||
|
||||
52
.github/workflows/codeql.yml
vendored
52
.github/workflows/codeql.yml
vendored
@@ -45,7 +45,26 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- 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 -Encoding utf8
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
@@ -60,14 +79,43 @@ jobs:
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
- name: Add MSBuild to PATH
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
uses: microsoft/setup-msbuild@v3
|
||||
|
||||
- name: Build Cmder Launcher
|
||||
shell: pwsh
|
||||
working-directory: scripts
|
||||
run: .\build.ps1 -Compile -verbose
|
||||
|
||||
- name: Summary - Build status
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
$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
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
|
||||
- name: Summary - Analysis completed
|
||||
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 -Encoding utf8
|
||||
|
||||
152
.github/workflows/tests.yml
vendored
152
.github/workflows/tests.yml
vendored
@@ -38,17 +38,165 @@ jobs:
|
||||
continue-on-error: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Summary - Test execution started
|
||||
shell: pwsh
|
||||
run: |
|
||||
# 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
|
||||
working-directory: scripts
|
||||
run: .\build.ps1 -verbose
|
||||
|
||||
- name: Summary - Vendor initialization
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
# 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: |
|
||||
$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: |
|
||||
$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'"
|
||||
- name: Testing Bash
|
||||
$duration = [math]::Round(((Get-Date) - $startTime).TotalSeconds, 2)
|
||||
echo "duration=$duration" >> $env:GITHUB_OUTPUT
|
||||
|
||||
- name: Summary - PowerShell test
|
||||
if: success()
|
||||
shell: pwsh
|
||||
run: |
|
||||
$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: |
|
||||
$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: |
|
||||
$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
|
||||
|
||||
254
.github/workflows/vendor.yml
vendored
254
.github/workflows/vendor.yml
vendored
@@ -6,6 +6,10 @@ on:
|
||||
# At 13:37 UTC every day.
|
||||
- cron: '37 13 * * *'
|
||||
|
||||
concurrency:
|
||||
group: vendor-update
|
||||
cancel-in-progress: false
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: pwsh
|
||||
@@ -24,42 +28,266 @@ jobs:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- 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 -Encoding utf8
|
||||
|
||||
- id: make-changes
|
||||
name: Checking for updates
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
||||
$currentVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
|
||||
. .\scripts\update.ps1 -verbose
|
||||
|
||||
# Export count of updated packages (update.ps1 is expected to set $count)
|
||||
if (-not ($count)) { $count = 0 }
|
||||
Set-GHVariable -Name COUNT_UPDATED -Value $count
|
||||
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
||||
|
||||
$newVersion = (Get-Content -Raw .\vendor\sources.json | ConvertFrom-Json)
|
||||
# Source utility functions
|
||||
. scripts/utils.ps1
|
||||
|
||||
$listUpdated = ""
|
||||
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
|
||||
$updateMessage = "| Name | Old Version | New Version |`n| :--- | :---: | :---: |`n"
|
||||
$majorUpdates = @()
|
||||
$singleDepName = ""
|
||||
$singleDepOldVersion = ""
|
||||
$singleDepNewVersion = ""
|
||||
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"
|
||||
|
||||
# Store single dependency info for messages (only if this is the only update)
|
||||
if ($count -eq 1) {
|
||||
$singleDepName = $s.name
|
||||
$singleDepOldVersion = $oldVersion
|
||||
$singleDepNewVersion = $s.version
|
||||
}
|
||||
|
||||
# Determine change type and emoji using shared function
|
||||
$result = Get-VersionChangeType -OldVersion $oldVersion -NewVersion $s.version
|
||||
$changeType = $result.ChangeType
|
||||
$emoji = $result.Emoji
|
||||
$isMajor = $result.IsMajor
|
||||
|
||||
# Track major updates for changelog section
|
||||
if ($isMajor) {
|
||||
$compareUrl = "$repoUrl/compare/v$oldVersion...v$($s.version)"
|
||||
$majorUpdates += @{
|
||||
name = $s.name
|
||||
oldVersion = $oldVersion
|
||||
newVersion = $s.version
|
||||
compareUrl = $compareUrl
|
||||
repoUrl = $repoUrl
|
||||
}
|
||||
}
|
||||
|
||||
$listUpdated += "$($s.name) v$($s.version), "
|
||||
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
|
||||
$updateMessage += "| $emoji **[$($s.name)]($repoUrl)** | \`$oldVersion\` | **\`$($s.version)\`** |`n"
|
||||
}
|
||||
}
|
||||
if ($count -eq 0) { return }
|
||||
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
||||
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
|
||||
- uses: peter-evans/create-pull-request@v7
|
||||
if: env.COUNT_UPDATED > 0
|
||||
if ($count -eq 0) { return }
|
||||
|
||||
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
||||
# Set single dependency variables (they will only be used if COUNT_UPDATED is 1)
|
||||
# Use safe fallback values in case variables weren't set (shouldn't happen but prevents errors)
|
||||
if ([string]::IsNullOrEmpty($singleDepName) -and $count -eq 1) {
|
||||
# This shouldn't happen, but if it does, log a warning
|
||||
Write-Warning "Single dependency name not set despite count being 1"
|
||||
$singleDepName = "unknown-package"
|
||||
$singleDepOldVersion = "unknown"
|
||||
$singleDepNewVersion = "unknown"
|
||||
} elseif ([string]::IsNullOrEmpty($singleDepName)) {
|
||||
# For multiple dependencies, set placeholder values (won't be used)
|
||||
$singleDepName = ""
|
||||
$singleDepOldVersion = ""
|
||||
$singleDepNewVersion = ""
|
||||
}
|
||||
|
||||
Set-GHVariable -Name SINGLE_DEP_NAME -Value $singleDepName
|
||||
Set-GHVariable -Name SINGLE_DEP_OLD_VERSION -Value $singleDepOldVersion
|
||||
Set-GHVariable -Name SINGLE_DEP_NEW_VERSION -Value $singleDepNewVersion
|
||||
|
||||
# Write multiline UPDATE_MESSAGE to GITHUB_ENV
|
||||
## echo "UPDATE_MESSAGE<<EOF`n$updateMessage`nEOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "UPDATE_MESSAGE<<EOF"
|
||||
Add-Content -Path $env:GITHUB_ENV -Value $updateMessage
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "EOF"
|
||||
|
||||
# Generate major updates changelog section and export
|
||||
if ($majorUpdates.Count -gt 0) {
|
||||
$changelogSection = "`n<details>`n<summary>🔥 Major version updates - View changelog</summary>`n`n"
|
||||
foreach ($update in $majorUpdates) {
|
||||
$changelogSection += "### [$($update.name)]($($update.repoUrl))`n"
|
||||
$changelogSection += "**$($update.oldVersion)** → **$($update.newVersion)**`n`n"
|
||||
$changelogSection += "- [View full changelog]($($update.compareUrl))`n"
|
||||
$changelogSection += "- [Release notes]($($update.repoUrl)/tag/v$($update.newVersion))`n`n"
|
||||
}
|
||||
$changelogSection += "</details>`n"
|
||||
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "CHANGELOG_SECTION<<EOF"
|
||||
Add-Content -Path $env:GITHUB_ENV -Value $changelogSection
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "EOF"
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "HAS_BREAKING_CHANGES=True"
|
||||
} else {
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "CHANGELOG_SECTION="
|
||||
Add-Content -Path $env:GITHUB_ENV -Value "HAS_BREAKING_CHANGES=False"
|
||||
}
|
||||
|
||||
- name: Summary - Update check results
|
||||
shell: pwsh
|
||||
run: |
|
||||
$count = [int]$env:COUNT_UPDATED
|
||||
|
||||
if ($count -eq 0) {
|
||||
$summary = @"
|
||||
### ✅ No Updates Available
|
||||
|
||||
All vendor dependencies are up to date! 🎉
|
||||
"@
|
||||
} else {
|
||||
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
|
||||
$summary = @"
|
||||
### 🔄 Updates Found
|
||||
|
||||
"@
|
||||
$summary += '📦 **' + $env:SINGLE_DEP_NAME + '** updated from `' + $env:SINGLE_DEP_OLD_VERSION + '` to `' + $env:SINGLE_DEP_NEW_VERSION + '`' + "`n" + "`n"
|
||||
$summary += '📦 **' + $count + '** vendor ' + $word + ' updated:' + "`n" + "`n"
|
||||
}
|
||||
|
||||
$summary += $env:UPDATE_MESSAGE + "`n"
|
||||
|
||||
# Check if we can auto-merge (only minor/patch changes)
|
||||
$hasBreaking = $env:HAS_BREAKING_CHANGES -eq 'True'
|
||||
if ($hasBreaking) {
|
||||
$summary += '> ⚠️ **Note:** This update contains major version changes that may include breaking changes.'
|
||||
} else {
|
||||
$summary += '> ℹ️ **Note:** This update only contains minor or patch changes.'
|
||||
}
|
||||
|
||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
- name: Auto-merge minor updates
|
||||
if: env.COUNT_UPDATED > 0 && env.HAS_BREAKING_CHANGES != 'True'
|
||||
shell: pwsh
|
||||
run: |
|
||||
try {
|
||||
echo "### 🚀 Auto-merging Updates" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Attempting to automatically merge non-breaking changes to master..." >> $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
# Commit the changes
|
||||
git add vendor/sources.json
|
||||
$commitResult = git commit -m "⬆️ Update dependencies ($env:LIST_UPDATED)"
|
||||
$commitSuccess = $LASTEXITCODE -eq 0
|
||||
|
||||
if ($commitSuccess) {
|
||||
# Push directly to master
|
||||
git push origin HEAD:master
|
||||
$pushSuccess = $LASTEXITCODE -eq 0
|
||||
|
||||
if ($pushSuccess) {
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "✅ **Success!** Updates have been automatically merged to master." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
# Set a flag to skip PR creation
|
||||
echo "AUTO_MERGED=true" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
} else {
|
||||
throw "Failed to push to master (exit code: $LASTEXITCODE)"
|
||||
}
|
||||
} else {
|
||||
throw "Failed to commit changes (exit code: $LASTEXITCODE)"
|
||||
}
|
||||
} catch {
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "⚠️ **Warning:** Unable to automatically merge updates." >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "**Error:** $($_.Exception.Message)" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||
echo "Falling back to creating a pull request..." >> $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
Write-Warning "Failed to auto-merge: $($_.Exception.Message)"
|
||||
|
||||
# Only reset if commit was successful but push failed
|
||||
if ($commitSuccess -and -not $pushSuccess) {
|
||||
try {
|
||||
git reset --hard HEAD~1
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Warning "Failed to reset commit (exit code: $LASTEXITCODE), continuing with PR creation"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "Failed to reset commit: $($_.Exception.Message), continuing with PR creation"
|
||||
}
|
||||
}
|
||||
|
||||
# Set flag to create PR instead
|
||||
echo "AUTO_MERGED=false" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
}
|
||||
|
||||
- uses: peter-evans/create-pull-request@v8
|
||||
if: fromJSON(env.COUNT_UPDATED) > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
|
||||
with:
|
||||
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
|
||||
title: ${{ env.COUNT_UPDATED == 1 && format('⬆️ Update {0}', env.LIST_UPDATED) || format('⬆️ Update {0} vendored dependencies', env.COUNT_UPDATED) }}
|
||||
body: |
|
||||
### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies:
|
||||
### ${{ env.COUNT_UPDATED == 1 && format('📦 Updated {0} from `{1}` to `{2}`', env.SINGLE_DEP_NAME, env.SINGLE_DEP_OLD_VERSION, env.SINGLE_DEP_NEW_VERSION) || format('📦 Automatically updated `{0}` dependencies', env.COUNT_UPDATED) }}
|
||||
|
||||
${{ env.UPDATE_MESSAGE }}
|
||||
|
||||
${{ env.CHANGELOG_SECTION }}
|
||||
|
||||
---
|
||||
Please verify and then **Merge** the pull request to update.
|
||||
|
||||
${{ env.HAS_BREAKING_CHANGES == 'True' && '⚠️ **This update contains major version changes that may include breaking changes.**' || 'ℹ️ This update only contains minor or patch changes.' }}
|
||||
|
||||
Please verify and then **Merge** the pull request to apply the updates.
|
||||
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
|
||||
branch: update-vendor
|
||||
base: master
|
||||
|
||||
- name: Summary - Pull request created
|
||||
if: env.COUNT_UPDATED > 0 && (env.HAS_BREAKING_CHANGES == 'True' || env.AUTO_MERGED == 'false')
|
||||
shell: pwsh
|
||||
run: |
|
||||
$summary = @"
|
||||
### 🎉 Pull Request Created
|
||||
|
||||
A pull request has been created to update the vendor dependencies.
|
||||
|
||||
**Branch:** ``update-vendor``
|
||||
|
||||
$(if (-not [string]::IsNullOrEmpty($env:LIST_UPDATED)) { "**Updated dependencies:** $env:LIST_UPDATED" } else { "**Updated dependencies:** " })
|
||||
|
||||
"@
|
||||
|
||||
if ($env:HAS_BREAKING_CHANGES -eq 'True') {
|
||||
$summary += "> ⚠️ **Manual review required:** This update contains major version changes."
|
||||
} else {
|
||||
$summary += "> ℹ️ **Note:** Auto-merge failed, manual review required."
|
||||
}
|
||||
|
||||
$summary += @"
|
||||
> Please review and merge the pull request to apply the updates.
|
||||
|
||||
"@
|
||||
|
||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||
|
||||
79
CHANGELOG.md
79
CHANGELOG.md
@@ -1,5 +1,84 @@
|
||||
# Change Log
|
||||
|
||||
## [1.3.25](https://github.com/cmderdev/cmder/tree/v1.3.25) (2024-05-31)
|
||||
|
||||
### Changes
|
||||
|
||||
- Component Updates
|
||||
- Update Git for Windows to 2.45.1.windows.1.
|
||||
- Update ConEmu to 24.05.31.
|
||||
- Clink 1.6.14.
|
||||
- clink-completions 0.5.2.
|
||||
|
||||
- Add `SECURITY.md` and refresh CI workflows and actions.
|
||||
- Enable `match.expand_envvars` and improve git diagnostics for improper versions.
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #2944.
|
||||
- Fix script error when the working directory contains `%`.
|
||||
- Remove environment refresh race condition.
|
||||
|
||||
## [1.3.24](https://github.com/cmderdev/cmder/tree/v1.3.24) (2023-07-24)
|
||||
|
||||
### Changes
|
||||
|
||||
- Update `build.yml` workflow.
|
||||
|
||||
## [1.3.23](https://github.com/cmderdev/cmder/tree/v1.3.23) (2023-07-24)
|
||||
|
||||
### Changes
|
||||
|
||||
- Update ConEmu (conemu-maximus5) to 23.07.24.
|
||||
|
||||
## [1.3.22](https://github.com/cmderdev/cmder/tree/v1.3.22) (2023-07-24)
|
||||
|
||||
### Changes
|
||||
|
||||
- Handle Clink injction differently in `init.bat`.
|
||||
- Changes to `clink_settings.lua.default`.
|
||||
- Do not add commands to Clink Command Line History that begin with whitespace as a default.
|
||||
- This can be changed to the old behavior by setting `history_ignore_space` to `0` in `config\clink_settings.lua`.
|
||||
- `history.max_lines` is now defaults to `25000` instead of `10000`.
|
||||
- This can be changed back to the old behavior by setting `history_max_lines` to `10000` in `config\clink_settings.lua`.
|
||||
- `history.shared` now defaults to `False` instead of `True`.
|
||||
- The previous default of `True` was causing issues with some users when using Cmder in multiple sessions.
|
||||
- This can be changed back to the old behavior by setting `history_shared` to `1` in `config\clink_settings.lua`.
|
||||
|
||||
- Component Updates
|
||||
- Git for Windows to 2.41.0.windows.3
|
||||
- Clink to 1.5.1
|
||||
- ConEmu to 23.07.23
|
||||
- clink-completions to 0.4.10
|
||||
|
||||
- Remove AppVeyor configuration and add CodeQL scanning and Dependabot updates.
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix `/task "<taskName>"` handling.
|
||||
- Skip clink injection when initialization fails fatally.
|
||||
- Fix errors when git/svn/hg are not installed and in profile.d PowerShell scripts.
|
||||
|
||||
## [1.3.21](https://github.com/cmderdev/cmder/tree/v1.3.21) (2022-12-19)
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix #2789.
|
||||
- Fix Git Bash `GIT_INSTALL_ROOT` handling.
|
||||
|
||||
### Changes
|
||||
|
||||
- Refactor `clink.lua` to speed up the prompt.
|
||||
- Refactor and Cleanup `init.bat` and related scripts.
|
||||
- Refactor and Cleanup `profile.ps1` and related scripts.
|
||||
- Remove handling of `clink` and `tcc` incompatibility.
|
||||
- Update ConEmu to mitigate CVE-2022-46387.
|
||||
- Update Git for Windows to 2.39.0.windows.1 and Clink to 1.4.4.
|
||||
|
||||
### Adds
|
||||
|
||||
- Add `show_warning` function to `vendor\lib\lib_console.cmd` for showing warning messages in yellow.
|
||||
|
||||
## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18)
|
||||
|
||||
### Changes
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -259,6 +259,8 @@ function Fetch-DownloadUrl {
|
||||
}
|
||||
|
||||
$count = 0
|
||||
$hasBreakingChanges = $false
|
||||
$updateDetails = @()
|
||||
|
||||
# Read the current sources content
|
||||
$sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json
|
||||
@@ -301,6 +303,26 @@ foreach ($s in $sources) {
|
||||
# }
|
||||
|
||||
$count++
|
||||
|
||||
# Analyze version change type using shared function
|
||||
$result = Get-VersionChangeType -OldVersion $s.version -NewVersion $version
|
||||
$changeType = $result.ChangeType
|
||||
|
||||
# Determine if this is a breaking change
|
||||
if ($changeType -eq "downgrade" -or $changeType -eq "major") {
|
||||
$hasBreakingChanges = $true
|
||||
} elseif ($changeType -eq "unknown") {
|
||||
# If version parsing failed, treat as potentially breaking
|
||||
$hasBreakingChanges = $true
|
||||
Write-Verbose "Could not parse version as semantic version for dependency '$($s.name)' (old: '$($s.version)', new: '$version'), treating as potentially breaking"
|
||||
}
|
||||
|
||||
$updateDetails += @{
|
||||
name = $s.name
|
||||
oldVersion = $s.version
|
||||
newVersion = $version
|
||||
changeType = $changeType
|
||||
}
|
||||
}
|
||||
|
||||
$s.url = $downloadUrl
|
||||
@@ -314,12 +336,16 @@ if ($count -eq 0) {
|
||||
return
|
||||
}
|
||||
|
||||
# Export update details for GitHub Actions
|
||||
if ($Env:GITHUB_ACTIONS -eq 'true') {
|
||||
$updateDetailsJson = $updateDetails | ConvertTo-Json -Compress
|
||||
Write-Output "UPDATE_DETAILS=$updateDetailsJson" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
Write-Output "HAS_BREAKING_CHANGES=$hasBreakingChanges" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
|
||||
}
|
||||
|
||||
if ($Env:APPVEYOR -eq 'True') {
|
||||
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
|
||||
}
|
||||
|
||||
if ($Env:GITHUB_ACTIONS -eq 'true') {
|
||||
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
|
||||
}
|
||||
|
||||
Write-Host -ForegroundColor green "Successfully updated $count dependencies."
|
||||
|
||||
@@ -249,3 +249,201 @@ 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-VersionChangeType {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Analyzes version changes using semantic versioning to determine the type of update and appropriate emoji.
|
||||
|
||||
.DESCRIPTION
|
||||
Parses old and new version strings, compares them using semantic versioning rules,
|
||||
and returns information about the change type, emoji indicator, and whether it's a major update.
|
||||
|
||||
.PARAMETER OldVersion
|
||||
The previous version string (e.g., "1.2.3" or "2.52.0.windows.1").
|
||||
|
||||
.PARAMETER NewVersion
|
||||
The new version string (e.g., "1.3.0" or "3.0.0.windows.1").
|
||||
|
||||
.OUTPUTS
|
||||
Returns a hashtable with the following keys:
|
||||
- ChangeType: "major", "minor", "patch", "downgrade", or "unknown"
|
||||
- Emoji: The corresponding emoji indicator (🔥, 🚀, ⬆️, or 🔄)
|
||||
- IsMajor: Boolean indicating if this is a major version update
|
||||
|
||||
.EXAMPLE
|
||||
$result = Get-VersionChangeType -OldVersion "1.2.3" -NewVersion "2.0.0"
|
||||
# Returns: @{ ChangeType = "major"; Emoji = "🔥"; IsMajor = $true }
|
||||
|
||||
.EXAMPLE
|
||||
$result = Get-VersionChangeType -OldVersion "1.2.3" -NewVersion "1.3.0"
|
||||
# Returns: @{ ChangeType = "minor"; Emoji = "🚀"; IsMajor = $false }
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$OldVersion,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$NewVersion
|
||||
)
|
||||
|
||||
$changeType = "unknown"
|
||||
$emoji = "🔄"
|
||||
$isMajor = $false
|
||||
|
||||
try {
|
||||
# Handle versions with more than 4 parts and strip pre-release identifiers
|
||||
$oldVerStr = $OldVersion.Split('-')[0]
|
||||
$newVerStr = $NewVersion.Split('-')[0]
|
||||
|
||||
# Split by dots and take only numeric parts, first 4 max
|
||||
$oldParts = $oldVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4
|
||||
$newParts = $newVerStr.Split('.') | Where-Object { $_ -match '^\d+$' } | Select-Object -First 4
|
||||
|
||||
# Ensure we have at least 2 parts (major.minor) for semantic versioning
|
||||
if ($oldParts.Count -ge 2 -and $newParts.Count -ge 2) {
|
||||
$oldVerParseable = $oldParts -join '.'
|
||||
$newVerParseable = $newParts -join '.'
|
||||
|
||||
$oldVer = [System.Version]::Parse($oldVerParseable)
|
||||
$newVer = [System.Version]::Parse($newVerParseable)
|
||||
|
||||
if ($newVer -lt $oldVer) {
|
||||
$changeType = "downgrade"
|
||||
# Don't set emoji for downgrades in this function - caller handles it
|
||||
} elseif ($newVer.Major -gt $oldVer.Major) {
|
||||
$changeType = "major"
|
||||
$emoji = "🔥"
|
||||
$isMajor = $true
|
||||
} elseif ($newVer.Minor -gt $oldVer.Minor) {
|
||||
$changeType = "minor"
|
||||
$emoji = "🚀"
|
||||
} elseif ($newVer -gt $oldVer) {
|
||||
$changeType = "patch"
|
||||
$emoji = "⬆️"
|
||||
} else {
|
||||
# No version increase detected (versions are equal)
|
||||
$changeType = "unknown"
|
||||
$emoji = "🔄"
|
||||
}
|
||||
} else {
|
||||
# Not enough numeric parts for semantic versioning
|
||||
throw "Not enough numeric version parts"
|
||||
}
|
||||
} catch {
|
||||
# If semantic versioning fails, return unknown
|
||||
$changeType = "unknown"
|
||||
$emoji = "🔄"
|
||||
$isMajor = $false
|
||||
}
|
||||
|
||||
return @{
|
||||
ChangeType = $changeType
|
||||
Emoji = $emoji
|
||||
IsMajor = $isMajor
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
116
vendor/clink.lua
vendored
116
vendor/clink.lua
vendored
@@ -324,7 +324,7 @@ end
|
||||
-- Find out current branch
|
||||
-- @return {nil|git branch name}
|
||||
---
|
||||
local function get_git_branch(git_dir)
|
||||
local function get_git_branch(git_dir, fast)
|
||||
git_dir = git_dir or get_git_dir()
|
||||
|
||||
-- If git directory not found then we're probably outside of repo
|
||||
@@ -341,8 +341,90 @@ local function get_git_branch(git_dir)
|
||||
-- if HEAD matches branch expression, then we're on named branch
|
||||
-- otherwise it is a detached commit
|
||||
local branch_name = HEAD:match('ref: refs/heads/(.+)')
|
||||
if os.getenv("CLINK_DEBUG_GIT_REFTABLE") then
|
||||
branch_name = '.invalid'
|
||||
end
|
||||
|
||||
return branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
|
||||
-- If the branch name is ".invalid" and the fast method wasn't requested,
|
||||
-- then invoke git.exe to get accurate current branch info (slow method).
|
||||
if branch_name == ".invalid" and not fast then
|
||||
local file
|
||||
branch_name = nil
|
||||
|
||||
-- Handle the most common case first.
|
||||
if not branch_name then
|
||||
file = io_popenyield("git --no-optional-locks branch 2>nul")
|
||||
if file then
|
||||
for line in file:lines() do
|
||||
local b = line:match("^%*%s+(.*)")
|
||||
if b then
|
||||
b = b:match("^%((HEAD detached at .*)%)") or b
|
||||
branch_name = b
|
||||
break
|
||||
end
|
||||
end
|
||||
file:close()
|
||||
end
|
||||
end
|
||||
|
||||
-- Handle the cases where "git branch" output is empty, but "git
|
||||
-- branch --show-current" shows the branch name (e.g. a new repo).
|
||||
if not branch_name then
|
||||
file = io_popenyield("git --no-optional-locks branch --show-current 2>nul")
|
||||
if file then
|
||||
for line in file:lines() do -- luacheck: ignore 512
|
||||
branch_name = line
|
||||
break
|
||||
end
|
||||
file:close()
|
||||
end
|
||||
end
|
||||
else
|
||||
branch_name = branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
|
||||
end
|
||||
|
||||
return branch_name
|
||||
end
|
||||
|
||||
local function get_git_remote(git_dir, branch)
|
||||
if not git_dir then return nil end
|
||||
if not branch then return nil end
|
||||
|
||||
local file = io.open(git_dir.."/config", 'r')
|
||||
if not file then return nil end
|
||||
|
||||
local git_config = {}
|
||||
|
||||
local function get_git_config_value(section, param)
|
||||
return git_config[section] and git_config[section][param] or nil
|
||||
end
|
||||
|
||||
local section
|
||||
for line in file:lines() do
|
||||
if (line:sub(1,1) == "[" and line:sub(-1) == "]") then
|
||||
if (line:sub(2,5) == "lfs ") then
|
||||
section = nil -- skip LFS entries as there can be many and we never use them
|
||||
else
|
||||
section = line:sub(2,-2)
|
||||
git_config[section] = git_config[section] or {}
|
||||
end
|
||||
elseif section then
|
||||
local param, value = line:match('^%s-([%w|_]+)%s-=%s+(.+)$')
|
||||
if (param and value ~= nil) then
|
||||
git_config[section][param] = value
|
||||
end
|
||||
end
|
||||
end
|
||||
file:close()
|
||||
|
||||
local remote_to_push = get_git_config_value('branch "'..branch..'"', 'remote') or ''
|
||||
local remote_ref = get_git_config_value('remote "'..remote_to_push..'"', 'push') or
|
||||
get_git_config_value('push', 'default')
|
||||
|
||||
local text = remote_to_push
|
||||
if remote_ref then text = text..'/'..remote_ref end
|
||||
|
||||
return text ~= '' and text or nil
|
||||
end
|
||||
|
||||
---
|
||||
@@ -394,7 +476,7 @@ end
|
||||
-- Get the status and conflict status of working dir
|
||||
-- @return {bool <status>, bool <is_conflict>}
|
||||
---
|
||||
local function get_git_status()
|
||||
local function get_git_status(git_dir)
|
||||
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
||||
if not file then
|
||||
return {}
|
||||
@@ -416,7 +498,10 @@ local function get_git_status()
|
||||
end
|
||||
file:close()
|
||||
|
||||
return { status = is_status, conflict = conflict_found }
|
||||
local branch = get_git_branch(git_dir, false--[[fast]])
|
||||
local remote = get_git_remote(git_dir, branch)
|
||||
|
||||
return { status = is_status, branch = branch, remote = remote, conflict = conflict_found }
|
||||
end
|
||||
|
||||
---
|
||||
@@ -515,11 +600,11 @@ end
|
||||
-- Use a prompt coroutine to get git status in the background.
|
||||
-- Cache the info so we can reuse it next time to reduce flicker.
|
||||
---
|
||||
local function get_git_info_table()
|
||||
local function get_git_info_table(git_dir)
|
||||
local info = clink_promptcoroutine(function ()
|
||||
-- Use git status if allowed.
|
||||
local cmderGitStatusOptIn = get_git_status_setting()
|
||||
return cmderGitStatusOptIn and get_git_status() or {}
|
||||
return cmderGitStatusOptIn and get_git_status(git_dir) or {}
|
||||
end)
|
||||
if not info then
|
||||
info = cached_info.git_info or {}
|
||||
@@ -539,10 +624,11 @@ local function git_prompt_filter()
|
||||
local git_dir = get_git_dir()
|
||||
local color
|
||||
if git_dir then
|
||||
local branch = get_git_branch(git_dir)
|
||||
local branch = get_git_branch(git_dir, true--[[fast]])
|
||||
if branch then
|
||||
-- If in a different repo or branch than last time, discard cached info.
|
||||
if cached_info.git_dir ~= git_dir or cached_info.git_branch ~= branch then
|
||||
if cached_info.git_dir ~= git_dir or
|
||||
(branch ~= ".invalid" and cached_info.git_branch ~= branch) then
|
||||
cached_info.git_info = nil
|
||||
cached_info.git_dir = git_dir
|
||||
cached_info.git_branch = branch
|
||||
@@ -550,10 +636,22 @@ local function git_prompt_filter()
|
||||
|
||||
-- If we're inside of git repo then try to detect current branch
|
||||
-- Has branch => therefore it is a git folder, now figure out status
|
||||
local gitInfo = get_git_info_table()
|
||||
local gitInfo = get_git_info_table(git_dir)
|
||||
local gitStatus = gitInfo.status
|
||||
local gitConflict = gitInfo.conflict
|
||||
|
||||
-- Compensate for git reftables.
|
||||
branch = gitInfo.branch or branch
|
||||
if branch == ".invalid" then
|
||||
branch = "Loading..."
|
||||
elseif gitInfo.remote then
|
||||
branch = branch.." -> "..gitInfo.remote
|
||||
end
|
||||
|
||||
-- Prevent an older clink-completions git_prompt.lua scripts from
|
||||
-- modifying the prompt.
|
||||
branch = "\x1b[10m"..branch
|
||||
|
||||
if gitStatus == nil then
|
||||
color = get_unknown_color()
|
||||
elseif gitStatus then
|
||||
|
||||
116
vendor/cmder.sh
vendored
116
vendor/cmder.sh
vendored
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
# DO NOT EDIT THIS FILE IT WILL BE OVERWRITTEN ON UPDATE
|
||||
#
|
||||
# Add portable user customizations ${CMDER_ROOT}/config/user_profile.sh,
|
||||
@@ -8,130 +7,93 @@
|
||||
# Add system specific users customizations to $HOME/.bashrc, these
|
||||
# customizations will not follow Cmder to another machine.
|
||||
|
||||
# Source all .sh scripts in a given directory
|
||||
# Args: $1 - directory path containing .sh scripts to source
|
||||
run_profile_d() {
|
||||
local profile_d_scripts
|
||||
pushd "${1}" >/dev/null || return
|
||||
# shellcheck disable=SC2035
|
||||
function runProfiled {
|
||||
unset profile_d_scripts
|
||||
pushd "${1}" >/dev/null
|
||||
profile_d_scripts=$(ls *.sh 2>/dev/null)
|
||||
|
||||
if [ -n "${profile_d_scripts}" ]; then
|
||||
for script in ${profile_d_scripts}; do
|
||||
# echo Sourcing "${1}/${script}"...
|
||||
# shellcheck disable=SC1090
|
||||
. "${1}/${script}"
|
||||
if [ ! "x${profile_d_scripts}" = "x" ] ; then
|
||||
for x in ${profile_d_scripts} ; do
|
||||
# echo Sourcing "${1}/${x}"...
|
||||
. "${1}/${x}"
|
||||
done
|
||||
fi
|
||||
popd >/dev/null || return
|
||||
popd >/dev/null
|
||||
}
|
||||
|
||||
# Detect and set CMDER_ROOT for bash admin sessions
|
||||
# Converts Windows paths to Unix paths if needed
|
||||
# ConEmuDir is set by ConEmu/Cmder environment
|
||||
if [ -z "$CMDER_ROOT" ]; then
|
||||
# Try to get CMDER_ROOT from ConEmuDir
|
||||
case "$ConEmuDir" in
|
||||
*\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." && pwd );;
|
||||
esac
|
||||
|
||||
# If still not set, derive from script location (vendor -> root)
|
||||
if [ -z "$CMDER_ROOT" ]; then
|
||||
CMDER_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
|
||||
fi
|
||||
# We do this for bash as admin sessions since $CMDER_ROOT is not being set
|
||||
if [ "$CMDER_ROOT" == "" ] ; then
|
||||
case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac
|
||||
else
|
||||
case "$CMDER_ROOT" in
|
||||
*\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";;
|
||||
esac
|
||||
case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac
|
||||
fi
|
||||
|
||||
# Remove any trailing '/' from CMDER_ROOT
|
||||
CMDER_ROOT="${CMDER_ROOT%/}"
|
||||
|
||||
# Exit early if CMDER_ROOT is not set
|
||||
if [ -z "$CMDER_ROOT" ]; then
|
||||
echo "Warning: CMDER_ROOT is not set. Cmder integration skipped."
|
||||
# shellcheck disable=SC2317
|
||||
return 2>/dev/null || exit 0
|
||||
fi
|
||||
# Remove any trailing '/'
|
||||
CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
|
||||
|
||||
export CMDER_ROOT
|
||||
|
||||
# Detect Git installation location
|
||||
if [ -f "/c/Program Files/Git/cmd/git.exe" ]; then
|
||||
if [ -f "/c/Program Files/Git/cmd/git.exe" ] ; then
|
||||
GIT_INSTALL_ROOT="/c/Program Files/Git"
|
||||
elif [ -f "/c/Program Files(x86)/Git/cmd/git.exe" ]; then
|
||||
elif [ -f "/c/Program Files(x86)/Git/cmd/git.exe" ] ; then
|
||||
GIT_INSTALL_ROOT="/c/Program Files(x86)/Git"
|
||||
elif [ -f "${CMDER_ROOT}/vendor/git-for-windows/cmd/git.exe" ]; then
|
||||
GIT_INSTALL_ROOT="${CMDER_ROOT}/vendor/git-for-windows"
|
||||
elif [ -f "${CMDER_ROOT}/vendor/git-for-windows/cmd/git.exe" ] ; then
|
||||
GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows
|
||||
fi
|
||||
|
||||
# Add Git to PATH if not already present
|
||||
if [[ -n "${GIT_INSTALL_ROOT}" && ! "$PATH" =~ ${GIT_INSTALL_ROOT}/bin: ]]; then
|
||||
if [[ ! "$PATH" =~ "${GIT_INSTALL_ROOT}/bin:" ]] ; then
|
||||
PATH="${GIT_INSTALL_ROOT}/bin:$PATH"
|
||||
fi
|
||||
|
||||
# Add Cmder directories to PATH
|
||||
PATH="${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}"
|
||||
|
||||
export PATH
|
||||
|
||||
# Create profile.d directory if it doesn't exist
|
||||
if [ ! -d "${CMDER_ROOT}/config/profile.d" ]; then
|
||||
# Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d"
|
||||
# to source them at startup.
|
||||
if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then
|
||||
mkdir -p "${CMDER_ROOT}/config/profile.d"
|
||||
fi
|
||||
|
||||
# Source all .sh scripts in profile.d directories
|
||||
if [ -d "${CMDER_ROOT}/config/profile.d" ]; then
|
||||
run_profile_d "${CMDER_ROOT}/config/profile.d"
|
||||
if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then
|
||||
runProfiled "${CMDER_ROOT}/config/profile.d"
|
||||
fi
|
||||
|
||||
if [ -d "${CMDER_USER_CONFIG}/profile.d" ]; then
|
||||
run_profile_d "${CMDER_USER_CONFIG}/profile.d"
|
||||
if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
|
||||
runProfiled "${CMDER_USER_CONFIG}/profile.d"
|
||||
fi
|
||||
|
||||
|
||||
# Rename legacy user-profile.sh to user_profile.sh for consistency
|
||||
if [ -f "$CMDER_ROOT/config/user-profile.sh" ]; then
|
||||
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
|
||||
if [ -f "$CMDER_ROOT/config/user-profile.sh" ] ; then
|
||||
mv "$CMDER_ROOT/config/user-profile.sh" "$CMDER_ROOT/config/user_profile.sh"
|
||||
fi
|
||||
|
||||
# Source user profile from CMDER_ROOT config
|
||||
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ]; then
|
||||
CmderUserProfilePath="${CMDER_ROOT}/config/user_profile.sh"
|
||||
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ] ; then
|
||||
. "${CMDER_ROOT}/config/user_profile.sh"
|
||||
fi
|
||||
|
||||
# Handle CMDER_USER_CONFIG if set
|
||||
if [ -n "${CMDER_USER_CONFIG}" ]; then
|
||||
# Rename legacy user-profile.sh to user_profile.sh for consistency
|
||||
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ]; then
|
||||
if [ "${CMDER_USER_CONFIG}" != "" ] ; then
|
||||
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
|
||||
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ] ; then
|
||||
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
|
||||
fi
|
||||
|
||||
export PATH="${CMDER_USER_CONFIG}/bin:$PATH"
|
||||
|
||||
# Source user profile from CMDER_USER_CONFIG
|
||||
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
|
||||
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
|
||||
. "${CMDER_USER_CONFIG}/user_profile.sh"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Determine the user profile path for creation if needed
|
||||
if [ -n "${CMDER_USER_CONFIG}" ]; then
|
||||
cmder_user_profile_path="${CMDER_USER_CONFIG}/user_profile.sh"
|
||||
else
|
||||
cmder_user_profile_path="${CMDER_ROOT}/config/user_profile.sh"
|
||||
fi
|
||||
|
||||
# Create user profile from default template if it doesn't exist
|
||||
if [ ! -f "${cmder_user_profile_path}" ] && [ -f "${CMDER_ROOT}/vendor/user_profile.sh.default" ]; then
|
||||
echo "Creating user startup file: ${cmder_user_profile_path}"
|
||||
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${cmder_user_profile_path}"
|
||||
if [ ! -f "${CmderUserProfilePath}" ] ; then
|
||||
echo Creating user startup file: "${CmderUserProfilePath}"
|
||||
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
|
||||
fi
|
||||
|
||||
# Source the users .bashrc file if it exists
|
||||
if [ -f "${HOME}/.bashrc" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
if [ -f "${HOME}/.bashrc" ] ; then
|
||||
. "${HOME}/.bashrc"
|
||||
fi
|
||||
|
||||
123
vendor/cmder_exinit
vendored
123
vendor/cmder_exinit
vendored
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copy this file to your non integrated *nix-like environment,
|
||||
# Cygwin/MSys2/Git for Windows SDK, installs '/etc/profile.d/'
|
||||
# folder to integrate the externally installed Unix like environment
|
||||
@@ -23,130 +22,92 @@
|
||||
# # from outside Cmder.
|
||||
# CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder.
|
||||
|
||||
# Source all .sh or .zsh scripts in a given directory based on shell type
|
||||
# Args: $1 - directory path containing shell scripts to source
|
||||
run_profile_d() {
|
||||
local profile_d_scripts
|
||||
pushd "${1}" >/dev/null || return
|
||||
function runProfiled {
|
||||
unset profile_d_scripts
|
||||
pushd "${1}" >/dev/null
|
||||
|
||||
if [ -n "${ZSH_VERSION}" ]; then
|
||||
# shellcheck disable=SC2035
|
||||
if [ ! "x${ZSH_VERSION}" = "x" ]; then
|
||||
profile_d_scripts=$(ls *.zsh 2>/dev/null)
|
||||
elif [ -n "${BASH_VERSION}" ]; then
|
||||
# shellcheck disable=SC2035
|
||||
elif [ ! "x${BASH_VERSION}" = "x" ]; then
|
||||
profile_d_scripts=$(ls *.sh 2>/dev/null)
|
||||
fi
|
||||
|
||||
if [ -n "${profile_d_scripts}" ]; then
|
||||
for script in ${profile_d_scripts}; do
|
||||
echo "Sourcing ${1}/${script}..."
|
||||
# shellcheck disable=SC1090
|
||||
. "${1}/${script}"
|
||||
if [ ! "x${profile_d_scripts}" = "x" ] ; then
|
||||
for x in ${profile_d_scripts} ; do
|
||||
echo Sourcing "${1}/${x}"...
|
||||
. "${1}/${x}"
|
||||
done
|
||||
fi
|
||||
popd >/dev/null || return
|
||||
popd >/dev/null
|
||||
}
|
||||
|
||||
# Check that we haven't already been sourced
|
||||
# Check that we haven't already been sourced.
|
||||
[[ -z ${CMDER_EXINIT} ]] && CMDER_EXINIT="1" || return
|
||||
|
||||
# Detect and set CMDER_ROOT for bash admin sessions
|
||||
# Converts Windows paths to Unix paths if needed
|
||||
# ConEmuDir is set by ConEmu/Cmder environment
|
||||
if [ -z "$CMDER_ROOT" ] && [ -n "$ConEmuDir" ]; then
|
||||
if [ -d "${ConEmuDir}../../vendor" ]; then
|
||||
case "$ConEmuDir" in
|
||||
*\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." && pwd );;
|
||||
esac
|
||||
# We do this for bash as admin sessions since $CMDER_ROOT is not being set
|
||||
if [ "$CMDER_ROOT" = "" -a "$ConEmuDir" != "" ] ; then
|
||||
if [ -d "${ConEmuDir}../../vendor" ] ; then
|
||||
case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac
|
||||
else
|
||||
echo "Running in ConEmu without Cmder, skipping Cmder integration."
|
||||
fi
|
||||
elif [ -n "$CMDER_ROOT" ]; then
|
||||
case "$CMDER_ROOT" in
|
||||
*\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";;
|
||||
esac
|
||||
elif [ "$CMDER_ROOT" != "" ] ; then
|
||||
case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac
|
||||
fi
|
||||
|
||||
# If CMDER_ROOT is still not set, try to derive from script location
|
||||
# Note: This only works if cmder_exinit is in its original location (vendor/)
|
||||
if [ -z "$CMDER_ROOT" ] && [ -f "${BASH_SOURCE[0]}" ]; then
|
||||
# Check if we're in the vendor directory
|
||||
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
if [[ "$script_dir" == */vendor ]] || [[ "$script_dir" == */vendor/* ]]; then
|
||||
# Extract the Cmder root (parent of vendor)
|
||||
CMDER_ROOT="$( cd "$script_dir/.." && pwd )"
|
||||
# Verify this looks like a Cmder installation
|
||||
if [ ! -d "${CMDER_ROOT}/vendor" ]; then
|
||||
unset CMDER_ROOT
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ ! "$CMDER_ROOT" = "" ] ; then
|
||||
# Remove any trailing '/'
|
||||
CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
|
||||
|
||||
if [ -n "$CMDER_ROOT" ]; then
|
||||
# Remove any trailing '/' from CMDER_ROOT
|
||||
CMDER_ROOT="${CMDER_ROOT%/}"
|
||||
|
||||
echo "Using CMDER_ROOT at \"${CMDER_ROOT}\"."
|
||||
echo "Using \"CMDER_ROOT\" at \"${CMDER_ROOT}\"."
|
||||
|
||||
export CMDER_ROOT
|
||||
|
||||
# Add Cmder directories to PATH
|
||||
PATH="${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}"
|
||||
PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}
|
||||
|
||||
export PATH
|
||||
|
||||
# Create profile.d directory if it doesn't exist
|
||||
if [ ! -d "${CMDER_ROOT}/config/profile.d" ]; then
|
||||
# Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d"
|
||||
# to source them at startup.
|
||||
if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then
|
||||
mkdir -p "${CMDER_ROOT}/config/profile.d"
|
||||
fi
|
||||
|
||||
# Source all shell scripts in profile.d directories
|
||||
if [ -d "${CMDER_ROOT}/config/profile.d" ]; then
|
||||
run_profile_d "${CMDER_ROOT}/config/profile.d"
|
||||
if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then
|
||||
runProfiled "${CMDER_ROOT}/config/profile.d"
|
||||
fi
|
||||
|
||||
if [ -d "${CMDER_USER_CONFIG}/profile.d" ]; then
|
||||
run_profile_d "${CMDER_USER_CONFIG}/profile.d"
|
||||
if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
|
||||
runProfiled "${CMDER_USER_CONFIG}/profile.d"
|
||||
fi
|
||||
|
||||
|
||||
# Rename legacy user-profile.sh to user_profile.sh for consistency
|
||||
if [ -f "$CMDER_ROOT/config/user-profile.sh" ]; then
|
||||
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
|
||||
if [ -f "$CMDER_ROOT/config/user-profile.sh" ] ; then
|
||||
mv "$CMDER_ROOT/config/user-profile.sh" "$CMDER_ROOT/config/user_profile.sh"
|
||||
fi
|
||||
|
||||
# Source user profile from CMDER_ROOT config
|
||||
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
CmderUserProfilePath="${CMDER_ROOT}/config/user_profile.sh"
|
||||
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ] ; then
|
||||
. "${CMDER_ROOT}/config/user_profile.sh"
|
||||
fi
|
||||
|
||||
# Handle CMDER_USER_CONFIG if set
|
||||
if [ -n "${CMDER_USER_CONFIG}" ]; then
|
||||
# Rename legacy user-profile.sh to user_profile.sh for consistency
|
||||
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ]; then
|
||||
if [ "${CMDER_USER_CONFIG}" != "" ] ; then
|
||||
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
|
||||
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ] ; then
|
||||
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
|
||||
fi
|
||||
|
||||
export PATH="${CMDER_USER_CONFIG}/bin:$PATH"
|
||||
export PATH=${CMDER_USER_CONFIG}/bin:$PATH
|
||||
|
||||
# Source user profile from CMDER_USER_CONFIG
|
||||
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ]; then
|
||||
# shellcheck disable=SC1091
|
||||
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
|
||||
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
|
||||
. "${CMDER_USER_CONFIG}/user_profile.sh"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Determine the user profile path for creation if needed
|
||||
if [ -n "${CMDER_USER_CONFIG}" ]; then
|
||||
cmder_user_profile_path="${CMDER_USER_CONFIG}/user_profile.sh"
|
||||
else
|
||||
cmder_user_profile_path="${CMDER_ROOT}/config/user_profile.sh"
|
||||
fi
|
||||
|
||||
# Create user profile from default template if it doesn't exist
|
||||
if [ ! -f "${cmder_user_profile_path}" ] && [ -f "${CMDER_ROOT}/vendor/user_profile.sh.default" ]; then
|
||||
echo "Creating user startup file: ${cmder_user_profile_path}"
|
||||
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${cmder_user_profile_path}"
|
||||
if [ ! -f "${CmderUserProfilePath}" ] ; then
|
||||
echo Creating user startup file: "${CmderUserProfilePath}"
|
||||
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
|
||||
fi
|
||||
fi
|
||||
|
||||
12
vendor/sources.json
vendored
12
vendor/sources.json
vendored
@@ -1,13 +1,13 @@
|
||||
[
|
||||
{
|
||||
"name": "git-for-windows",
|
||||
"version": "2.51.2.windows.1",
|
||||
"url": "https://github.com/git-for-windows/git/releases/download/v2.51.2.windows.1/PortableGit-2.51.2-64-bit.7z.exe"
|
||||
"version": "2.52.0.windows.1",
|
||||
"url": "https://github.com/git-for-windows/git/releases/download/v2.52.0.windows.1/PortableGit-2.52.0-64-bit.7z.exe"
|
||||
},
|
||||
{
|
||||
"name": "clink",
|
||||
"version": "1.8.8",
|
||||
"url": "https://github.com/chrisant996/clink/releases/download/v1.8.8/clink.1.8.8.a63364.zip"
|
||||
"version": "1.9.5",
|
||||
"url": "https://github.com/chrisant996/clink/releases/download/v1.9.5/clink.1.9.5.ee6b4f.zip"
|
||||
},
|
||||
{
|
||||
"name": "conemu-maximus5",
|
||||
@@ -21,7 +21,7 @@
|
||||
},
|
||||
{
|
||||
"name": "clink-completions",
|
||||
"version": "0.6.6",
|
||||
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.6.zip"
|
||||
"version": "0.6.7",
|
||||
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.7.zip"
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user