mirror of
https://github.com/cmderdev/cmder.git
synced 2026-03-17 08:16:07 +08:00
Compare commits
22 Commits
setup-cmde
...
dax/fix-gi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
adbd6322f6 | ||
|
|
0c6b2d9900 | ||
|
|
66ab9ad6f7 | ||
|
|
6137073ba3 | ||
|
|
6858619614 | ||
|
|
002282636a | ||
|
|
48cc28a634 | ||
|
|
e71c7679f6 | ||
|
|
dc93fa5d1b | ||
|
|
684185ca8a | ||
|
|
2780a43323 | ||
|
|
641ce7b1e8 | ||
|
|
a52b0b9e10 | ||
|
|
825df3aace | ||
|
|
a937901e82 | ||
|
|
27c7a0cdc6 | ||
|
|
838c1cfaa3 | ||
|
|
bff3862ad4 | ||
|
|
2057ee58b0 | ||
|
|
0bc7fd3aaa | ||
|
|
1e04711a21 | ||
|
|
3810b8d258 |
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@@ -1,7 +1,12 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
# Enable version updates for GitHub Actions
|
# Enable version updates for GitHub Actions
|
||||||
- package-ecosystem: "github-actions"
|
- package-ecosystem: "github-actions" # See documentation for possible values
|
||||||
directory: "/" # Location of package manifests
|
directory: "/" # Location of package manifests
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "weekly"
|
||||||
|
|||||||
210
.github/workflows/build.yml
vendored
210
.github/workflows/build.yml
vendored
@@ -42,17 +42,61 @@ jobs:
|
|||||||
- name: Summary - Repository checkout
|
- name: Summary - Repository checkout
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "## 📦 Build Cmder - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
# Get Cmder version
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
. scripts/utils.ps1
|
||||||
echo "### Repository Information" >> $env:GITHUB_STEP_SUMMARY
|
$cmderVersion = Get-VersionStr
|
||||||
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
|
$buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
|
||||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
# Determine branch link (handle PR merge refs)
|
||||||
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
$branchName = "${{ github.ref_name }}"
|
||||||
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
$branchLink = ""
|
||||||
echo "| Actor | @${{ github.actor }} |" >> $env:GITHUB_STEP_SUMMARY
|
if ($branchName -match '^(\d+)/(merge|head)$') {
|
||||||
echo "| Workflow | \`${{ github.workflow }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
# This is a PR merge/head ref, link to the PR
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
$prNumber = $Matches[1]
|
||||||
|
$branchLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
|
||||||
|
} elseif ("${{ github.event_name }}" -eq "pull_request") {
|
||||||
|
# This is a pull request event, link to the PR
|
||||||
|
$branchLink = "https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
|
||||||
|
} else {
|
||||||
|
# Regular branch, link to the branch tree
|
||||||
|
$branchLink = "https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}"
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary = @"
|
||||||
|
## 📦 Build Cmder - Workflow Summary
|
||||||
|
|
||||||
|
<small>Build started: $buildTime</small>
|
||||||
|
|
||||||
|
### Repository Information
|
||||||
|
| Property | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) |
|
||||||
|
| Branch | [``$branchName``]($branchLink) |
|
||||||
|
| Commit | [``${{ github.sha }}``](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) |
|
||||||
|
| Actor | [@${{ github.actor }}](https://github.com/${{ github.actor }}) |
|
||||||
|
| Workflow | ``${{ github.workflow }}`` |
|
||||||
|
| Cmder Version | **$cmderVersion** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📁 Vendor Packages
|
||||||
|
| Package | Version |
|
||||||
|
| --- | --- |
|
||||||
|
"@
|
||||||
|
|
||||||
|
# Read vendor sources.json and add to summary
|
||||||
|
$vendorSources = Get-Content "vendor/sources.json" | ConvertFrom-Json
|
||||||
|
if ($vendorSources.Count -eq 0) {
|
||||||
|
$summary += "`n| _No vendor packages found_ | |"
|
||||||
|
} else {
|
||||||
|
foreach ($vendor in $vendorSources) {
|
||||||
|
$summary += "`n| ``$($vendor.name)`` | $($vendor.version) |"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary += "`n"
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Add MSBuild to PATH
|
- name: Add MSBuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v2
|
||||||
@@ -66,36 +110,23 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### ✅ Build Status" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @"
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "Cmder launcher successfully compiled." >> $env:GITHUB_STEP_SUMMARY
|
---
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
### Build Status
|
||||||
|
|
||||||
|
✅ Cmder built successfully.
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Pack the built files
|
- name: Pack the built files
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
working-directory: scripts
|
working-directory: scripts
|
||||||
run: .\pack.ps1 -verbose
|
run: .\pack.ps1 -verbose
|
||||||
|
|
||||||
- name: Summary - Package artifacts
|
|
||||||
if: success()
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
echo "### 📦 Artifacts Created" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "| Artifact | Size | Hash (SHA256) |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "| --- | --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
$artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip")
|
|
||||||
foreach ($artifact in $artifacts) {
|
|
||||||
$path = "build/$artifact"
|
|
||||||
if (Test-Path $path) {
|
|
||||||
$size = (Get-Item $path).Length / 1MB
|
|
||||||
# Truncate hash to first 16 chars for summary readability (full hash in hashes.txt)
|
|
||||||
$hash = (Get-FileHash $path -Algorithm SHA256).Hash.Substring(0, 16)
|
|
||||||
echo "| \`$artifact\` | $([math]::Round($size, 2)) MB | \`$hash...\` |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
|
||||||
- name: Upload artifact (cmder.zip)
|
- name: Upload artifact (cmder.zip)
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
@@ -124,15 +155,82 @@ jobs:
|
|||||||
- name: Summary - Artifacts uploaded
|
- name: Summary - Artifacts uploaded
|
||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
run: |
|
run: |
|
||||||
echo "### ☁️ Upload Status" >> $env:GITHUB_STEP_SUMMARY
|
$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
|
### 🗃️ Artifacts
|
||||||
echo '- ✅ `cmder_mini.zip`' >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo '- ✅ `hashes.txt`' >> $env:GITHUB_STEP_SUMMARY
|
| Artifact | Size | Download | Hash (SHA256) |
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
| --- | --- | --- | --- |
|
||||||
|
"@
|
||||||
|
|
||||||
|
# Function to get artifact download URL with retry logic
|
||||||
|
function Get-ArtifactDownloadUrl {
|
||||||
|
param(
|
||||||
|
[string]$ArtifactName,
|
||||||
|
[int]$MaxRetries = 3,
|
||||||
|
[int]$DelaySeconds = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
for ($i = 0; $i -lt $MaxRetries; $i++) {
|
||||||
|
try {
|
||||||
|
# Use GitHub CLI to get artifact information
|
||||||
|
$artifactsJson = gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" --jq ".artifacts[] | select(.name == `"$ArtifactName`")"
|
||||||
|
|
||||||
|
if ($artifactsJson) {
|
||||||
|
$artifact = $artifactsJson | ConvertFrom-Json
|
||||||
|
if ($artifact.archive_download_url) {
|
||||||
|
return $artifact.archive_download_url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Host "Attempt $($i + 1) failed to get artifact URL for $ArtifactName : $_"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($i -lt ($MaxRetries - 1)) {
|
||||||
|
Start-Sleep -Seconds $DelaySeconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
$artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip", "hashes.txt")
|
||||||
|
foreach ($artifact in $artifacts) {
|
||||||
|
$path = "build/$artifact"
|
||||||
|
if (Test-Path $path) {
|
||||||
|
$size = (Get-Item $path).Length / 1MB
|
||||||
|
$hash = (Get-FileHash $path -Algorithm SHA256).Hash
|
||||||
|
|
||||||
|
# Try to get the actual artifact download URL
|
||||||
|
$downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact
|
||||||
|
$warning = ""
|
||||||
|
|
||||||
|
if (-not $downloadUrl) {
|
||||||
|
# Fallback to workflow run page if artifact URL fetch fails
|
||||||
|
$downloadUrl = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
|
$warning = " ⚠️"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine emoji based on file type
|
||||||
|
if ($artifact -match '\.txt$') {
|
||||||
|
$emoji = "📄"
|
||||||
|
} elseif ($artifact -match '\.(zip|7z)$') {
|
||||||
|
$emoji = "🗄️"
|
||||||
|
} else {
|
||||||
|
$emoji = "📦"
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary += "`n| $emoji ``$artifact`` | $([math]::Round($size, 2)) MB | [📥 Download$warning]($downloadUrl) | ``$hash`` |"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$summary += "`n"
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
@@ -150,14 +248,20 @@ jobs:
|
|||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### 🚀 Release Information" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @"
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "Draft release created for tag: **\`${{ github.ref_name }}\`**" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "Release includes:" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "- Full version (\`cmder.zip\`, \`cmder.7z\`)" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "- Mini version (\`cmder_mini.zip\`)" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "- File hashes (\`hashes.txt\`)" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "> ⚠️ Release is in **draft** mode. Please review and publish manually." >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Release Information
|
||||||
|
|
||||||
|
🚀 Draft release created for tag: **``${{ github.ref_name }}``**
|
||||||
|
|
||||||
|
Release includes:
|
||||||
|
- Full version (``cmder.zip``, ``cmder.7z``)
|
||||||
|
- Mini version (``cmder_mini.zip``)
|
||||||
|
- File hashes (``hashes.txt``)
|
||||||
|
|
||||||
|
> ⚠️ Release is in **draft** mode. Please review and publish manually.
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
65
.github/workflows/codeql.yml
vendored
65
.github/workflows/codeql.yml
vendored
@@ -50,20 +50,21 @@ jobs:
|
|||||||
- name: Summary - CodeQL analysis started
|
- name: Summary - CodeQL analysis started
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$summary = @(
|
$summary = @"
|
||||||
'## 🔒 CodeQL Security Analysis - Workflow Summary'
|
## 🔒 CodeQL Security Analysis - Workflow Summary
|
||||||
''
|
|
||||||
'### Analysis Configuration'
|
### Analysis Configuration
|
||||||
''
|
|
||||||
'| Property | Value |'
|
| Property | Value |
|
||||||
'| --- | --- |'
|
| --- | --- |
|
||||||
'| Repository | `${{ github.repository }}` |'
|
| Repository | ``${{ github.repository }}`` |
|
||||||
'| Branch | `${{ github.ref_name }}` |'
|
| Branch | ``${{ github.ref_name }}`` |
|
||||||
'| Language | `${{ matrix.language }}` |'
|
| Language | ``${{ matrix.language }}`` |
|
||||||
'| Commit | `${{ github.sha }}` |'
|
| Commit | ``${{ github.sha }}`` |
|
||||||
''
|
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
@@ -89,13 +90,14 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$summary = @(
|
$summary = @"
|
||||||
'### ✅ Build Completed'
|
### ✅ Build Completed
|
||||||
''
|
|
||||||
'Cmder launcher built successfully for CodeQL analysis.'
|
Cmder launcher built successfully for CodeQL analysis.
|
||||||
''
|
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v4
|
uses: github/codeql-action/analyze@v4
|
||||||
@@ -106,13 +108,14 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$summary = @(
|
$summary = @"
|
||||||
'### 🔍 CodeQL Analysis Results'
|
### 🔍 CodeQL Analysis Results
|
||||||
''
|
|
||||||
'✅ CodeQL security analysis completed successfully.'
|
✅ CodeQL security analysis completed successfully.
|
||||||
''
|
|
||||||
'**Language analyzed:** `${{ matrix.language }}`'
|
**Language analyzed:** ``${{ matrix.language }}``
|
||||||
''
|
|
||||||
'> Check the Security tab for detailed findings and recommendations.'
|
> Check the Security tab for detailed findings and recommendations.
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
104
.github/workflows/tests.yml
vendored
104
.github/workflows/tests.yml
vendored
@@ -39,20 +39,33 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Summary - Test execution started
|
- name: Summary - Test execution started
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "## 🧪 Run Tests - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
# Get Cmder version
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
. scripts/utils.ps1
|
||||||
echo "### Test Environment" >> $env:GITHUB_STEP_SUMMARY
|
$cmderVersion = Get-VersionStr
|
||||||
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @"
|
||||||
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
## ✅ Run Tests - Workflow Summary
|
||||||
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
### Test Environment
|
||||||
echo "| Runner OS | \`${{ runner.os }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
| Property | Value |
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
| --- | --- |
|
||||||
|
| Repository | ``${{ github.repository }}`` |
|
||||||
|
| Branch | ``${{ github.ref_name }}`` |
|
||||||
|
| Commit | ``${{ github.sha }}`` |
|
||||||
|
| Runner OS | ``${{ runner.os }}`` |
|
||||||
|
| Cmder Version | **$cmderVersion** |
|
||||||
|
| PowerShell Version | **$($PSVersionTable.PSVersion)** |
|
||||||
|
| Event | ``${{ github.event_name }}`` |
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Initialize vendors
|
- name: Initialize vendors
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
@@ -63,21 +76,51 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### ⚙️ Vendor Initialization" >> $env:GITHUB_STEP_SUMMARY
|
# Get vendor versions from sources.json
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
$vendorInfo = @()
|
||||||
echo "✅ Vendor dependencies initialized successfully." >> $env:GITHUB_STEP_SUMMARY
|
$sources = Get-Content "vendor\sources.json" -Raw | ConvertFrom-Json
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
$vendorDirs = $sources.PSObject.Properties | ForEach-Object { $_.Name }
|
||||||
|
foreach ($dir in $vendorDirs) {
|
||||||
|
$versionFile = "vendor/$dir/.cmderver"
|
||||||
|
if (Test-Path $versionFile) {
|
||||||
|
$version = Get-Content $versionFile -Raw
|
||||||
|
$vendorInfo += "- **$dir**: $($version.Trim())"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary = @"
|
||||||
|
### ⚙️ Vendor Initialization
|
||||||
|
|
||||||
|
✅ Vendor dependencies initialized successfully.
|
||||||
|
|
||||||
|
**Vendor Versions:**
|
||||||
|
"@
|
||||||
|
|
||||||
|
$(
|
||||||
|
if ($vendorInfo.Count -eq 0) {
|
||||||
|
$summary += "_No vendor version information available._"
|
||||||
|
} else {
|
||||||
|
$summary += $vendorInfo -join '`n'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Summary - Test results table header
|
- name: Summary - Test results table header
|
||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### 📋 Test Results" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @"
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
### 📋 Test Results
|
||||||
echo "| Test | Status |" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
| Test | Status | Duration |
|
||||||
|
| --- | --- | --- |
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Testing Clink Shell
|
- name: Testing Clink Shell
|
||||||
|
id: test-clink
|
||||||
run: |
|
run: |
|
||||||
cmd /c vendor\init.bat /v /d /t
|
cmd /c vendor\init.bat /v /d /t
|
||||||
|
|
||||||
@@ -85,8 +128,9 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "| Clink Shell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY
|
"| Clink Shell | ✅ Passed | Cmd shell initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
- name: Testing PowerShell
|
- name: Testing PowerShell
|
||||||
|
id: test-powershell
|
||||||
run: |
|
run: |
|
||||||
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
|
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
|
||||||
|
|
||||||
@@ -94,8 +138,9 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "| PowerShell | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY
|
"| PowerShell | ✅ Passed | Profile script execution |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
- name: Testing Bash
|
- name: Testing Bash
|
||||||
|
id: test-bash
|
||||||
run: |
|
run: |
|
||||||
bash vendor/cmder.sh
|
bash vendor/cmder.sh
|
||||||
|
|
||||||
@@ -103,13 +148,22 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "| Bash | ✅ Passed |" >> $env:GITHUB_STEP_SUMMARY
|
"| Bash | ✅ Passed | Bash environment initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Summary - All tests completed
|
- name: Summary - All tests completed
|
||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @"
|
||||||
echo "### ✅ All Tests Completed" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
### ✅ All Tests Completed
|
||||||
echo "All shell environments tested successfully!" >> $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
All shell environments tested successfully!
|
||||||
|
|
||||||
|
**Test Coverage:**
|
||||||
|
- ✅ Clink shell environment (Windows cmd.exe with Clink)
|
||||||
|
- ✅ PowerShell environment (with Cmder profile)
|
||||||
|
- ✅ Bash environment (Git Bash integration)
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
71
.github/workflows/vendor.yml
vendored
71
.github/workflows/vendor.yml
vendored
@@ -31,13 +31,14 @@ jobs:
|
|||||||
- name: Summary - Workflow started
|
- name: Summary - Workflow started
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$summary = @(
|
$summary = @"
|
||||||
'## 📦 Update Vendor - Workflow Summary'
|
## 📦 Update Vendor - Workflow Summary
|
||||||
''
|
|
||||||
'Checking for vendor dependency updates...'
|
Checking for vendor dependency updates...
|
||||||
''
|
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- id: make-changes
|
- id: make-changes
|
||||||
name: Checking for updates
|
name: Checking for updates
|
||||||
@@ -60,6 +61,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
if ($count -eq 0) { return }
|
if ($count -eq 0) { return }
|
||||||
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
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
|
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||||
|
|
||||||
- name: Summary - Update check results
|
- name: Summary - Update check results
|
||||||
@@ -67,26 +69,26 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
$count = [int]$env:COUNT_UPDATED
|
$count = [int]$env:COUNT_UPDATED
|
||||||
if ($count -eq 0) {
|
if ($count -eq 0) {
|
||||||
$summary = @(
|
$summary = @"
|
||||||
'### ✅ No Updates Available'
|
### ✅ No Updates Available
|
||||||
''
|
|
||||||
'All vendor dependencies are up to date.'
|
All vendor dependencies are up to date.
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
} else {
|
} else {
|
||||||
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
|
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
|
||||||
$summary = @(
|
$summary = @"
|
||||||
'### 🔄 Updates Found'
|
### 🔄 Updates Found
|
||||||
''
|
|
||||||
"**$count** vendor $word updated:"
|
**$count** vendor $word updated:
|
||||||
''
|
|
||||||
$env:UPDATE_MESSAGE
|
$env:UPDATE_MESSAGE
|
||||||
''
|
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- uses: peter-evans/create-pull-request@v8
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
|
- uses: peter-evans/create-pull-request@v7
|
||||||
if: env.COUNT_UPDATED > 0
|
if: env.COUNT_UPDATED > 0
|
||||||
with:
|
with:
|
||||||
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
|
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
|
||||||
@@ -103,15 +105,16 @@ jobs:
|
|||||||
if: env.COUNT_UPDATED > 0
|
if: env.COUNT_UPDATED > 0
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$summary = @(
|
$Summary = @"
|
||||||
'### 🎉 Pull Request Created'
|
### 🎉 Pull Request Created
|
||||||
''
|
|
||||||
'A pull request has been created to update the vendor dependencies.'
|
A pull request has been created to update the vendor dependencies.
|
||||||
''
|
|
||||||
'**Branch:** `update-vendor`'
|
**Branch:** ``update-vendor``
|
||||||
''
|
|
||||||
$env:LIST_UPDATED -and "**Updated dependencies:** $env:LIST_UPDATED" -or "**Updated dependencies:** "
|
**Updated dependencies:** $env:LIST_UPDATED
|
||||||
''
|
|
||||||
'> Please review and merge the pull request to apply the updates.'
|
> Please review and merge the pull request to apply the updates.
|
||||||
)
|
"@
|
||||||
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
330
vendor/bin/Setup-Cmder.ps1
vendored
330
vendor/bin/Setup-Cmder.ps1
vendored
@@ -1,330 +0,0 @@
|
|||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Integrate Cmder into the system and optionally add Cmder VS Code terminal profiles.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This script can perform three primary actions:
|
|
||||||
- Add/merge Cmder terminal profiles into VS Code's `terminal.integrated.profiles.windows` (when `-VSCode` is used).
|
|
||||||
- Set the user environment variable `CMDER_ROOT` (when `-SetRootEnv` is used).
|
|
||||||
- Prepend `CMDER_ROOT` to the user's `Path` variable (when `-PrependPath` is used).
|
|
||||||
|
|
||||||
The script attempts to discover a VS Code `settings.json` when `-SettingsJsonPath` is not provided. It will
|
|
||||||
only create a timestamped backup and write `settings.json` if the merged JSON differs from the original.
|
|
||||||
|
|
||||||
.PARAMETER VSCode
|
|
||||||
Switch to enable adding/merging Cmder profiles into VS Code `settings.json`. Defaults to enabled if the `code` command is found in the PATH.
|
|
||||||
|
|
||||||
.PARAMETER SetRootEnv
|
|
||||||
Switch to set the user environment variable `CMDER_ROOT` (if missing). Defaults to enabled.
|
|
||||||
|
|
||||||
.PARAMETER PrependPath
|
|
||||||
Switch to prepend `CMDER_ROOT` to the user's `Path` (if `cmder.exe` is not already on the Path). Defaults to enabled.
|
|
||||||
|
|
||||||
.PARAMETER CmderRoot
|
|
||||||
Path to the Cmder installation root. Defaults to the `CMDER_ROOT` environment variable if present, otherwise the current directory.
|
|
||||||
|
|
||||||
.PARAMETER DefaultProfile
|
|
||||||
Optional name of the Cmder profile to set as the default VS Code terminal profile. Valid values: 'Cmder - Cmd', 'Cmder - PowerShell', 'Cmder - Bash'.
|
|
||||||
|
|
||||||
.PARAMETER Confirm
|
|
||||||
When supplied, the script will skip the interactive confirmation prompt and proceed non-interactively. If omitted the script prompts in the terminal (default behavior).
|
|
||||||
|
|
||||||
.PARAMETER SettingsJsonPath
|
|
||||||
Explicit path to the VS Code `settings.json` to modify. If omitted the script attempts to discover a suitable file under common locations.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
# Dry-run / test (read-only):
|
|
||||||
.
|
|
||||||
.\vendor\bin\Add-CmderVSCodeProfiles.ps1 -SettingsJsonPath "$env:APPDATA\Code\User\settings.json" -Confirm
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
# Interactive use (default):
|
|
||||||
.
|
|
||||||
.\vendor\bin\Add-CmderVSCodeProfiles.ps1 -SettingsJsonPath "$env:APPDATA\Code\User\settings.json"
|
|
||||||
|
|
||||||
.NOTES
|
|
||||||
- The script writes a timestamped backup only when changes are required.
|
|
||||||
- It uses a terminal prompt (`Read-Host`) for confirmation unless `-Confirm` is provided.
|
|
||||||
- It requires appropriate permissions to modify the user's registry environment variables and to write the `settings.json` file.
|
|
||||||
Script: vendor/bin/Add-CmderVSCodeProfiles.ps1
|
|
||||||
#>
|
|
||||||
|
|
||||||
[CmdletBinding()]
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory=$false)][switch]$VSCode = $true,
|
|
||||||
|
|
||||||
[Parameter(Mandatory=$false)][switch]$SetRootEnv = $true,
|
|
||||||
|
|
||||||
[Parameter(Mandatory=$false)][switch]$PrependPath = $true,
|
|
||||||
|
|
||||||
[Parameter(Mandatory=$false)]
|
|
||||||
# default $CmderRoot to the environment variable CMDER_ROOT if set, otherwise to the current directory
|
|
||||||
[string]$CmderRoot = $env:CMDER_ROOT ? $env:CMDER_ROOT : (Get-Location).ProviderPath,
|
|
||||||
|
|
||||||
[Parameter(Mandatory=$false)]
|
|
||||||
[string]$DefaultProfile,
|
|
||||||
|
|
||||||
[Parameter(Mandatory=$false)][switch]$Confirm,
|
|
||||||
|
|
||||||
[Parameter(Mandatory=$false)]
|
|
||||||
[string]$SettingsJsonPath
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not (get-command 'code')) {
|
|
||||||
Write-Error "VS Code command 'code' not found in PATH. Ensure VS Code is installed and 'code' is available in the command line."
|
|
||||||
$VSCode = $false
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($VSCode -and $DefaultProfile) {
|
|
||||||
if ($DefaultProfile -notin @('Cmder - Cmd','Cmder - PowerShell','Cmder - Bash').Contains($DefaultProfile)) {
|
|
||||||
Write-Error "Invalid value for -DefaultProfile: '$DefaultProfile'. Valid options are 'Cmder - Cmd', 'Cmder - PowerShell', or 'Cmder - Bash'."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Merge-ProfilesToObject($target) {
|
|
||||||
# Collect existing profiles into a plain hashtable (handle IDictionary or PSCustomObject)
|
|
||||||
$combined = @{}
|
|
||||||
$existing = $null
|
|
||||||
if ($target.PSObject.Properties.Name -contains $propName) {
|
|
||||||
$existing = $target.PSObject.Properties[$propName].Value
|
|
||||||
}
|
|
||||||
if ($existing -ne $null) {
|
|
||||||
if ($existing -is [System.Collections.IDictionary]) {
|
|
||||||
foreach ($k in $existing.Keys) { $combined[$k] = $existing[$k] }
|
|
||||||
} else {
|
|
||||||
foreach ($p in $existing.PSObject.Properties) { $combined[$p.Name] = $p.Value }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Overlay/insert Cmder profiles — only add profiles that don't already exist
|
|
||||||
foreach ($k in $cmderProfiles.Keys) {
|
|
||||||
if ($combined.ContainsKey($k)) {
|
|
||||||
Write-Output "- Skipping existing profile '$k'!"
|
|
||||||
} else {
|
|
||||||
$combined[$k] = $cmderProfiles[$k]
|
|
||||||
Write-Output "- Adding missing profile '$k'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create an ordered hashtable with keys sorted alphabetically
|
|
||||||
$ordered = [ordered]@{}
|
|
||||||
foreach ($k in ($combined.Keys | Sort-Object)) { $ordered[$k] = $combined[$k] }
|
|
||||||
|
|
||||||
# Remove any existing literal property with the dotted name, then re-add as a note property
|
|
||||||
if ($target.PSObject.Properties.Name -contains $propName) {
|
|
||||||
$target.PSObject.Properties.Remove($propName)
|
|
||||||
}
|
|
||||||
$target | Add-Member -NotePropertyName $propName -NotePropertyValue $ordered -Force
|
|
||||||
|
|
||||||
# If a default profile was requested and exists in the ordered set, set the default profile
|
|
||||||
if ($DefaultProfile) {
|
|
||||||
$defaultPropName = 'terminal.integrated.defaultProfile.windows'
|
|
||||||
if ($ordered.Keys -contains $DefaultProfile) {
|
|
||||||
if ($target.$defaultPropName -ne $DefaultProfile) {
|
|
||||||
if ($target.PSObject.Properties.Name -contains $defaultPropName) { $target.PSObject.Properties.Remove($defaultPropName) }
|
|
||||||
$target | Add-Member -NotePropertyName $defaultPropName -NotePropertyValue $DefaultProfile -Force
|
|
||||||
Write-Output "- Setting default profile to '$DefaultProfile'"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Output "- '$DefaultProfile' is already set as the default, no change needed."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Output "- Default profile '$DefaultProfile' not found in profiles list, skipping default profile set."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($VSCode -and -not $SettingsJsonPath) {
|
|
||||||
# If the user didn't provide a path, try to discover a VS Code `settings.json` under %APPDATA% and common roots
|
|
||||||
if (-not $SettingsJsonPath) {
|
|
||||||
$candidates = @()
|
|
||||||
$roots = @()
|
|
||||||
if ($env:APPDATA) { $roots += $env:APPDATA }
|
|
||||||
if ($env:LOCALAPPDATA) { $roots += $env:LOCALAPPDATA }
|
|
||||||
if ($env:USERPROFILE) { $roots += $env:USERPROFILE }
|
|
||||||
if ($env:ProgramFiles) { $roots += $env:ProgramFiles }
|
|
||||||
if (${env:ProgramFiles(x86)}) { $roots += ${env:ProgramFiles(x86)} }
|
|
||||||
|
|
||||||
foreach ($root in $roots | Select-Object -Unique) {
|
|
||||||
if (-not (Test-Path $root)) { continue }
|
|
||||||
try {
|
|
||||||
$found = Get-ChildItem -Path $root -Recurse -Filter settings.json -ErrorAction SilentlyContinue -Force
|
|
||||||
if ($found) { $candidates += $found }
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
|
|
||||||
$candidate = $candidates | Where-Object {
|
|
||||||
$_.FullName -match '\\User\\settings.json$' -and (
|
|
||||||
$_.FullName -match '\\Code( | - |\\)' -or
|
|
||||||
$_.FullName -match '\\data\\' -or
|
|
||||||
$_.FullName -match 'vscode' -or
|
|
||||||
$_.FullName -match 'Code -'
|
|
||||||
)
|
|
||||||
} | Select-Object -First 1
|
|
||||||
|
|
||||||
if (-not $candidate) {
|
|
||||||
$common = @(
|
|
||||||
Join-Path $env:APPDATA 'Code\\User\\settings.json',
|
|
||||||
Join-Path $env:APPDATA 'Code - Insiders\\User\\settings.json',
|
|
||||||
Join-Path $env:APPDATA 'Code - OSS\\User\\settings.json'
|
|
||||||
)
|
|
||||||
foreach ($p in $common) { if (Test-Path $p) { $candidate = Get-Item $p; break } }
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($candidate) {
|
|
||||||
$SettingsJsonPath = $candidate.FullName
|
|
||||||
} else {
|
|
||||||
Write-Error "Could not discover a VS Code 'settings.json' (installed or portable). Provide -SettingsJsonPath explicitly."
|
|
||||||
exit 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$SettingsJsonPath = (Resolve-Path -LiteralPath $SettingsJsonPath).ProviderPath
|
|
||||||
}
|
|
||||||
|
|
||||||
$CmderRoot = (Resolve-Path -LiteralPath $CmderRoot)
|
|
||||||
|
|
||||||
Write-Output "Configuration Summary:`n"
|
|
||||||
|
|
||||||
if ($VSCode) {
|
|
||||||
Write-Output "Add Missing VS Code Terminal Profiles: $SettingsJsonPath"
|
|
||||||
|
|
||||||
if ($DefaultProfile) {
|
|
||||||
Write-Output "Set Default VS Code Terminal Profile: $DefaultProfile"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($SetRootEnv) {
|
|
||||||
Write-Output "Add CMDER_ROOT environment variable: Yes (if not already present)"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($PrependPath) {
|
|
||||||
Write-Output "Prepend CMDER_ROOT to User Path: Yes (if not already present)"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-not $Confirm) {
|
|
||||||
# Prompt the user in the terminal (Read-Host) before making changes — default: No
|
|
||||||
$prompt = "`nDo you want to continue? [y/N]"
|
|
||||||
$answer = Read-Host -Prompt $prompt
|
|
||||||
if (-not $answer) { $answer = 'N' }
|
|
||||||
if ($answer.ToLower() -notin @('y','yes')) {
|
|
||||||
Write-Output "Cmder System Integration cancelled by user input. No changes were made."
|
|
||||||
exit 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($SetRootEnv) {
|
|
||||||
Write-Output "`nEnvironment Changes:`n"
|
|
||||||
|
|
||||||
# Set user environment variable CMDER_ROOT if not already set in the registry.
|
|
||||||
$didSet = $false
|
|
||||||
$regPath = 'HKCU:\Environment'
|
|
||||||
$regVal = $null
|
|
||||||
$prop = Get-ItemProperty -Path $regPath -ErrorAction SilentlyContinue
|
|
||||||
if ($prop -ne $null -and $prop.PSObject.Properties.Name -contains 'CMDER_ROOT') { $regVal = $prop.CMDER_ROOT }
|
|
||||||
if ([string]::IsNullOrEmpty($regVal)) {
|
|
||||||
Write-Output "- No CMDER_ROOT found in registry; will write HKCU:\Environment\CMDER_ROOT -> $CmderRoot"
|
|
||||||
[Environment]::SetEnvironmentVariable('CMDER_ROOT', $CmderRoot, 'User')
|
|
||||||
$didSet = $true
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Output "- User environment variable 'CMDER_ROOT' already exists in registry with value '$regVal', skipping set."
|
|
||||||
}
|
|
||||||
|
|
||||||
$env:CMDER_ROOT = $CmderRoot
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($PrependPath) {
|
|
||||||
write-Output "`nPath Changes:`n"
|
|
||||||
# Prepend $ENV:CMDER_ROOT to the current users Path variable if not already present
|
|
||||||
if ((get-command 'cmder.exe' -ErrorAction SilentlyContinue) -eq $null) {
|
|
||||||
Write-Output "- 'cmder.exe' not found in current PATH, checking registry user Path variable..."
|
|
||||||
$pathVal = $null
|
|
||||||
if ($prop -ne $null -and $prop.PSObject.Properties.Name -contains 'Path') { $pathVal = $prop.Path }
|
|
||||||
if ($pathVal -ne $null -and -not ($pathVal.Split(';') -contains $env:CMDER_ROOT)) {
|
|
||||||
Write-Output "- Prepending '$env:CMDER_ROOT' to user Path environment variable in registry."
|
|
||||||
$newPath = "$env:CMDER_ROOT;$pathVal"
|
|
||||||
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$CmderPath = (Get-Command 'cmder.exe' -ErrorAction SilentlyContinue).Source
|
|
||||||
Write-Output "- 'cmder.exe' found in current PATH at '$CmderPath', skipping Path modification."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($VSCode) {
|
|
||||||
$cmderProfiles = @{}
|
|
||||||
|
|
||||||
if (($DefaultProfile -eq 'Cmder - Cmd') -or $VSCode) {
|
|
||||||
$cmderProfiles['Cmder - Cmd'] = @{
|
|
||||||
name = 'Cmder - Cmd'
|
|
||||||
path = @('${env:windir}\Sysnative\cmd.exe','${env:windir}\System32\cmd.exe')
|
|
||||||
args = @('/k','${env:cmder_root}\vendor\bin\vscode_init.cmd')
|
|
||||||
icon = 'terminal-cmd'
|
|
||||||
color = 'terminal.ansiGreen'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($DefaultProfile -eq 'Cmder - PowerShell') -or $VSCode) {
|
|
||||||
$cmderProfiles['Cmder - PowerShell'] = @{
|
|
||||||
name = 'Cmder - PowerShell'
|
|
||||||
source = 'PowerShell'
|
|
||||||
args = @('-ExecutionPolicy','Bypass','-NoLogo','-NoProfile','-NoExit','-Command','Invoke-Expression ''. ''''${env:CMDER_ROOT}\vendor\profile.ps1''''''')
|
|
||||||
icon = 'terminal-powershell'
|
|
||||||
color = 'terminal.ansiYellow'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($DefaultProfile -eq 'Cmder - Bash') -or $VSCode) {
|
|
||||||
$cmderProfiles['Cmder - Bash'] = @{
|
|
||||||
name = 'Cmder - Bash'
|
|
||||||
path = @('${env:windir}\Sysnative\cmd.exe','${env:windir}\System32\cmd.exe')
|
|
||||||
args = @('/k','${env:cmder_root}\vendor\start_git_bash.cmd')
|
|
||||||
icon = 'terminal-bash'
|
|
||||||
color = 'terminal.ansiBlue'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Output "`nProfile Changes:`n"
|
|
||||||
Write-Output "Reading '$SettingsJsonPath'...`n"
|
|
||||||
$raw = Get-Content -Raw -Path $SettingsJsonPath -ErrorAction Stop
|
|
||||||
try {
|
|
||||||
$json = $raw | ConvertFrom-Json -ErrorAction Stop
|
|
||||||
} catch {
|
|
||||||
Write-Error "Failed to parse JSON in $($SettingsJsonPath): $_"
|
|
||||||
exit 3
|
|
||||||
}
|
|
||||||
|
|
||||||
# Normalized copy of original JSON for change detection
|
|
||||||
$originalNormalized = $json | ConvertTo-Json -Depth 10
|
|
||||||
|
|
||||||
# Write-Output "Preparing to merge Cmder profiles into settings"
|
|
||||||
$propName = 'terminal.integrated.profiles.windows'
|
|
||||||
|
|
||||||
if ($json -is [System.Array]) {
|
|
||||||
foreach ($item in $json) { Merge-ProfilesToObject $item }
|
|
||||||
} else {
|
|
||||||
Merge-ProfilesToObject $json
|
|
||||||
}
|
|
||||||
|
|
||||||
# Compare normalized JSON and only back up / write if changes occurred
|
|
||||||
$newNormalized = $json | ConvertTo-Json -Depth 10
|
|
||||||
if ($originalNormalized -ne $newNormalized) {
|
|
||||||
$timestamp = (Get-Date).ToString('yyyyMMdd-HHmmss')
|
|
||||||
$backup = "$SettingsJsonPath.$timestamp.backup"
|
|
||||||
Write-Output "- Backing up 'settings.json' to '$backup' before applying changes..."
|
|
||||||
Copy-Item -Path $SettingsJsonPath -Destination $backup -Force
|
|
||||||
|
|
||||||
$pretty = $json | ConvertTo-Json -Depth 10
|
|
||||||
[System.IO.File]::WriteAllText($SettingsJsonPath, $pretty, [System.Text.Encoding]::UTF8)
|
|
||||||
Write-Output "- Backed up original to $backup"
|
|
||||||
Write-Output "- Added Cmder profiles into property '$propName' in $SettingsJsonPath"
|
|
||||||
Write-Output "`nApplied changes to '$SettingsJsonPath'..."
|
|
||||||
} else {
|
|
||||||
Write-Output "`nAll VS Code terminal profiles are already configured in '$SettingsJsonPath'. No changes were made."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3
vendor/bin/setup-cmder.cmd
vendored
3
vendor/bin/setup-cmder.cmd
vendored
@@ -1,3 +0,0 @@
|
|||||||
@echo off
|
|
||||||
|
|
||||||
powershell -NoProfile -ExecutionPolicy Bypass -File "%~n0.ps1" %*
|
|
||||||
4
vendor/bin/setup-cmder.sh
vendored
4
vendor/bin/setup-cmder.sh
vendored
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
powershell -NoProfile -ExecutionPolicy Bypass -File "$SCRIPT_DIR/${0%.*}.ps1" "$@"
|
|
||||||
Reference in New Issue
Block a user